Kernel-Module - Treiber unter Linux
 

Der Linux-Kernel ist der innerste Teil des Systems. Er ist das elementare Bindeglied zwischen der Hardware des Rechners und der Software. Genaugenommen bezeichnet der Begriff Linux nur diesen Betriebssystemkern, also den Kernel. Die gesamte Software drumherum, wie z.B. die Konsole, die Anwendungen, usw. gehören zwar zum Gesamtsystem, kommen aber aus unterschiedlichen Quellen, daher ist auch die korrekte Bezeichnung GNU/Linux, da die meiste Software dem GNU-Projekt enstammt.
Hardware-Treiber unter Linux werden seit der Kernel Version 2.x in sogenannten Kernel-Modulen realisiert. Früher mußte man um z.B. einen neuen Treiber für eine Netzwerkkarte in das System zu integrieren, den kompletten Kernel neu übersetzen. Heutzutage ist das etwas einfacher, da lediglich mit Teilen des Kernels ein Modul übersetzt wird. Module sind Kernel-Teile, die dynamisch während des laufenden Systems hinzugeladen und auch wieder entfernt werden können. Um zu wissen, wo denn unsere Treiber-Module lagern, müssen wir erst einmal die Kernel-Version herausfinden. Das geht mit:
# uname -rv
2.6.26-1-686 #1 SMP Thu Oct 9 15:18:09 UTC 2008
Durch die Kernel Bezeichnung 2.6.26-1-686 weiß man, daß das Verzeichnis für die Kernelmodule /lib/modules/2.6.26-1-686 sein muß. Eine Liste aller verfügbaren Module kann man sich mittels folgendem Befehl ausgeben lassen:
# modprobe -l
.....
/lib/modules/2.6.26-1-686/kernel/net/atm/atm.ko
/lib/modules/2.6.26-1-686/kernel/net/atm/br2684.ko
.....

Wie man sieht, haben Kernelmodule die Endung .ko
Welche Module gerade geladen sind, erfährt man mit lsmod:
# lsmod
Module Size Used by Not tainted
vfat 10476 0 (unused)
fat 31640 0 [vfat]
ipv6 145108 -1 (autoclean)
.....

Dabei haben die Bezeichnungen in Klammern folgende Bedeutungen:
autoclean = das Modul wurde automatisch geladen.
[ ] (eckige Klammern) = das Modul wird von einem anderem Modul benutzt.
-1 (unter used) = Dieses Modul kümmert sich selbst darum, sich zu entladen, wenn es nicht mehr benötigt wird.

Laden von Modulen
Um nun einen Treiber für ein bestimmtes Gerät zu aktivieren, muß das entsprechende Modul in den Kernel geladen werden. Das geht mit modprobe:
# modprobe bttv

Entladen der Module
Zum entladen der Module benutzt man die Option -r:
# modprobe -r bttv
Hinweis: Module können nur entladen werden, wenn sie nicht benutzt werden.

Optionen für Module
Benötigt ein Modul Optionen, müssen diese beim Laden mitgegeben werden, z.B.
# modprobe bttv card=25
gibt dem Modul bttv die Option card=25 mit.

Informationen über Module
welche Optionen ein Modul akzeptiert, kann mit dem Befehl modinfo heraus gefunden werden:
# modinfo bttv
filename: /lib/modules/2.6.26-1-686/kernel/drivers/media/video/bt8xx/bttv.ko
license: GPL
author: Ralph Metzler & Marcus Metzler & Gerd Knorr
description: bttv - v4l/v4l2 driver module for bt848/878 based cards
depends: videobuf-core,videobuf-dma-sg,i2c-core,ir-common,videodev,tveeprom,v4l2-common,btcx-risc,firmware_class,i2c-algo-bit,compat_ioctl32
parm: card:specify TV/grabber card model, see CARDLIST file for a list
........

Jede Zeile die mit parm: beginnt ist eine mögliche Option für das Modul.

Dateien für die Modul-Konfiguration
Leider ist das Laden und Konfigurieren der Module mit modprobe in der Regel nur temporärer Natur. Möchte man die Optionen für Module dauerhaft festlegen, gibt es unter Debian ab Kernel 2.6 dafür folgendes Verzeichnis: /etc/modprobe.d/
Frühere Debian-Versionen hatten dafür eine einzige Konfigurations-Datei, namens /etc/modprobe.conf, jedoch hat man das seit Kernel 2.6 geändert und hat der Modul-Konfiguration ein ganzes Verzeichnis spendiert, eben modprobe.d/.
Hier können Modul-Optionen dauerhaft gespeichert werden, in dem man in dem Verzeichnis eine Datei mit beliebigem Namen anlegt und die Optionen darin angibt. Für die leichtere Orientierung empfiehlt sich als Name die Bezeichnung des Moduls mit der Endung .conf, damit man die Datei leichter als Optionen-Konfigurations-Datei erkennen kann. Für die Zukunft ist die Endung .conf vorgeschrieben. Ein Beispiel für Optionen einer TV-Karte mit bttv-Chipsatz:
# less /etc/modprobe.d/bttv.conf
options bttv card=25

Aliase
Module können auch unter einem anderem Namen angesprochen werden, um z.B. der jeweiligen Netzwerkhardware immer die Bezeichnung eth0 zu geben. Um Module unter einem anderem Namen anzusprechen, genügt eine Zeile in /etc/modprobe.d/aliase, z.B.:
.....
# alias net-pf-1 unix
# alias net-pf-2 ipv4
.....
alias block-major-22-* ide_generic
alias block-major-33-* ide_generic
.....
Bei neueren Debian-Versionen wird allerdings die Bezeichnung eth0 von udev verwaltet und durch eine udev-Regel der entsprechenden Netzwerkkarte zugeordnet.

Module beim booten laden
Normalerweise werden sämtliche Module beim booten von udev geladen. Sollte es wieder erwarten einmal passieren, daß udev ein Modul nicht lädt, hilft es, den entsprechenden Modulnamen in die Datei /etc/modules einzutragen. Optionen kann man einfach hinter dem Modulnamen angeben. Ein Beispiel für einen Eintrag:
bttv card=25

Module am Laden hindern
Um Module schon beim Booten am Laden zu hindern, genügt ein Eintrag in /etc/modprobe.d/blacklist folgender Art:
blacklist bttv
Jedoch können Module noch in der Initial Ramdisk sein und trotzdem geladen werden. Damit auch das verhindert wird, muß die Ramdisk neu gebaut werden mit folgendem Befehl:
# update-initramfs -u -k all

Hinweis:
Nähere Informationen über das Verzeichnis /etc/modprobe.d/ liefert
# man modprobe.conf
Theoretisch wenn die Hardware Erkennung funktioniert, hat man mit dem manuellen laden und entladen von Modulen und ihrer Konfiguration nichts zu tun, da sie von udev gemanaged werden. Wie allerdings alle Automatik Funktionen kann auch diese manchmal nicht funktionieren und man muß von Hand nacharbeiten.

Kernel-Module unter Debian jessie am Laden hindern (blacklisten)

1. Eine Datei unter /etc/modprobe.d/<modulename>.conf mit dem Inhalt blacklist <modulename> erstellen.
2. Den Befehl depmod -ae als root ausführen.
3. Neu erstellen der initrd mittels update-initramfs -u