[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] [:mit Root-Rechten arbeiten:] }}} [[Inhaltsverzeichnis(2)]] Dieser Artikel beschreibt den Umgang mit Kernelmodulen und den Hilfsmitteln, die das System bietet, um Module zu verwalten. Grundsätzlich besitzt der Linux-[:Kernel:] einen [wikipedia:Linux_%28Kernel%29#Architektur:monolithischen Aufbau], allerdings bietet er auch die Möglichkeit, Module zur Laufzeit zu laden und entladen. Unter einem Kernelmodul versteht man im Allgemeinen einen Teil bzw. eine Erweiterung des Kernels. So sind z.B. alle Hardwaretreiber (z.B. WLAN-Karte, Soundkarte...) als Modul angelegt. Die meisten Linux-Distributionen inklusive Ubuntu machen starken Gebrauch von Kernelmodulen, da so die bestmögliche Hardwarekompatibilität mit nur einem "allgemeinen" Kernel erreicht werden kann. In der Regel werden alle notwendigen Module beim Systemstart und falls nötig zur Laufzeit geladen, so dass der Nutzer sich nicht weiter darum kümmern muss (bzw. es oft noch nicht einmal mitbekommt). Installiertes Werkzeug für den Umgang mit den Modulen ist '''kmod''', der Vorgänger '''module-init-tools''' wird seit [:Xenial_Xerus:] nicht mehr unterstützt. Weitere Hinweise für die Anwendung von kmod siehe {{{#!vorlage Befehl man kmod }}} = Installation = Die Programme zum Umgang mit den Modulen sind grundsätzlich in der Standardinstallation enthalten, können aber ansonsten über die Pakete {{{#!vorlage Paketinstallation kmod }}} installiert werden [1]. = Befehle für Module = Im Folgenden werden einige wichtige Befehle für den Umgang mit Modulen kurz vorgestellt. Alle Befehle werden im Terminal im Root-Rechten aufgerufen[2][4]. [[Anker(lsmod)]] == Geladene Module anzeigen - lsmod und kmod == Mit den Befehlen {{{#!vorlage Befehl kmod list }}} oder {{{#!vorlage Befehl lsmod }}} können alle aktuell geladenen Module angezeigt werden. `lsmod` wie auch `kmod list` kennen keine weiteren Optionen, die Ausgaben sind identisch. Beispielausgabe: {{{ Module Size Used by ccm 20480 9 bnep 20480 2 nls_iso8859_1 16384 1 intel_rapl 20480 0 x86_pkg_temp_thermal 16384 0 intel_powerclamp 16384 0 coretemp 16384 0 kvm_intel 217088 0 kvm 598016 1 kvm_intel irqbypass 16384 1 kvm wmi_bmof 16384 0 snd_hda_codec_hdmi 49152 1 crct10dif_pclmul 16384 0 crc32_pclmul 16384 0 ghash_clmulni_intel 16384 0 pcbc 16384 0 i915 1617920 25 uvcvideo 86016 0 snd_hda_codec_conexant 24576 1 snd_hda_codec_generic 73728 1 snd_hda_codec_conexant aesni_intel 188416 6 aes_x86_64 20480 1 aesni_intel crypto_simd 16384 1 aesni_intel videobuf2_vmalloc 16384 1 uvcvideo glue_helper 16384 1 aesni_intel snd_hda_intel 40960 8 videobuf2_memops 16384 1 videobuf2_vmalloc cryptd 24576 3 crypto_simd,ghash_clmulni_intel,aesni_intel snd_hda_codec 126976 4 snd_hda_codec_generic,snd_hda_codec_conexant,snd_hda_codec_hdmi,snd_hda_intel ... }}} In der ersten Spalte wird der Modulname angezeigt, in der zweiten Spalte der belegte Speicher in Bytes und in der dritten Spalte die Anzahl der Prozesse und Module, die dieses Modul benutzen, gefolgt von einer Liste der Modulnamen, die dieses Modul benutzen. == Information anzeigen - modinfo == Mit Hilfe des Befehls `modinfo` werden Informationen zu einem bestimmten Modul angezeigt. Die allgemeine Syntax lautet: {{{#!vorlage Befehl modinfo MODULNAME }}} wobei `MODULNAME` durch das entsprechende Modul ersetzt werden muss. Beispiel: {{{#!vorlage Befehl modinfo snd }}} Ausgabe: {{{ filename: /lib/modules/4.15.0-64-generic/kernel/sound/core/snd.ko alias: char-major-116-* license: GPL description: Advanced Linux Sound Architecture driver for soundcards. author: Jaroslav Kysela srcversion: ADABBACA83A95CA10E3225E depends: soundcore retpoline: Y intree: Y name: snd vermagic: 4.15.0-64-generic SMP mod_unload signat: PKCS#7 signer: sig_key: sig_hashalgo: md4 parm: slots:Module names assigned to the slots. (array of charp) parm: major:Major # for sound driver. (int) parm: cards_limit:Count of auto-loadable soundcards. (int) }}} Die Ausgabe erfolgt zeilenweise sortiert nach verschiedenen Kategorien. Diese sind für alle Module gleich. Interessant ist die Zeile `depends`, da man hier sieht, von welchen Modulen dieses Modul abhängt. "Abhängt" bedeutet, dass das entsprechende Modul oder ggf. auch mehrere Module geladen sein müssen, bevor dieses Modul geladen werden kann. Dies ist besonders bei Verwendung von [#insmod insmod] von Interesse. modinfo kennt einige Optionen, welche in den [:man:Manpages] ausgeführt sind. [[Anker(modprobe)]] == Module laden/entladen - modprobe == Mit `modprobe` können Module zur Laufzeit des Systems ge- und entladen werden. modprobe löst dabei automatisch Abhängigkeiten auf, d.h. wenn das zu ladende Modul andere Module voraussetzt, werden diese automatisch in der richtigen Reihenfolge mit geladen bzw. werden Module automatisch mit entfernt, welche nur aus Abhängigkeitsgründen geladen wurden. Dies setzt allerdings voraus, dass die Abhängigkeiten richtig hinterlegt sind, siehe Abschnitt [#depmod depmod]. Die allgemeine Syntax von modprobe lautet: {{{#!vorlage Befehl sudo modprobe OPTIONEN MODULNAME(N) }}} Die gängigsten Optionen sind : {{{#!vorlage Tabelle <-2 rowclass="titel">Optionen von modprobe +++ Option Beschreibung +++ `-v` Man erhält eine ausführliche Ausgabe der Aktionen von modprobe. +++ `-n` oder `--dry-run` Simuliert das Laden des Moduls, lädt es aber nicht. +++ `-a` Es werden alle in der Kommandozeile angegebenen Module geladen. Diese Option muss immer dann verwendet werden, wenn mehrere Module auf einmal geladen werden sollen. +++ `--show-depends` Es werden alle Abhängigkeiten des Moduls angezeigt. +++ `-r` die angegebenen Module werden entladen. }}} Eine vollständige Übersicht erhält man in den [:man:Manpages] zu modprobe. Möchte man ein Modul bei jedem Systemstart laden, so muss man nicht jedes Mal modprobe ausführen, sondern [#start automatisiert] den Vorgang. === insmod === Module können auch - alternativ zu [#modprobe modprobe] - mit dem Befehl `insmod` geladen werden. Die Verwendung von insmod hat allerdings den Nachteil, dass eventuelle Abhängigkeiten der Module nicht automatisch aufgelöst werden. insmod lädt ein Modul nur, wenn alle Abhängigkeiten erfüllt sind bzw. vorher "von Hand" aufgelöst wurden. Daher wird insmod im täglichen Betrieb eher selten verwendet. Die allgemeine Syntax von insmod lautet: {{{#!vorlage Befehl sudo insmod MODULNAME }}} === rmmod === Eine zweite Möglichkeit, ein Modul aus dem Speicher zu entfernen ("entladen"), ist der Befehl `rmmod`. Im Gegensatz zu `modprobe -r` werden Module, die aus Abhängigkeitsgründen zum entfernenden Modul im Kernel geladen wurden, nicht mit entfernt. Die allgemeine Syntax von rmmod lautet: {{{#!vorlage Befehl sudo rmmod OPTIONEN MODULNAME }}} Für den "normalen" Betrieb benötigt man in der Regel keine Optionen. Diese sind in den [:man:Manpages] zu rmmod aufgeführt. [[Anker(depmod)]] == Abhängigkeiten von Modulen - depmod == Manche Module können erst genutzt bzw. geladen werden, wenn andere Module geladen sind, da sie von diesen abhängen. Diese Abhängigkeiten sind in der Datei '''/lib/modules/KERNELVERSION/modules.dep''' hinterlegt. Diese Datei mit korrekt angelegten Abhängigkeiten wird bei der Installation von Ubuntu hinterlegt, so dass keine Änderungen vorgenommen werden müssen. Installiert man zusätzliche eigene Module, so sollte die Datei '''modules.dep''' neu erstellt werden. Dies geschieht über den Befehl `depmod`. Die allgemeine Syntax von depmod lautet: {{{#!vorlage Befehl sudo depmod OPTIONEN }}} Die zwei wichtigsten Optionen sind: {{{#!vorlage Tabelle <-2 rowclass="titel">Optionen von depmod +++ Option Beschreibung +++ `-A` Es wird zuerst geprüft, ob neue Module hinzugekommen sind. Wenn nicht wird keine neue Datei erstellt. +++ `-n` Das Erstellen der neuen Datei wird simuliert, ohne die Aktionen wirklich durchzuführen. }}} Die weiteren Optionen sind in der [:man:Manpage] von depmod aufgeführt. [[Anker(start)]] = Module automatisch laden = Möchte man ein Modul, welches der Kernel nicht automatisch mit lädt, beim Systemstart automatisch laden, so trägt man den Modulnamen einfach in die Datei '''/etc/modules''' ein. Dazu öffnet man diese Datei mit einem Editor mit Root-Rechten[3][4] und macht die entsprechenden Einträge, wobei pro Zeile nur ein Modulname eingetragen werden darf. Ab dem nächsten Systemstart werden alle Module (zusätzlich) geladen, die dort eingetragen sind. [[Anker(optionen)]] = Module mit Optionen laden = Mögliche Optionen eines bestimmten Moduls abfragen: {{{#!vorlage Befehl modinfo -p MODULNAME modinfo MODULNAME -F parm modinfo MODULNAME | grep parm }}} Siehe auch [:grep:] Beispielausgabe beim Modul `iwlwifi`: {{{ swcrypto:using crypto in software (default 0 [hardware]) (int) 11n_disable:disable 11n functionality, bitmap: 1: full, 2: disable agg TX, 4: disable agg RX, 8 enable agg TX (uint) amsdu_size:amsdu size 0: 12K for multi Rx queue devices, 4K for other devices 1:4K 2:8K 3:12K (default 0) (int) fw_restart:restart firmware in case of error (default true) (bool) antenna_coupling:specify antenna coupling in dB (default: 0 dB) (int) nvm_file:NVM file name (charp) d0i3_disable:disable d0i3 functionality (default: Y) (bool) lar_disable:disable LAR functionality (default: N) (bool) uapsd_disable:disable U-APSD functionality bitmap 1: BSS 2: P2P Client (default: 3) (uint) bt_coex_active:enable wifi/bt co-exist (default: enable) (bool) led_mode:0=system default, 1=On(RF On)/Off(RF Off), 2=blinking, 3=Off (default: 0) (int) power_save:enable WiFi power management (default: disable) (bool) power_level:default power save level (range from 1 - 5, default: 1) (int) fw_monitor:firmware monitor - to debug FW (default: false - needs lots of memory) (bool) d0i3_timeout:Timeout to D0i3 entry when idle (ms) (uint) disable_11ac:Disable VHT capabilities (default: false) (bool) }}} Mögliche Werte und Konstanten: {{{#!vorlage Tabelle <-2 rowclass="titel">häufige Werte/Konstanten +++ Option Beschreibung +++ `[bool]` Logischer Wert wie `y`(es) und `n`(o) oder `true` und `false` oder auch `0` und `1` (bolean) +++ `[int]` Ganzzahliger Wert mit möglichem Vorzeichen im Bereich -2,147,483,648 bis 2,147,483,647 (32bit) +++ `[uint]` Ganzzahliger Wert ohne Vorzeichen im Bereich 0 bis 4.294.967.295 (32bit) +++ `[long]` Ganzzahliger Wert mit Vorzeichen im Bereich -9,223,372,036,854,775,808 bis 9,223,372,036,854,775,807 (64bit) +++ `[ulong]` Ganzzahliger Wert ohne Vorzeichen im Bereich 0 bis 18.446.744.073.709.551.615 (64bit) +++ `[ushort]` Ganzzahliger Wert ohne Vorzeichen im Bereich 0 bis 65.535 (16bit) +++ `[charp]` Zeichenkette wie Dateiname o.ä. }}} Oft werden die erlaubten Werte mit angegeben. Entsprechende Optionen können vorab getestet werden. Beim Laden des Moduls werden entsprechende Hinweise oder auch Fehler ausgegeben. Beispiel: {{{#!vorlage Befehl # richtig sudo modprobe -v iwlwifi bt_coex_active=1 # fehlerhafter Vorgabewert sudo modprobe -v iwlwifi bt_coex_active=2 }}} Die dazu passenden Ausgaben lautet: {{{ # richtig insmod /lib/modules/4.10.0-42-generic/kernel/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko bt_coex_active=1 # fehlerhaft modprobe: ERROR: could not insert 'iwlwifi': Invalid argument }}} Soll ein Modul immer mit einer bestimmten Option geladen werden, kann dies über eine entsprechenden Konfigurationsdatei in '''/etc/modprobe.d''' festgelegt werden. Diese Datei existiert nicht standardmäßig - wenn sie gebraucht wird, muss sie mit Root-Rechten angelegt werden. Es gibt nur einen Eintrag pro Zeile. Um eine Option zu setzen, beginnt man mit einem `options`: {{{ options modulname_1 option1=XX options modulname_2 option2=YY }}} Mehrere Moduloptionen setzen: {{{ options modulname option1=XX option2=XX option3=XX }}} Beispiel: {{{ options iwlwifi 11n_disable=1 fw_restart=1 }}} Die benötigte Datei '''/etc/modprobe.d/MODULNAME_options.conf''' einschließlich der Optionseinträge für ein bestimmtes Kernelmodul kann sehr einfach durch eine einzige Befehlszeile im Terminal [2] angelegt werden. Über einen kombinierten [:Shell:]-Befehl wird die Datei mit entsprechendem Inhalt erzeugt: {{{#!vorlage befehl echo "options MODULNAME option1=XX option2=XX" | sudo tee /etc/modprobe.d/MODULNAME_options.conf }}} Siehe auch [:Shell/Umleitungen:] Beispiel: {{{#!vorlage befehl echo "options iwlwifi 11n_disable=1 fw_restart=1" | sudo tee /etc/modprobe.d/iwlwifi_options.conf }}} Die Optionen werden nach einem Systemneustart oder manuellem entladen und erneutem laden des Moduls übernommen. [[Anker(blacklisting)]] = Automatisches Laden verhindern - Blacklisting = Unter bestimmten Umständen kann es sinnvoll sein, das Laden von bestimmten Modulen explizit zu verbieten. Dies geschieht durch den Eintrag des entsprechenden Moduls in eine so genannte Blacklist-Datei. Diese Dateien befinden sich im Verzeichnis '''/etc/modprobe.d'''. In der Regel sind schon einige Einträge in der '''/etc/modprobe.d/blacklist.conf''' zu finden. Die Datei legt man mit einem Editor mit Root-Rechten an [3] (bzw. öffnet eine vorhandene Datei) und fügt einen Dateieintrag nach folgendem Schema hinzu, je ein Eintrag pro Zeile: {{{ blacklist modulname_1 blacklist modulname_2 }}} Die Sperrlisten haben üblicherweise den Namen '''blacklist-Modulname.conf''', d.h. der Dateiname kann frei gewählt werden, sollte aber mit dem Präfix '''blacklist-''' beginnen um direkt über die Funktion zu informieren. Darüber hinaus existiert auch eine "allgemeine" Datei, die nur den Namen '''blacklist.conf''' trägt. Diese Datei sollte man allerdings nicht komplett überschreiben, sondern bei Bedarf weitere Einträge anhängen. Auch hier kann dies über einen kombinierten [:Shell:]-Befehl in einem Zug durchgeführt werden: Eintrag an bestehende Sperrliste '''/etc/modprobe.d/blacklist.conf''' anhängen: {{{#!vorlage befehl echo "blacklist prism54" | sudo tee -a /etc/modprobe.d/blacklist.conf }}} Neue Sperrliste anlegen bzw. bestehende überschreiben: {{{#!vorlage befehl echo "blacklist prism54" | sudo tee /etc/modprobe.d/blacklist_prism54.conf }}} Siehe auch [:Shell/Umleitungen:] Sollte ein benötigtes Modul nicht automatisch bei Systemstart geladen werden, so kann dies an einem entsprechenden Sperreintrag liegen. Bestehende Sperrlisten nach einem Eintrag mittels [:grep:] durchsuchen: {{{#!vorlage befehl grep -i MODULNAME /etc/modprobe.d/* }}} Beispiel: {{{#!vorlage befehl grep -i prism54 /etc/modprobe.d/* }}} Entsprechende Einträge wie oben gezeigt mittels [:grep:] suchen und über [:sed:] auskommentieren, Modul also wieder entsperren: {{{#!vorlage befehl sudo sed -i "s/blacklist MODULNAME/#blacklist MODULNAME/g" $(egrep -lo 'blacklist MODULNAME' /etc/modprobe.d/*) }}} Beispiel: {{{#!vorlage befehl sudo sed -i "s/blacklist prism54/#blacklist prism54/g" $(egrep -lo 'blacklist prism54' /etc/modprobe.d/*) }}} {{{#!vorlage Hinweis Manchmal kann es erforderlich sein, das [wikipedia:initramfs:] mit dem Befehl `update-initramfs -u` zu aktualisieren, wenn die Module trotz Blacklisting nach einem Neustart wieder geladen werden. }}} = Übersicht über alle Module = Wer wissen möchte, welche Module auf dem eigenen Rechner verfügbar (nicht geladen!) sind, der kann sich mit dem Befehl [2] {{{#!vorlage Befehl basename -s ".ko" $(find /lib/modules/$(uname -r) -type f -name "*.ko") }}} eine komplette Liste anzeigen lassen. Allerdings ist die Liste extrem lang (der Kernel bringt mehrere hundert Module mit...), daher ist es eventuell günstiger, die Modulverzeichnisse mit einem Dateimanager zu durchforsten. Die Module liegen alle in den Unterverzeichnissen von '''/lib/modules/KERNELVERSION/kernel/''' = Links = * [:module-assistant:Module-Assistant] - Module nachträglich erstellen und installieren * [:DKMS:] - Module automatisch aktualisieren * [github:pedrox/kmod:Github Seite von kmod] #tag: Hardware, System