linux-kernel-advanced kernel modules drivers dkms troubleshooting internals

Kernel Modules: modprobe & DKMS (Artikel 366)

Beherrschung der Kernel-Module unter Linux. Erfahren Sie alles über das dynamische Laden von Treibern, das Blacklisting problematischer Module und den Einsatz von DKMS für Drittanbieter-Software.

# Kernel Modules Mastery: Hardware-Unterstützung im laufenden Betrieb

TL;DR / Management Summary Ein moderner Kernel ist modular. Treiber für Grafikkarten, Dateisysteme oder Netzwerkkarten liegen als separate Dateien (.ko) vor und werden erst geladen, wenn sie gebraucht werden. Ein Senior Admin muss wissen, wie er Module mit modprobe sicher lädt, wie er problematische Treiber über Blacklisting deaktiviert und wie er mit DKMS sicherstellt, dass Drittanbieter-Treiber (z.B. Nvidia oder ZFS) auch nach einem Kernel-Update automatisch neu gebaut werden.


# 1. Einführung & Architektur

Der Baukasten des Kernels.

Kernel-Module (.ko - Kernel Objects) leben unter /lib/modules/$(uname -r)/. Sie erweitern die Funktionalität des Kernels, ohne dass ein Reboot nötig ist.

# Die Modul-Hierarchie (Mermaid)

graph TD
    A[Linux Kernel] --> B[lsmod: List running modules]
    B --> C[Module: ext4]
    B --> D[Module: virtio_net]
    B --> E[Module: i915 - GPU]
    F[modprobe] -->|Load / Unload| A
    G[DKMS] -->|Auto-Build| B
    H[/etc/modprobe.d/] -->|Blacklist / Options| F

# 2. Management-Tools

Laden, Entladen, Finden.

# lsmod: Was läuft?

lsmod | grep kvm
# Zeigt Module, deren Größe und Abhängigkeiten (Used by).

# modprobe: Der intelligente Lader

Nutzen Sie immer modprobe statt insmod, da es Abhängigkeiten automatisch auflöst.

# Modul laden
sudo modprobe wireguard

# Modul entfernen (nur wenn unbenutzt!)
sudo modprobe -r wireguard

# 3. Persistenz & Konfiguration

Einstellungen zementieren.

# Module beim Booten laden

Legen Sie eine Datei in /etc/modules-load.d/ an:

# /etc/modules-load.d/networking.conf
bonding
8021q

# Blacklisting (Module verbieten)

Wenn ein Treiber Probleme macht (z.B. der freie nouveau Treiber statt nvidia): Datei: /etc/modprobe.d/blacklist.conf

blacklist nouveau
install nouveau /bin/false

# 4. Day-2 Operations: DKMS

Überleben nach dem Update.

Wenn Sie Treiber nutzen, die nicht im Standard-Kernel sind (z.B. ZFS oder Broadcom), nutzen Sie DKMS (Dynamic Kernel Module Support).

# Funktionsweise

DKMS überwacht Kernel-Updates. Sobald ein neuer Kernel installiert wird, triggert DKMS automatisch das Neukompilieren des Treibers gegen die neuen Kernel-Header.

# Status prüfen
sudo dkms status

# 5. Troubleshooting & “War Stories”

Wenn der Treiber klemmt.

# Story 1: “Der hängende Modprobe”

Symptom: Ein modprobe -r Befehl hängt ewig und lässt sich nicht beenden. Ursache: Das Modul wird noch von einem Prozess oder einer Hardware-Ressource benutzt. Der Ref-Count in lsmod ist > 0. Lösung: Finden Sie die Abhängigkeit: lsmod | grep <name>. Beenden Sie den Dienst, der das Modul nutzt (z.B. Docker für Overlay-Module). Erzwingen Sie niemals einen Unload eines benutzten Moduls (-f), da dies fast immer zu einer Kernel-Panic führt.

# Story 2: “Das verschwundene Modul nach Update”

Symptom: Nach einem Reboot sind ZFS-Pools weg. modprobe zfs meldet “Module not found”. Ursache: Das System hat einen neuen Kernel erhalten, aber die passenden Header-Dateien fehlten, sodass DKMS den Treiber nicht bauen konnte. Lösung: Installieren Sie die kernel-devel (RHEL) oder linux-headers (Arch), die exakt zur laufenden Version passen, und führen Sie dkms autoinstall manuell aus.


# 6. Fazit & Empfehlung

  • Pflicht: Nutzen Sie modprobe für alle täglichen Aufgaben.
  • Wahl: Nutzen Sie Blacklisting für alle unnötigen Features (z.B. Firewire, PC-Speaker), um die Angriffsfläche zu verringern.
  • Wartung: Prüfen Sie nach jedem Kernel-Update den Status Ihrer DKMS-Module.

# Anhang: Cheatsheet

Aufgabe Befehl
Liste laufender Module lsmod
Modul laden modprobe <name>
Modul entfernen modprobe -r <name>
Modul-Info modinfo <name>
Modul-Abhängigkeiten modprobe --show-depends <name>
DKMS Status dkms status
Alle installierten Mods find /lib/modules/$(uname -r) -type f -name "*.ko*"
Blacklist Pfad /etc/modprobe.d/
Autostart Pfad /etc/modules-load.d/
Modul Parameter cat /sys/module/<name>/parameters/<param>