Wie (Rezept) baue ich nur ein Kernelmodul?

35

Ich habe einen Fehler in einem Linux-Kernel-Modul, der dazu führt, dass der Ubuntu 14.04-Kernel abstürzt.

Aus diesem Grund möchte ich nur die Quelle dieses einzelnen Kernel-Moduls bearbeiten / patchen , um zusätzliche Debug-Ausgaben hinzuzufügen. Das betreffende Kernelmodul ist zum Booten nicht erforderlich. Aus diesem Grund sehe ich keine Notwendigkeit, irgendwelche initrd-Images zu aktualisieren.mvsas

Ich habe eine Menge Informationen gelesen (siehe unten) und finde das Setup und den Build-Prozess verwirrend. Ich brauche zwei Rezepte:

  1. zum einmaligen Einrichten / Konfigurieren der Build-Umgebung
  2. Schritte nach dem Bearbeiten einer Quelldatei dieses Kernelmoduls ( .cund .h) und dem Konvertieren dieser Datei in ein neues Kernelmodul ( .ko)

Die Quellen, die verwendet wurden, sind:

Pro Backup
quelle
Mögliches Duplikat von Wie erstelle ich ein einzelnes In-Tree-Kernel-Modul?
Ciro Santilli新疆改造中心法轮功六四事件
Vielleicht hilft auch dieser Artikel: stackoverflow.com/questions/8744087/…
Oleg Kokorin

Antworten:

33

Das Rezept zum Erstellen eines benutzerdefinierten Moduls muss möglicherweise in drei Abschnitte unterteilt werden.

Einmal einrichten

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

Ich bin zu faul, um die mvsas-spezifischen Treiberquelldateien zu kopieren. Kopieren Sie sie einfach in Ihr aktuelles Arbeitsverzeichnis. Wenn apt-geteine Fehlermeldung über fehlende Quell-URIs angezeigt wird, lesen Sie den Hinweis 4 unten.

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

Dadurch werden einige Dateien vorbereitet, die zum Erstellen eines Kernelmoduls erforderlich sind.

Jede Kernelversion

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

Dadurch werden die Header und die Ubuntu-Kernelkonfigurationsdatei für diese Kernelversion in / lib / modules installiert.

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

Dies verhindert, dass beim Laden des Moduls mit insmod oder modprobe die Meldung " Keine Symbolversion für module_layout " angezeigt wird.

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

Dadurch wird das ursprüngliche Kernel-Modul (Ubuntu Build) umbenannt, um sicherzustellen, dass das benutzerdefinierte gepatchte Modul geladen wird.

Jede Bearbeitung

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

Diese sind für die Bearbeitungen.

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

Dies kompiliert und erstellt die Kernel-Moduldatei unter .koVerwendung der Kernel-Konfiguration aus Ihrer Ubuntu-Distribution, wie sie in gespeichert ist /lib/modules/$(uname -r)/.

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

Dadurch wird das Kernelmodul installiert und das /lib/modules/$(uname -r)/extra/Verteilungsmodul nicht überschrieben, falls Sie die Datei des Verteilungskernelmoduls nicht umbenannt haben. In diesem Fall wird auch depmod ausgeführt .

$ lsmod | grep mvsas

Wenn dies zu einer Ausgabe führt, muss das mvsas-Modul zuerst mit ( modprobe -r mvsas) entladen werden .

$ sudo modprobe -v mvsas

Dies sollte das neue Kernelmodul laden.

Überprüfen Sie die Ausgabe, um sicherzustellen, /lib/modules/.../extra/mvsas.kodass geladen wird.

Modprobe-Fehler: konnte nicht eingefügt werden

In einigen Fällen kann es vorkommen, dass Sie modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg)in der ausführlichen Ausgabe von modprobe eine Weile feststellen, dass insmodversucht wird, das Modul vom Standardspeicherort des Kernels zu laden. Beispielsweise:

# 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)

In diesem Fall müssen Sie depmod manuell ausführen und versuchen, das Modul erneut zu laden:

# depmod
# sudo modprobe -v mvsas

Anmerkungen

  1. Es kann vorkommen, dass die resultierenden .koModuldateien viel (zum Beispiel 20-mal) größer sind als die Original-Moduldateien, wie sie von Ubuntu vertrieben werden. In diesem Fall hätte der make prepareSchritt eine Debugging-Kernel-Konfigurationsdatei für Linux-Entwickler erstellen können, und Sie erstellen aus dem Quellverzeichnis. Ihr -CParameter funktioniert möglicherweise nicht wie erwartet.
  2. Ich habe Anleitungen mit anderen Befehlen wie gesehen make modules_prepareund make M=scripts/modglaube nicht, dass diese für diesen Fall notwendig sind.
  3. Sie können die Debug - Linux - Entwickler config durch Ersetzen -C /lib/modules/$(uname -r)/buildmit-C /usr/src/linux-headers-$(uname -r)
  4. In einer Standardeinstellung apt-get source linux-sourceswird ein Fehler zurückgegeben E: You must put some 'source' URIs in your sources.list. Um dieses Problem zu beheben, können Sie die Datei ändern, /etc/apt/sources.listindem Sie #die erste deb-srcZeile aus dem Kommentar entfernen . Beispiel für Ubuntu 17.10: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted. Führen Sie sudo apt-get updateden Befehl aus, und der Befehl liefert Quellen für Sie. Siehe auch diese Frage, in der auch eine GUI-Methode dafür beschrieben ist.
Pro Backup
quelle
Ich habe Fehler: / bin / sh: Arm-keine-Linux-Gnueabi-gcc: nicht gefunden
Dr.jacky
$(uname-r)ist anscheinend falsch ... Sie müssen die shelleingebaute anrufen :$(shell uname -r)
Albus Dumbledore
2
@AlbusDumbledore Ich sehe auch Fälle, in denen $(shell uname -r)nicht funktioniert . Warum ist $(uname -r)das anscheinend so falsch?
Pro Backup
Ich musste auch anrufen, echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.confdamit depmoddie neu aktualisierte Datei angezeigt wird .../extra.
Martin Pecka
1
Was tun bei Modul-Signierfehlern, wie vermeide ich diese? `` `INSTALLIEREN /home/envek/linux-4.10.0/drivers/hwmon/dell-smm-hwmon.ko Am main.c: 158: - SSL-Fehler: 02001002: Systembibliothek: fopen: Keine solche Datei oder Verzeichnis: bss_file.c: 175 - SSL-Fehler: 2006D080: BIO-Routinen: BIO_new_file: keine solche Datei: bss_file.c: 178 sign-file: certs / signing_key.pem: Keine solche Datei oder solches Verzeichnis `` `
Envek