Nasıl (tarifi) sadece bir çekirdek modülü oluşturmak için?


34

Bir Linux çekirdek modülünde Ubuntu 14.04 çekirdeğinin stoklara (çökmesine) neden olan bir hata var.

Bu yüzden , bazı ekstra hata ayıklama çıktıları eklemek için yalnızca bu çekirdek modülünün kaynağını düzenlemek / yamalamak istiyorum . Söz konusu çekirdek modülü önyükleme için gerekli değildir. Bu nedenle, herhangi bir initrd görüntüsünü güncellemeye gerek duymuyorum.mvsas

Çok fazla bilgi okudum (aşağıda gösterildiği gibi) ve kurulum ve yapım süreci karışıklığını buldum. İki tarife ihtiyacım var:

  1. yapı ortamını bir kez ayarlamak / yapılandırmak
  2. bu çekirdek modülünün ( .cve .h) herhangi bir kaynak dosyasını düzenledikten ve bu düzenlemeyi yeni bir çekirdek modülüne ( .ko) dönüştürdükten sonra yapılması gerekenler

Kullanılan kaynaklar:



belki bu makale de yardımcı olacaktır: stackoverflow.com/questions/8744087/…
Oleg Kokorin

Yanıtlar:


32

Özel bir modül oluşturma tarifinin üç bölüme ayrılması gerekebilir.

Bir kez kur

$ cd ~
$ apt-get source linux-source-3.13.0 

Mvsas belirli sürücü kaynak dosyalarını kopyalamak için çok tembelim; hepsini geçerli çalışma dizininize kopyalamanız yeterli. Eksik kaynak URI'larapt-get hakkında bir hata mesajı verilirse , alttaki not 4'e bakınız.

$ cd linux-3.13.0
$ make oldconfig
$ make prepare
$ make scripts

Bu, bir çekirdek modülü oluşturmak için gerekli bazı dosyaları hazırlayacaktır.

Her bir çekirdek sürümü

$ apt-get install linux-headers-$(uname -r)

Bu, / lib / module içindeki o çekirdek sürümü için başlıkları ve Ubuntu çekirdek yapılandırma dosyasını yükleyecektir.

$ cd ~/linux-3.13.0
$ cp -v /usr/src/linux-headers-$(uname -r)/Module.symvers .

Bu , modülü insmod veya modprobe ile yüklerken " module_layout için sembol versiyonu yok " mesajını önlemek içindir .

$ mv -v /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko.backup

Bu, özel yamalı olanın yükleneceğinden emin olmak için orijinal (Ubuntu build) çekirdek modülünü yeniden adlandırır.

Her düzenleme

$ cd ~/linux-3.13.0/drivers/scsi/mvsas
$ nano mv_sas.h
$ nano mv_sas.c

Bunlar düzenlemeler için.

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

Bu, .kodepolanan Ubuntu dağıtımındaki çekirdek yapılandırmasını kullanarak çekirdek modül dosyasını derleyecek ve derleyecektir /lib/modules/$(uname -r)/.

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

Bu, çekirdek çekirdek modülünü /lib/modules/$(uname -r)/extra/yükleyerek çekirdek çekirdek modül dosyasını yeniden adlandırmamanız durumunda , çekirdek modülün üzerine yazmaz. Bu mvsas durumunda da depmod çalışacak .

$ lsmod | grep mvsas

Bu herhangi bir çıktı ile sonuçlanırsa, mvsas modülünün modprobe -r mvsasönce ( ) ile boşaltılması gerekir .

$ sudo modprobe -v mvsas

Bu yeni çekirdek modülünü yüklemelidir.

/lib/modules/.../extra/mvsas.koYüklendiğini doğrulamak için çıkışı kontrol edin .

Modprobe hatası: eklenemedi

Bazı durumlarda modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg), ayrıntılı modprobe çıktısında insmod, modülü çekirdek varsayılan konumundan yüklemeye çalıştığını gördüğünüz bir süre yaşayabilirsiniz . Örneğin:

# insmod /lib/modules/3.17.0-031700rc7-generic/kernel/drivers/scsi/pm8001/pm80xx.ko
modprobe: ERROR: could not insert 'pm80xx': Unknown symbol in module, or unknown parameter (see dmesg)

Bu durumda depmod'u manuel olarak çalıştırmanız ve modülü tekrar yüklemeyi denemeniz gerekir:

# depmod
# sudo modprobe -v mvsas

notlar

  1. Elde edilen .komodül dosyalarının Ubuntu tarafından dağıtılan orijinal modül dosyalarından çok daha büyük (örneğin 20 kat) büyüklükleri olabilir; Bu durumda, make prepareadım, çekirdek konfigürasyon dosyasında hata ayıklama yapan bir Linux geliştiricisi yaratmış olabilir ve kaynak dizinden oluşturuyorsunuz. Kişisel -Cparam olarak beklenen çalışmayabilir.
  2. Ben gibi diğer komutlarla kılavuzları gördük make modules_prepareve make M=scripts/modancak bunlar bu durumda gerekli olduğunu sanmıyorum.
  3. Sen değiştirerek Linux geliştiricileri ayıklama yapılandırma kullanabilirsiniz -C /lib/modules/$(uname -r)/buildile-C /usr/src/linux-headers-$(uname -r)
  4. Varsayılan ayarlarda apt-get source linux-sourceshata döndürür E: You must put some 'source' URIs in your sources.list. Bu sorunu /etc/apt/sources.listgidermek için #, ilk deb-srcsatırdaki açıklamadan (satır başını kaldırarak) dosyayı değiştirebilirsiniz . Ubuntu 17.10 için örnek: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted. çalıştırın sudo apt-get updateve sonra komut sizin için kaynakları sunacak. Ayrıca bunu yapmak için bir GUI yönteminin de tanımlandığı bu soruya bakınız .

Hata aldım: / bin / sh: arm-none-linux -gnueabi-gcc: bulunamadı
Dr.jacky 16:15

$(uname-r)görünüşe göre yanlış ... shell$(shell uname -r)
Yerleşik

2
@AlbusDumbledore Ayrıca çalışmayan durumlarda$(shell uname -r) da görüyorum . Neden bu $(uname -r)kadar görünüşte yanlış?
Pro Yedekleme

Ben de aramak zorunda echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.confböylece depmodde yeni güncellenmiş dosyayı görür .../extra.
Martin Pecka

1
Modül imzalama hatası ne yapmalı, nasıl önlenmeli? `` `INSTALL /home/envek/linux-4.10.0/drivers/hwmon/dell-smm-hwmon.ko Main.c: 158: - SSL hatası: 02001002: sistem kütüphanesi: fopen: Böyle bir dosya veya dizin yok: bss_file.c: 175 - SSL hatası: 2006D080: BIO yordamları: BIO_new_file: böyle bir dosya yok: bss_file.c: 178 imza dosyası: certs / signing_key.pem: `` ``
Envek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.