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:
- zum einmaligen Einrichten / Konfigurieren der Build-Umgebung
- Schritte nach dem Bearbeiten einer Quelldatei dieses Kernelmoduls (
.c
und.h
) und dem Konvertieren dieser Datei in ein neues Kernelmodul (.ko
)
Die Quellen, die verwendet wurden, sind:
- Erstellen Sie ein Kernel-Modul - Google-Suche
- http://www.linuxquestions.org/questions/linux-kernel-70/rebuilding-a-single-kernel-module-595116/
- https://stackoverflow.com/questions/8744087/how-to-recompile-just-a-single-kernel-module
- http://www.pixelbeat.org/docs/rebuild_kernel_module.html
- Wie erstelle ich ein einzelnes In-Tree-Kernel-Modul?
- http://ubuntuforums.org/showthread.php?t=1153067
- http://ubuntuforums.org/showthread.php?t=2112166
- http://ubuntuforums.org/showthread.php?t=1115593
- erstelle ein Kernelmodul ubuntu - Google-Suche
- 'make + single + kernel + module' - Fragen Sie Ubuntu
- 'make + kernel + module' - Fragen Sie Ubuntu
- Mein Makefile führt zu: Keine Regel zum Erstellen des Ziels "arch / x86 / tools / relocs.c" erforderlich
- '"Ungültiges Modulformat"' - Fragen Sie Ubuntu
- Treiberinstallation: Kompilieren des Quellcodes für einen neueren Kernel
- Modprobe: 'Ungültiges Knotenformat', funktioniert jedoch nach insmod
- "Symbol Version Dump" "fehlt" - Google-Suche
- https://stackoverflow.com/questions/9425523/should-i-care-that-the-symbol-version-dump-is-missing-how-do-i-get-one
- https://askubuntu.com/questions/369051/where-can-i-find-the-corresponding-module-symvers-and-config-files-for-ubutunu
- "Keine Symbolversion für module_layout" beim Versuch, usbhid.ko zu laden
- Unterbrochene Links im Linux-Header-Dateiordner
- 'make modules_install' - Fragen Sie Ubuntu
- 'modules_install' - Fragen Sie Ubuntu
- Leeres Erstellungsverzeichnis im benutzerdefinierten kompilierten Kernel
- https://askubuntu.com/questions/444345/not-able-to-see-pr-info-output
- https://askubuntu.com/questions/472496/inwhich-directory-are-the-kernel-source-files-and-how-can-i-recompile-it
- Wie kann ich diese gepatchte libata-eh.c-Datei kompilieren und installieren?
- 'modules_install + depmod' - Fragen Sie Ubuntu
- modules_install depmod - Google-Suche
- "make modules_install" - Google-Suche
- http://www.csee.umbc.edu/courses/undergraduate/CMSC421/fall02/burt/projects/howto_build_kernel.html
- https://unix.stackexchange.com/questions/20864/was-in-jedem-schritt-des-linux-kern-building-prozesses-passiert
- https://wiki.ubuntu.com/KernelCustomBuild
- http://www.cyberciti.biz/tips/build-linux-kernel-module-against-installed-kernel-source-tree.html
- http://www.linuxforums.org/forum/kernel/170617-solved-make-modules_install-different-path.html
- "make prepare" - Google-Suche
- "make prepare" "scripts / kconfig / conf --silentoldconfig Kconfig" - Google-Suche
- http://ubuntuforums.org/showthread.php?t=1963515
- ubuntu "make prepare" version - Google-Suche
- https://stackoverflow.com/questions/8276245/wie-zum-kompilieren-der-kernel-modul-gegen-eine-neue-Quelle
- https://help.ubuntu.com/community/Kernel/Compile
- Wie kompiliere ich ein Kernelmodul?
- Wie füge ich meinem Kernel einen benutzerdefinierten Treiber hinzu?
- https://askubuntu.com/questions/426549/compile-and-loading-kernel-module-without-compiling-the-kernel
Antworten:
Das Rezept zum Erstellen eines benutzerdefinierten Moduls muss möglicherweise in drei Abschnitte unterteilt werden.
Einmal einrichten
Ich bin zu faul, um die mvsas-spezifischen Treiberquelldateien zu kopieren. Kopieren Sie sie einfach in Ihr aktuelles Arbeitsverzeichnis. Wenn
apt-get
eine Fehlermeldung über fehlende Quell-URIs angezeigt wird, lesen Sie den Hinweis 4 unten.Dadurch werden einige Dateien vorbereitet, die zum Erstellen eines Kernelmoduls erforderlich sind.
Jede Kernelversion
Dadurch werden die Header und die Ubuntu-Kernelkonfigurationsdatei für diese Kernelversion in / lib / modules installiert.
Dies verhindert, dass beim Laden des Moduls mit insmod oder modprobe die Meldung " Keine Symbolversion für module_layout " angezeigt wird.
Dadurch wird das ursprüngliche Kernel-Modul (Ubuntu Build) umbenannt, um sicherzustellen, dass das benutzerdefinierte gepatchte Modul geladen wird.
Jede Bearbeitung
Diese sind für die Bearbeitungen.
Dies kompiliert und erstellt die Kernel-Moduldatei unter
.ko
Verwendung der Kernel-Konfiguration aus Ihrer Ubuntu-Distribution, wie sie in gespeichert ist/lib/modules/$(uname -r)/
.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 .Wenn dies zu einer Ausgabe führt, muss das mvsas-Modul zuerst mit (
modprobe -r mvsas
) entladen werden .Dies sollte das neue Kernelmodul laden.
Überprüfen Sie die Ausgabe, um sicherzustellen,
/lib/modules/.../extra/mvsas.ko
dass 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, dassinsmod
versucht wird, das Modul vom Standardspeicherort des Kernels zu laden. Beispielsweise:In diesem Fall müssen Sie depmod manuell ausführen und versuchen, das Modul erneut zu laden:
Anmerkungen
.ko
Moduldateien viel (zum Beispiel 20-mal) größer sind als die Original-Moduldateien, wie sie von Ubuntu vertrieben werden. In diesem Fall hätte dermake prepare
Schritt eine Debugging-Kernel-Konfigurationsdatei für Linux-Entwickler erstellen können, und Sie erstellen aus dem Quellverzeichnis. Ihr-C
Parameter funktioniert möglicherweise nicht wie erwartet.make modules_prepare
undmake M=scripts/mod
glaube nicht, dass diese für diesen Fall notwendig sind.-C /lib/modules/$(uname -r)/build
mit-C /usr/src/linux-headers-$(uname -r)
apt-get source linux-sources
wird ein Fehler zurückgegebenE: You must put some 'source' URIs in your sources.list
. Um dieses Problem zu beheben, können Sie die Datei ändern,/etc/apt/sources.list
indem Sie#
die erstedeb-src
Zeile aus dem Kommentar entfernen . Beispiel für Ubuntu 17.10:deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted
. Führen Siesudo apt-get update
den Befehl aus, und der Befehl liefert Quellen für Sie. Siehe auch diese Frage, in der auch eine GUI-Methode dafür beschrieben ist.quelle
$(uname-r)
ist anscheinend falsch ... Sie müssen dieshell
eingebaute anrufen :$(shell uname -r)
$(shell uname -r)
nicht funktioniert . Warum ist$(uname -r)
das anscheinend so falsch?echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.conf
damitdepmod
die neu aktualisierte Datei angezeigt wird.../extra
.