Zum Inhalt springen

Linux/Kernel/Module/Anwendung

Aus Foxwiki

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"