Wie lautet die Reihenfolge beim Laden des Linux-Kernelmoduls beim Start? Wie wird ihnen Priorität eingeräumt?

9

Ich habe ein Linux-Kernelmodul, das ich dynamisch kompiliert habe. Wie wird es zum Start hinzugefügt? Es sind viele .koDateien in /lib/modules. Wie wird die Priorität für das Laden dieser Module festgelegt?

Ganeshredcobra
quelle

Antworten:

11

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, kmodder 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.

modprobeverwendet 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.

Goldlöckchen
quelle
3

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-toolsPaket 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/modprobezum 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.aliasdieser Tabelle sind diese systematischen Bezeichnungen Modulnamen zugeordnet. Diese Tabelle wird von generiert depmodund 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 localUnterverzeichnis, 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.

Gilles 'SO - hör auf böse zu sein'
quelle
Ich kann weder ein /var/lib/modulesnoch ein finden /lib/modules/*/local, noch kann ich dies bei Google oder in der depmodManpage erwähnen . Sah in CentOS 6.4, 7.4 und Ubuntu 19.04.
Itsadok
@itsadok Ich bin mir ziemlich sicher, dass ich schreiben wollte /lib/modules/…. Erstellen Sie einfach das localUnterverzeichnis ( depmoddurchläuft /lib/module/$VERSIONrekursiv).
Gilles 'SO - hör auf böse zu sein'