Ich habe ein Linux-Kernelmodul, das ich dynamisch kompiliert habe. Wie wird es zum Start hinzugefügt? Es sind viele .ko
Dateien in /lib/modules
. Wie wird die Priorität für das Laden dieser Module festgelegt?
Ich habe ein Linux-Kernelmodul, das ich dynamisch kompiliert habe. Wie wird es zum Start hinzugefügt? Es sind viele .ko
Dateien in /lib/modules
. Wie wird die Priorität für das Laden dieser Module festgelegt?
Antworten:
Sie werden beim Start oder zu einem anderen Zeitpunkt nicht automatisch geladen, obwohl viele von ihnen beim Booten geladen werden. Es gibt drei verschiedene Mechanismen, durch die dies geschieht:
Userspace-Anfrage: Diese umfasst alles von Init-Diensten über udev bis hin zur Befehlszeile. Init oder udev sind wahrscheinlich das einfachste Mittel, wenn Sie ein bestimmtes Modul beim Booten laden möchten.
Hotplugged-Gerät: Wenn Sie etwas an z. B. USB oder PCI anschließen, erkennt der Kernel dies und fordert ein geeignetes Modul an, basierend darauf, wie sich das Gerät identifiziert.
Erforderliches Protokoll oder eine andere Implementierung : Wenn der Kernel etwas tun muss, z. B. ein Dateisystem lesen, und feststellt, dass ihm das entsprechende Wissen fehlt, fordert er ein Modul an.
Beachten Sie, dass ich in den letzten beiden Fällen den Ausdruck "Modul anfordern" verwendet habe. Dies liegt daran, dass der Kernel tatsächlich über einen Userspace-Daemon geladen wird, kmod
der ausgeführt wird /sbin/modprobe
. Laut Wolfgang Mauerer in der Linux-Kernel-Architektur gibt es im 2.6-Kernel nur ~ 100 verschiedene Punkte, an denen eine interne request_module()
Funktion aufgerufen wird.
modprobe
verwendet eine Datenbank mit installierten MODULE_ALIAS. Diese werden im Quellcode des Moduls explizit angegeben oder von MODULE_DEVICE_TABLE abgeleitet, einer Liste der OEM-Geräte-IDs, die das Modul bedient.
Viele Systeme sind für die Verwendung von initrd oder initramfs eingerichtet . Hierbei handelt es sich um Dateisystem-Images, die vom Bootloader geladen und dem Kernel zur Verfügung gestellt werden, bevor die Root-Partition bereitgestellt wird. Auf diese Weise können Treiber, die zum Mounten der Root-Partition erforderlich sind (Festplattentreiber, Dateisystemtreiber, Gerätezuordnungstreiber oder Treiber für logische Datenträger usw.), als Module kompiliert und aus initrd / initramfs geladen werden.
Die Startskripte auf initrd ( /linuxrc
) oder initramfs ( /init
) laden normalerweise einige Module und suchen das Root-Dateisystem. Jede Distribution hat ihr eigenes Setup. Ubuntu verwendet ein initramfs, das aus Komponenten im initramfs-tools
Paket zusammengesetzt und für jeden Kernel basierend auf den erforderlichen Treibern zum Mounten des Root-Dateisystems neu generiert wird.
Nach dem Mounten des Root-Dateisystems werden während des Systemstarts die unter /etc/modules
(Debian,…) oder /etc/modules.conf
(Red Hat, Arch,…) aufgeführten Module geladen. Diese Datei listet normalerweise nur wenige Module auf, falls vorhanden. Die meisten Module werden bei Bedarf geladen.
Wenn der Kernel Hardware erkennt, für die ihm ein Treiber fehlt, oder bestimmte andere Komponenten wie Netzwerkprotokolle oder kryptografische Algorithmen, ruft er /sbin/modprobe
zum Laden des Moduls auf. Bei Hardwaretreibern übergibt der Kernel Namen, die die PCI-ID, die USB-ID oder eine andere systematische Bezeichnung der Hardware codieren. In /lib/modules/$VERSION/modules.alias
dieser Tabelle sind diese systematischen Bezeichnungen Modulnamen zugeordnet. Diese Tabelle wird von generiert depmod
und von gelesen modprobe
.
Wenn Sie ein zusätzliches Kernelmodul haben, das Sie manuell für ein Hardwaregerät kompiliert haben, legen Sie es ab /lib/modules/$VERSION/local
(erstellen Sie das local
Unterverzeichnis, falls es nicht vorhanden ist) und führen Sie es aus depmod -a
, um die Aliasdatenbank neu zu generieren. Wenn das Modul eine ungewöhnliche Funktion enthält, die der Kernel nicht automatisch erkennen kann, legen Sie es ab /lib/modules/$VERSION/local
, führen Sie es aus depmod -a
, um seine Abhängigkeiten zu analysieren, und fügen Sie den Modulnamen hinzu /etc/modules
.
/lib/modules/…
. Erstellen Sie einfach das local
Unterverzeichnis ( depmod
durchläuft /lib/module/$VERSION
rekursiv).
/var/lib/modules
noch ein finden/lib/modules/*/local
, noch kann ich dies bei Google oder in derdepmod
Manpage erwähnen . Sah in CentOS 6.4, 7.4 und Ubuntu 19.04.