Linux/Kernel/Module/Anwendung
Linux/Kernel/Module/Anwendung
Beschreibung
Kernel-Module sind Codeabschnitte, die bei Bedarf in den Kernel geladen und wieder entfernt werden können.
- Sie erweitern die Funktionalität des Kernels, ohne dass das System neu gestartet werden muss.
- Ein Modul kann als integriertes oder ladbares Modul konfiguriert werden.
- Um ein Modul dynamisch zu laden oder zu entfernen, muss es in der Kernelkonfiguration als ladbares Modul konfiguriert sein (die Zeile, die sich auf das Modul bezieht, wird dann mit dem Buchstaben M angezeigt).
Informationen zum automatischen Neuerstellen eines Kernelmoduls bei der Installation eines neuen Kernels finden Sie unter „Dynamic Kernel Module Support (DKMS)“.
Informationen abrufen
Module hängen in der Regel von der Kernel-Version ab und sind im Verzeichnis /usr/lib/modules/kernel_release/ gespeichert.
- Tipp
- Führen Sie uname -r (oder uname --kernel-release) aus, um Ihre aktuelle Kernel-Version zu ermitteln.
- Hinweis
- Modul- und Aliasnamen verwenden häufig Unterstriche (_) oder Bindestriche (-); diese Symbole sind jedoch bei Verwendung des Befehls modprobe und in Konfigurationsdateien in /etc/modprobe.d/ austauschbar (die automatische Umwandlung in Unterstriche erfolgt, siehe 8|modprobe|BESCHREIBUNG und 5|modprobe.d|BESCHREIBUNG).
So zeigen Sie an, welche Kernel-Module derzeit geladen sind
$ lsmod
Um Informationen zu einem Modul anzuzeigen
$ modinfo Modulname
Um die für ein geladenes Modul festgelegten Optionen aufzulisten, verwenden Sie systool aus sysfsutils
$ systool -v -m Modulname
Um die umfassende Konfiguration aller Module anzuzeigen
$ modprobe -c | less
Um die Konfiguration eines bestimmten Moduls anzuzeigen
$ modprobe -c | grep Modulname
Auflisten der Abhängigkeiten eines Moduls (oder Alias), einschließlich des Moduls selbst
$ modprobe --show-depends Modulname
Automatisches Laden von Modulen
Heutzutage wird das Laden aller erforderlichen Module automatisch von udev übernommen. Wenn Sie also keine Kernel-Module außerhalb des Baums verwenden müssen, müssen Sie keine Module, die beim Booten geladen werden sollen, in eine Konfigurationsdatei eintragen
- Es gibt jedoch Fälle, in denen Sie möglicherweise während des Bootvorgangs ein zusätzliches Modul laden oder ein anderes Modul auf die Blacklist setzen möchten, damit Ihr Computer ordnungsgemäß funktioniert
Frühes Laden von Modulen
Das frühe Laden von Modulen hängt vom verwendeten initramfs-Generator ab
- Hinweis
- Das initramfs-Image enthält möglicherweise nicht die in /etc/modules-load.d/ angeforderten Kernel-Module, außerdem können Dateien fehlen, die in diesem Ordner festgelegt wurden (siehe #systemd).
systemd
Kernel-Module können explizit in Dateien unter /etc/modules-load.d/ aufgeführt werden, damit systemd sie beim Booten lädt.
- Jede Konfigurationsdatei wird im Stil von /etc/modules-load.d/program.conf benannt.
- Konfigurationsdateien enthalten lediglich eine Liste der zu ladenden Kernel-Modulnamen, getrennt durch Zeilenumbrüche.
- Leere Zeilen und Zeilen, deren erstes Nicht-Leerzeichen # oder ; ist, werden ignoriert.
- /etc/modules-load.d/virtio-net.conf
# virtio_net.ko beim Booten laden
virtio_net
Weitere Informationen finden Sie unter modules-load.d.
Manuelle Modulverwaltung
Kernel-Module werden von Tools aus dem Paket kmod verwaltet, das als Abhängigkeit eines Kernel-Pakets installiert wird.
- Sie können diese Tools manuell verwenden.
- So laden Sie ein Modul:
# modprobe Modulname
- Hinweis
- Wenn Sie Ihren Kernel aktualisiert, aber noch nicht neu gestartet haben, schlägt modprobe ohne Fehlermeldung mit dem Code 1 fehl, da der Pfad /usr/lib/modules/kernel_release/ nicht mehr existiert.
- Überprüfen Sie manuell, ob dieser Pfad existiert, wenn modprobe fehlgeschlagen ist, um festzustellen, ob dies der Fall ist
Um ein Modul über einen Dateinamen zu laden, d. h.
- eines, das nicht im Verzeichnis /usr/lib/modules/kernel_release/ installiert ist, verwenden Sie einen der folgenden Befehle:
# insmod Dateiname Moduloptionen
# modprobe Dateiname
Um ein Modul zu entladen (entfernen), verwenden Sie einen der folgenden Befehle:
# rmmod Modulname
# modprobe -r Modulname
# modprobe --remove Modulname
Moduloptionen
- Moduloptionen festlegen
Um einen Parameter an ein Kernelmodul zu übergeben, können Sie ihn manuell mit modprobe übergeben oder sicherstellen, dass bestimmte Parameter immer angewendet werden, indem Sie eine modprobe-Konfigurationsdatei verwenden oder den Kernel-Befehlszeilenparameter
- Wenn das Modul in den Kernel integriert ist, muss die Kernel-Befehlszeile verwendet werden, andere Methoden funktionieren nicht.
modprobe verwenden
Die grundlegende Methode zum Übergeben von Parametern an ein Modul ist die Verwendung des Befehls modprobe
Parameter werden in der Befehlszeile mit einfachen 1=Schlüssel=Wert-Zuweisungen angegeben:
# modprobe Modulname Parametername=Parameterwert
Verwendung von modprobe.d
Konfigurationsdateien im Verzeichnis /etc/modprobe.d/ können verwendet werden, um Moduleinstellungen an udev zu übergeben, das modprobe verwendet, um das Laden der Module während des Systemstarts zu verwalten
- Dateien in diesem Verzeichnis können beliebige Namen haben, sofern sie die Erweiterung .conf haben.
- Der Dateiname ist wichtig, siehe 5|modprobe.d|KONFIGURATIONSDIREKTORIES UND PRIORITÄTEN
So zeigen Sie die effektive Konfiguration an:
$ systemd-analyze cat-config modprobe.d
- Syntax
/etc/modprobe.d/Dateiname.conf
Optionen Modulname Parametername=Parameterwert
- Hinweis
- Alle Optionen für ein bestimmtes Modul müssen in einer einzigen Zeile definiert werden.
- Eine neue Optionszeile mit demselben Modulnamen ersetzt die vorherige.
Mehrere Modulparameter werden durch Leerzeichen getrennt, ein Parameter kann wiederum eine Liste von Werten erhalten, die durch Kommas getrennt sind:
- /etc/modprobe.d/Dateiname.conf
Optionen Modulname param1=Wert1 param2=Wert2a,Wert2b …
- Beispiel
/etc/modprobe.d/thinkfan.conf
# Auf ThinkPads kann damit der Daemon „thinkfan“ die Lüftergeschwindigkeit steuern. options thinkpad_acpi fan_control=1
- Hinweis
- Wenn eines der betroffenen Module aus dem initramfs geladen wird, müssen Sie die entsprechende .conf-Datei zu FILES in mkinitcpio.conf hinzufügen oder den modconf-Hook verwenden und dann das initramfs neu generieren, um die .conf-Datei einzubinden.
Um den Inhalt des Standard-initramfs anzuzeigen, verwenden Sie lsinitcpio.
Verwendung der Kernel-Befehlszeile
Sie können Optionen auch über die Kernel-Befehlszeile an das Modul übergeben
- Dies ist die einzige funktionierende Option für Module, die in den Kernel integriert sind.
Für alle gängigen Bootloader ist die folgende Syntax korrekt:
Modulname.Parametername=Parameterwert
- Beispiel
thinkpad_acpi.fan_control=1
Fügen Sie dies einfach in die entsprechende Zeile Ihrer Bootloader-Konfiguration ein, wie unter Kernel-Parameter#Bootloader-Konfiguration beschrieben.
Aliasing
Aliase sind alternative Namen für ein Modul.
- Beispiel: alias my-mod really_long_modulename bedeutet, dass Sie modprobe my-mod anstelle von modprobe really_long_modulename verwenden können
- Sie können auch Shell-ähnliche Platzhalter verwenden, sodass alias my-mod* really_long_modulename bedeutet, dass modprobe my-mod-something denselben Effekt hat
- Erstellen Sie einen Alias
/etc/modprobe.d/myalias.conf
alias my-mod really_long_module_name
Aliase können intern sein (im Modul selbst enthalten)
- Interne Aliase werden in der Regel für das #Automatische Laden von Modulen verwendet, wenn dies von einer Anwendung benötigt wird, z. B.
- wenn der Kernel ein neues Gerät erkennt
So zeigen Sie die internen Aliase des Moduls an
$ modinfo --field=alias module_name
So zeigen Sie sowohl konfigurierte als auch interne Aliase an
$ modprobe --showconfig | grep '\<module_name$'
Blacklist
Blacklisting ist im Zusammenhang mit Kernel-Modulen ein Mechanismus, der das Laden des Kernel-Moduls verhindert
- Dies kann beispielsweise nützlich sein, wenn die zugehörige Hardware nicht benötigt wird oder wenn das Laden dieses Moduls Probleme verursacht: Es kann beispielsweise zwei Kernel-Module geben, die versuchen, dieselbe Hardware zu steuern, und deren gleichzeitiges Laden zu einem Konflikt führen würde.
- Tipp
- Verwechseln Sie den Blacklisting als Oberbegriff nicht mit der Verwendung des Schlüsselworts blacklist als Sonderfall des Blacklistings.
Einige Module werden als Teil des initramfs geladen.
- mkinitcpio -M gibt alle automatisch erkannten Module aus: Um zu verhindern, dass initramfs einige dieser Module lädt, setzen Sie sie in einer .conf-Datei unter /etc/modprobe.d auf die Blacklist, und sie werden beim Erstellen des Images durch den modconf-Hook hinzugefügt.
- Mit mkinitcpio -v werden alle Module aufgelistet, die von den verschiedenen Hooks (z. B.
- Dateisystem-Hook, Block-Hook, und weitere)
- Denken Sie daran, diese .conf-Datei zum FILES-Array in /etc/mkinitcpio.conf hinzuzufügen, wenn Sie den modconf-Hook nicht in Ihrem HOOKS-Array haben (z. B.
- Sie von der Standardkonfiguration abgewichen sind), und nachdem Sie die Module auf die Blacklist gesetzt haben, generieren Sie das initramfs neu und starten Sie anschließend neu.
Verwendung von modprobe.d
alias
Deaktivieren Sie einen alias, indem Sie ihn überschreiben.
- Um zu verhindern, dass das Bluetooth-Modul automatisch geladen wird, entfernen Sie den Modulnamen, der nicht existiert:
- /etc/modprobe.d/modprobe.conf
alias net-pf-31 off
- Hinweis
- Das Überschreiben von Aliasnamen kann das automatische Laden von Modulen verhindern, aber das Modul kann weiterhin - sowohl automatisch als auch manuell - über einen anderen Aliasnamen oder den Modulnamen geladen werden.
blacklist
Um alle internen Aliasnamen für ein bestimmtes Modul zu deaktivieren, verwenden Sie das Schlüsselwort blacklist
- Um beispielsweise zu verhindern, dass das Modul pcspkr beim Booten geladen wird und Töne über den PC-Lautsprecher ausgibt, geben Sie Folgendes ein:
- /etc/modprobe.d/nobeep.conf
blacklist pcspkr
- Hinweis
- Der Befehl blacklist hat - da er sich mit Aliasen befasst - denselben Nachteil wie der Befehl alias: Das automatische Laden kann verhindert werden, aber das Modul kann weiterhin manuell oder automatisch geladen werden, wenn ein anderes Modul davon abhängt.
install
Es gibt eine Abhilfe für das in den Hinweisen zu #alias und #blacklist beschriebene Verhalten.
- Der Konfigurationsbefehl install weist modprobe an, einen benutzerdefinierten Befehl auszuführen, anstatt das Modul wie gewohnt in den Kernel einzufügen, sodass Sie das erfolgreiche Laden des Moduls mit folgendem Befehl simulieren können:
- /etc/modprobe.d/blacklist.conf
install module_name /bin/true
Mit /bin/false können Sie das Laden des Moduls zwangsweise verhindern: Dadurch wird das Laden des Moduls - und aller anderen davon abhängigen Module - auf alle Fälle verhindert, und es wird möglicherweise eine Fehlermeldung im Protokoll ausgegeben.
Verwendung der Kernel-Befehlszeile
- Tipp
- Dies kann sehr nützlich sein, wenn ein defektes Modul das Booten Ihres Systems unmöglich macht.
Sie können Module auch über die Konfiguration der Boot-Einträge des Bootloaders auf die Blacklist setzen
Fügen Sie einfach 1=module_blacklist=module_name_1,module_name_2,module_name_3 zu Ihrer Kernel-Befehlszeile hinzu, wie unter Kernel-Parameter#Bootloader-Konfiguration beschrieben
- Hinweis
- Wenn Sie mehr als ein Modul auf die Blacklist setzen, beachten Sie, dass diese nur durch Kommas getrennt werden
- Leerzeichen oder andere Zeichen können die Syntax vermutlich zerstören
- module_blacklist führt dazu, dass der Kernel das Modul vollständig ablehnt
- Wenn Sie nur das implizite Laden verhindern möchten, das Modul aber später möglicherweise manuell laden möchten, lautet der richtige Parameter 1=modprobe.blacklist=module_name_1,module_name_2,module_name_3
- Dies verhindert jedoch nicht das explizite Laden während des Bootvorgangs, z. B.
- durch systemd oder andere Module
Ein weiterer Anwendungsfall für eine Befehlszeilenoption ist die Deaktivierung hardwarespezifischer Komponenten eines Moduls, ohne das Modul vollständig zu deaktivieren
- Etwa die Deaktivierung eines Mikrofons unter Beibehaltung anderer Soundausgabeoptionen
- Einige Beispiele finden Sie unter BBS#303475.
Fehlerbehebung
Modul wird nicht geladen
Wenn ein bestimmtes Modul nicht geladen wird und das Boot-Protokoll (aufrufbar mit journalctl -b als root) angibt, dass das Modul auf der Blacklist steht, aber das Verzeichnis /etc/modprobe.d/ keinen entsprechenden Eintrag enthält, überprüfen Sie ein anderes modprobe-Quellverzeichnis unter /usr/lib/modprobe.d/ auf Blacklist-Einträge.
Ein Modul wird nicht geladen, wenn die im Kernelmodul enthaltene Zeichenfolge „vermagic“ nicht mit dem Wert des aktuell ausgeführten Kernels übereinstimmt.
- Wenn bekannt ist, dass das Modul mit dem aktuell ausgeführten Kernel kompatibel ist, kann die „vermagic“-Prüfung mit modprobe --force-vermagic ignoriert werden.
- Warnung
- Das Ignorieren der Versionsprüfungen für ein Kernelmodul kann aufgrund von Inkompatibilitäten zum Absturz des Kernels oder zu undefiniertem Verhalten des Systems führen.
- Verwenden Sie --force-vermagic nur mit äußerster Vorsicht.
Siehe auch
- Informationen zum Erstellen eines Kernel-Moduls finden Sie im "The Linux Kernel Module Programming Guide"