Kernelmodule

Aus wiki.archlinux.de
  • Damit ein Kernelmodul als solches vorhanden ist, muss es als Modul kompiliert werden. Die entsprechende Zeile in der Kernelkonfiguration ist mit einem "M" markiert.
  • Die Module liegen in /lib/modules/<kernel_release> (mit "uname -r" kann man sich das Release des gerade laufenden Kernels anzeigen lassen)
  • Mit /sbin/modprobe kann man Module laden und entladen
  • Im Verzeichnis /etc/modprobe.d/ können über Dateien mit der Endung .conf zusätzliche Moduloptionen gehandhabt werden. Auch Udev lädt die Module mit Hilfe von modprobe.


Hinweis: Modul Namen enthalten oft Unterstriche "_" oder Minuszeichen "-". Bei der Verwendung von modprobe und in den Konfigurationsdateien in /etc/modprobe.d/ sind diese beiden Zeichen austauschbar.

Module beim Systemstart automatisch laden

Die meisten benötigten Module werden beim Systemstart vom Init System erkannt und automatisch geladen. Es kann allerdings vorkommen, dass einige Module nicht automatisch erkannt werden. Sollen diese dennoch bei jedem Systemstart geladen werden, müssen sie in eine Datei mit der Endung .conf im Verzeichnis /etc/modules-load.d/ eingetragen werden. Der Name der Datei ist frei wählbar, sie muss nur die Endung .conf haben. Zum Beispiel /etc/modules-load.d/my-modules.conf. Die zu ladenden Module werden zeilenweise in diese Datei eingetragen.

/etc/modules-load.d/my-modules.conf

modulname1
modulname2
modulname3
usw.

Informationen über Module anzeigen

  • Anzeigen welche Kernelmodule geladen sind
$ lsmod
  • Informationen über ein bestimmtes Modul anzeigen
$ modinfo modul_name
  • Abhängigkeiten eines Moduls (oder Aliases) anzeigen
$ modprobe --show-depends modul_name
  • gesetzte Optionen eines geladenen Moduls anzeigen
$ systool -v -m modul_name

Konfiguration

Die gesamte Konfiguration aller Module anzeigen

$ modprobe -c | less

Konfiguration eines bestimmten Moduls anzeigen

$ modprobe -c | grep module_name

Parameter

Das folgende Bashscript gibt eine Liste aller momentan geladenen Module, deren Parameter und aktuellen Werte der Parameter aus. Es nutzt /proc/modules um eine Liste aller momentan geladenen Module zu erhalten, greift dann mit modinfo direkt auf das Verzeichnis zu um eine Beschreibung der Module und deren Parameter (falls vorhanden) zu erhalten. Abschließend greift es auf das sysfs Dateisystem zu um die aktuellen Werte der Parameter zu erhalten. Es muss als root ausgeführt werden.

function aa_mod_parameters () 
{ 
    N=/dev/null;
    C=`tput op` O=$(echo -en "\n`tput setaf 2`>>> `tput op`");
    for mod in $(cat /proc/modules|cut -d" " -f1);
    do
        md=/sys/module/$mod/parameters;
        [[ ! -d $md ]] && continue;
        m=$mod;
        d=`modinfo -d $m 2>$N | tr "\n" "\t"`;
        echo -en "$O$m$C";
        [[ ${#d} -gt 0 ]] && echo -n " - $d";
        echo;
        for mc in $(cd $md; echo *);
        do
            de=`modinfo -p $mod 2>$N | grep ^$mc 2>$N|sed "s/^$mc=//" 2>$N`;
            echo -en "\t$mc=`cat $md/$mc 2>$N`";
            [[ ${#de} -gt 1 ]] && echo -en " - $de";
            echo;
        done;
    done
}

Eine Beispielausgabe:

# aa_mod_parameters

>>> ehci_hcd - USB 2.0 'Enhanced' Host Controller (EHCI) Driver
        hird=0 - hird:host initiated resume duration, +1 for each 75us (int)
        ignore_oc=N - ignore_oc:ignore bogus hardware overcurrent indications (bool)
        log2_irq_thresh=0 - log2_irq_thresh:log2 IRQ latency, 1-64 microframes (int)
        park=0 - park:park setting; 1-3 back-to-back async packets (uint)

>>> processor - ACPI Processor Driver
        ignore_ppc=-1 - ignore_ppc:If the frequency of your machine gets wronglylimited by BIOS, this should help (int)
        ignore_tpc=0 - ignore_tpc:Disable broken BIOS _TPC throttling support (int)
        latency_factor=2 - latency_factor: (uint) 

>>> usb_storage - USB Mass Storage driver for Linux
        delay_use=1 - delay_use:seconds to delay before using a new device (uint)
        option_zero_cd=1 - option_zero_cd:ZeroCD mode (1=Force Modem (default), 2=Allow CD-Rom (uint)
        quirks= - quirks:supplemental list of device IDs and their quirks (string)
        swi_tru_install=1 - swi_tru_install:TRU-Install mode (1=Full Logic (def), 2=Force CD-Rom, 3=Force Modem) (uint)

>>> video - ACPI Video Driver
        allow_duplicates=N - allow_duplicates: (bool)
        brightness_switch_enabled=Y - brightness_switch_enabled: (bool)
        use_bios_initial_backlight=Y - use_bios_initial_backlight: (bool)

Laden

Modul inklusive benötigter Abhängigkeiten (nach)laden.

# modprobe modul_name

Nur das angegebene Modul, ohne Abhängigkeiten (nicht zu empfehlen) laden.

# insmod modul_name

Entfernen

Modul inklusive Abhängigkeiten entfernen.

# modprobe -r modul_name

Nur das angegeben Modul entfernen. Evtl. nicht mehr benötigte andere Module werden nicht entfernt.

# rmmod modul_name

Optionen

Um ein Kernelmodul mit bestimmten Parametern zu laden, können Konfigurationsdateien in /etc/modprobe.conf/ oder die Kernel Kommandozeile verwendet werden.

Konfigurationsdateien

Um Modulen Optionen mit modprobe Konfigurationsdateien zu übergeben, muss in /etc/modprobe.d/ eine Datei mit der Endung .conf angelegt werden (es kann aber auch /etc/modprobe.d/modprobe.conf verwendet werden). Die Syntax sieht so aus:

options modul_name parametername=parametercontents

Beispiel:

/etc/modprobe.d/thinkfan.conf

# On thinkpads, this lets the thinkfan daemon control fan speed
options thinkpad_acpi fan_control=1

Kernel Kommandozeile

Optionen können auch über die Kernel-Kommandozeile (z.B. in GRUB oder Syslinux) an Module übergeben werden. Falls ein Modul fest in den Kernel kompiliert ist muss diese Methode zum Beispiel angewandt werden. Die Syntax sieht so aus:

modul_name.parametername=parmetercontents

Beispiel:

thinkpad_acpi.fan_control=1

Aliase

/etc/modprobe.d/myalias.conf

# Lets you use 'mymod' in MODULES, instead of 'really_long_module_name'
alias mymod really_long_module_name

Manche Module haben Aliase die genutzt werden um sie automatisch zu laden wenn eine Anwendung sie benötigt. Deaktivieren dieser aliase kann das automatische Laden unterbinden, die Module können aber immer noch manuell geladen werden.

/etc/modprobe.d/modprobe.conf

# Prevent autoload of bluetooth
alias net-pf-31 off

# Prevent autoload of ipv6
alias net-pf-10 off

Blacklisting

Im Zusammenhang mit Kernelmodulen bezeichnet Blacklisting den Mechanismus den Kernel daran zu hindern bestimmte Module zu laden. Das kann zum Beispiel nützlich sein wenn die betreffende Hardware gar nicht vorhanden ist oder das Laden eines Moduls Probleme verursacht. Es kann zum Beispiel vorkommen, dass zwei verschiedene Module für eine Hardwarekomponente existieren, aber das Laden beider zu Konflikten führt.

Einige Module werden als Teil des initramfs geladen. mkinitcpio -M gibt alle automatisch erkannten Module aus. Um zu verhindern dass Module aus dem initramfs geladen werden, müssen sie in /etc/modprobe.d/modprobe.conf geblacklistet werden. mkinitcpio -v gibt alle Module die von den verschiedenen HOOKS geladen werden aus. Nachdem Module aus dem initramfs geblacklisted wurden, muss das initramfs neu generiert und der Rechner neu gestartet werden.

per Konfigurationsdateien

In /etc/modprobe.conf.d/ muss eine Datei mit der Endung .conf erstellt werden (z.B. blacklist.conf). In dieser Datei muss für jedes Modul eine Zeile mit folgender Syntax eingefügt werden. Soll zum Beispiel verhindert werden, dass das pcspkr Modul geladen wird:

/etc/modprobe.d/blacklist.conf

blacklist pcspkr

Hinweis: Das blacklist Kommando verhindert nur das automatische Laden eines Moduls. Es kann aber trotzdem noch geladen werden wenn ein anderes, nicht geblacklistetes, Modul es als Abhängigkeit benötigt. Um das Laden eines Moduls komplett zu unterbinden gibt es einen Workaround: /etc/modprobe.d/blacklist.conf ... install modul_name /bin/false ... Das verhindert effektiv, dass das Modul und alle anderen die von ihm Abhängen geladen werden.

per Kernel Kommandozeile

Module können auch über die Kernel-Kommandozeile des Bootloaders geblacklistet werden.

modprobe.blacklist=modul_name1,modul_name2,modul_name3

oder

modul_name.disable=1

GRUB Beispiele

/boot/grub/menu.lst

...
kernel /vmlinuz-linux root=/dev/sda1 modprobe.blacklist=pcspkr,ipv6 ro
...
/boot/grub/menu.lst

...
kernel /vmlinuz-linux root=/dev/sda1 pcspkr.disable=1 ipv6.disable=1 ro
...

Weblinks