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
Module | Size | Used by |
ctr | 16384 | 2 |
ccm | 20480 | 6 |
nvidia | 20480 | 10 |
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
|