14.7 Kernelmodule verwalten 

Wir wollen uns nun der Frage widmen, wie man unter Linux Kernel-Module und damit Treiber für bestimmte Hardware laden und wieder loswerden kann. Notwendig dafür ist der entsprechende Support im Kernel. Ist dieser vorhanden, so sind die jeweils verfügbaren Kernel-Module im Verzeichnis /lib/modules/<Kernel-Version> zu finden. Welchen Kernel man gerade gebootet hat, kann man mit dem uname-Tool erfahren:
# uname -a Linux steffenmobile 2.6.31-20-generic #58-Ubuntu SMP Fri Mar 12 05:23:09 UTC 2010 i686 GNU/Linux
Listing 14.103 Kernel-Version mit uname ermitteln
Das Verzeichnis /lib/modules/2.6.31-20-generic enthält also die zum verwendeten Kernel gehörigen Kernelmodule.
14.7.1 modprobe 

Möchte man ein Modul zur Laufzeit in den Kernel laden, so ist in der Regel modprobe das Tool der Wahl. Man übergibt dem Tool nur den Namen des Moduls, und modprobe lädt die entsprechende Moduldatei samt eventuell vorhandener Abhängigkeiten.
Automatische Abhängigkeiten
Um diese Abhängigkeiten auflösen zu können, greift modprobe auf die modules.dep-Datei im entsprechenden Verzeichnis unter /lib/modules/<Kernel-Version> zu. Diese Datei wird nun in der Regel während des Bootens von depmod erstellt. Dazu durchsucht depmod das gesamte Verzeichnis und löst alle Referenzen und damit alle Abhängigkeiten der Module untereinander auf.
Sehen Sie sich die entsprechende modules.dep-Datei auf Ihrem Rechner ruhig einmal an. Das folgende Listing enthält einen Auszug aus der entsprechenden Datei eines unserer Notebooks. Sie sehen in jeder Zeile ein Modul und hinter dem Doppelpunkt eine Liste von Modulen, von denen das jeweilige Modul abhängt. Diese Liste kann auch leer sein, wenn keine Abhängigkeiten bestehen (in diesem Fall endet nach dem Doppelpunkt die Zeile).
kernel/drivers/staging/cpc-usb/cpc-usb.ko: kernel/drivers/staging/pata_rdc/pata_rdc.ko: kernel/drivers/staging/udlfb/udlfb.ko: kernel/drivers/platform/x86/asus-laptop.ko: kernel/drivers/ leds/led-class.ko kernel/drivers/platform/x86/eeepc-laptop.ko: kernel/drivers/platform/x86/msi-laptop.ko: kernel/drivers/platform/x86/compal-laptop.ko: kernel/drivers/platform/x86/dell-laptop.ko: kernel/drivers/ firmware/dcdbas.ko kernel/drivers/platform/x86/dell-wmi.ko: kernel/drivers/platform/x86/acer-wmi.ko: kernel/drivers/ leds/led-class.ko kernel/drivers/platform/x86/acerhdf.ko: kernel/drivers/platform/x86/hp-wmi.ko: kernel/drivers/platform/x86/tc1100-wmi.ko: kernel/drivers/platform/x86/sony-laptop.ko:
Listing 14.104 Auszug einer modules.dep-Datei
Mit dem Parameter -r kann man Module auch wieder aus dem Kernel entfernen. Dabei versucht modprobe, rekursiv ebenfalls alle nicht weiter benötigten Module zu löschen, von denen das auf der Kommandozeile angegebene Modul abhängt.
14.7.2 lsmod 

Geladene Module anzeigen
Möchten Sie sich alle geladenen Module anzeigen lassen, so hilft Ihnen das Tool lsmod weiter. Die Ausgabe des Tools umfasst alle geladenen Module, ihre Größe sowie die von diesem Modul jeweils abhängigen Module.
# lsmod Module Size Used by ... dell_laptop 8128 0 dcdbas 7292 1 dell_laptop
Listing 14.105 lsmod
In diesem Beispiel sehen Sie, dass der Treiber für Dell-Laptops dell_laptop das Kernelmodul dcdbas benötigt (vergleichen Sie dazu den obigen Auszug aus der Datei modules.dep in Listing 14.104, die genau diese Abhängigkeit enthält). Möchte man mehr Informationen über ein bestimmtes Modul, kann man auf das Tool modinfo zurückgreifen:
$ modinfo dcdbas filename: /lib/modules/2.6.31-20-generic/kernel/drivers/ firmware/dcdbas.ko alias: dmi:*:[bs]vnD[Ee][Ll][Ll]*:* license: GPL author: Dell Inc. version: 5.6.0-3.2 description: Dell Systems Management Base Driver (version 5.6.0-3.2) srcversion: 69CF3C336BF107F5812D0B9 depends: vermagic: 2.6.31-20-generic SMP mod_unload modversions 586 $ modinfo dell_laptop filename: /lib/modules/2.6.31-20-generic/kernel/drivers/ platform/x86/dell-laptop.ko alias: dmi:*svnDellInc.:*:ct8:* license: GPL description: Dell laptop driver author: Matthew Garrett <mjg@redhat.com> srcversion: 9739006FA71D2495175583A depends: dcdbas
Listing 14.106 modinfo
14.7.3 insmod und rmmod 

Weniger clever [Das sagt sogar die Manpage: »Most users will want to use modprobe(8) instead, which is cleverer.«] als modprobe sind die Tools insmod und rmmod. Beiden Tools ist gemeinsam, dass sie keine Abhängigkeiten zwischen unterschiedlichen Modulen berücksichtigen können. Bei insmod ist es sogar notwendig, den genauen Dateinamen statt des kürzeren Modulnamens anzugeben.
Wir wollten diese beiden Tools nur einmal erwähnt haben; näher ausführen werden wir ihre Benutzung nicht. Nutzen Sie lieber modprobe, das die Aufrufe von insmod beziehungsweise rmmod vor Ihnen als Benutzer versteckt.
14.7.4 /etc/modules & Co. 

Nun bleiben natürlich noch ein paar Fragen offen, beispielsweise wann und wie man Module schon zur Bootzeit laden kann. Dies wird auf den verschiedenen Distributionen leider recht unterschiedlich gelöst, nutzen Sie daher im Zweifelsfall lieber die distributionseigenen Tools.
Wenn Sie jedoch per Hand etwas editieren möchten oder müssen, schauen Sie einfach mal im /etc-Verzeichnis nach Dateien, deren Name den String mod beinhaltet:
$ ls -l /etc | grep mod drwxr-xr-x 2 root root 4096 2010-02-03 12:54 modprobe.d -rw-r--r-- 1 root root 202 2010-01-29 21:30 modules
Listing 14.107 Durchforsten des /etc-Verzeichnisses
modules, modprobe.conf und modprobe.d
Auf diesem System gibt es also die Datei modules und das Verzeichnis modprobe.d (manchmal wird statt dieses Verzeichnisses auch eine Datei namens modprobe.conf verwendet). Bei näherem Betrachten der Kommentare am Anfang der Dateien erschließt sich auch gleich deren Zweck:
$ cat /etc/modules # /etc/modules: kernel modules to load at boot time. # # This file should contain the names of kernel # modules that are to be loaded at boot time, one # per line. Comments begin with a "#", and # everything on the line after them are ignored. lp rtc
Listing 14.108 Die /etc/modules
Hier kann man leicht sehen, dass einfach nur die beim Booten zu ladenden Modulnamen angegeben werden müssen.
Natürlich haben Module auch untereinander Abhängigkeiten, die manchmal aufgrund von Namenskonflikten nicht aufgelöst werden können, oder Sie möchten nach bzw. vor dem Laden bestimmter Module Skripte oder andere Aktionen ausführen. In diesem Fall hilft die modprobe.conf bzw. das Verzeichnis modprobe.d weiter:
$ ls /etc/modprobe.d alsa-base.conf blacklist-ath_pci.conf blacklist.conf blacklist-firewire.conf blacklist-framebuffer.conf blacklist-modem.conf blacklist-oss.conf blacklist-watchdog.conf dkms.conf libpisock9.conf nvidia-kernel-nkc.conf
Listing 14.109 Das Verzeichnis /etc/modprobe.d
Es handelt sich bei all diesen Dateien um typische Textdateien. Im Folgenden sind die dafür möglichen Befehle beschrieben:
- alias Name1 Name2
Der Befehl alias definiert einen Ersatznamen Name1 für das Modul, das über Name2 angegeben wurde. Mit alias lassen sich etwa Kurznamen für sehr lange Modulnamen definieren: alias Kurz LaaaaaangerNaaaaame.
- options Modul Optionen
Beim Laden eines Moduls (etwa via modprobe) können Parameter übergeben werden, die Sie über den options-Befehl festlegen.
- install Ladebefehl
Dieser Befehl ermöglicht es Ihnen, einen bestimmten Shellbefehl beim Laden des Kernelmoduls über modprobe ausführen zu lassen, anstatt das Modul auf dem Standardweg automatisch zu laden.
- remove Befehl
Wenn Sie mit modprobe -r ein Modul aus dem Kernel entfernen und Sie für dieses Modul einen remove-Befehl angelegt haben, wird der dort angegebene Befehl ausgeführt.
- include Datei
Ähnlich wie in diversen Programmiersprachen können Sie über den include-Befehl Dateiinhalte und sogar ganze Verzeichnisinhalte in Ihre Konfigurationsdatei einbinden.
- blacklist Modul
Um zu verhindern, dass ein Modul automatisch geladen wird, können Sie den Befehl blacklist verwenden.
14.7.5 modconf 

Der Weg, den Debian sowie seine Ableger Ubuntu und Co. bei der Konfiguration der Module gehen, ist etwas anders. Dort müssen Sie die Dateien wie /etc/modules nicht unbedingt direkt editieren, sondern können stattdessen das Tool modconf benutzen. Wählen Sie die Module aus den entsprechenden Kategorien aus und erkennen dort auch deren Status. Die Bedienung selbst ist dabei intuitiv: Sie erfolgt durch die Cursortasten sowie Enter.
Das Tool macht letztendlich natürlich auch nichts anderes, als die eben genannten Dateien zu editieren. Aber durch die Oberfläche finden Sie passende Module schneller, und zudem werden Tippfehler vermieden.
Abbildung 14.6 modconf