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
5.10.0-28-amd64 #1 SMP Debian 5.10.209-2 (2024-01-31)

Durch die Kernel Bezeichnung 5.10.0-28-amd64 weiß man, daß das Verzeichnis für die Kernelmodule /lib/modules/5.10.0-28-amd64 sein muß. Eine Liste aller verfügbaren Module kann man sich mittels folgendem Befehl ausgeben lassen:
# find /lib/modules/`uname -r`/ -type f -name "*ko"
.....
/lib/modules/5.10.0-28-amd64/kernel/net/atm/atm.ko
/lib/modules/5.10.0-28-amd64/kernel/net/atm/br2684.ko
.....

Wie man sieht, haben Kernelmodule die Endung .ko
Welche Module gerade geladen sind, erfährt man mit lsmod:
# lsmod
ModuleSizeUsed by
ctr163842
ccm204806
nvidia2048010
snd_hda_intel     45056     2 snd_hda_codec,snd_hda_core
.....

  • Module - Diese Spalte zeigt den Namen des geladenen Kernel-Moduls an. Ein Modul ist ein Stück Software, das Funktionen oder Treiber für den Kernel bereitstellt und oft Hardware-Komponenten oder zusätzliche Systemfunktionen unterstützt.
  • Size - Diese Spalte zeigt die Größe des Moduls in Bytes an (üblicherweise in Kibibytes, d.h., 1024 Bytes), was anzeigt, wie viel Speicher das Modul im Kernel-Raum belegt. Die Angabe dient als Anhaltspunkt für den Speicherverbrauch des jeweiligen Moduls.
  • Used by - Diese Spalte zeigt an, wie oft ein Modul von anderen Modulen oder Prozessen verwendet wird. Eine 0 bedeutet, dass das Modul aktuell keine Abhängigkeiten hat und daher entladen werden kann, ohne dass es andere Teile des Systems beeinflusst. Eine Zahl größer als 0 zeigt, dass andere Module oder Funktionen das Modul gerade nutzen. Wenn Abhängigkeiten bestehen, werden sie oft direkt aufgelistet und geben an, welche anderen Module dieses Modul gerade verwenden.
In diesem Beispiel wird das nvidia-Modul vom System genutzt, und die Zahl 10 zeigt, wie oft es von anderen Modulen oder Prozessen referenziert wird. snd_hda_intel ist ein Audiotreiber und wird von zwei anderen Modulen (snd_hda_codec und snd_hda_core) verwendet.

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/5.10.0-28-amd64/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. Jedoch, wie alle Automatik Funktionen, kann auch diese manchmal versagen 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