Ein Update hat das System zerschossen: Plötzlich funktionieren Drucker, Scanner und andere Geräte nicht mehr, da sie eigene Treiber und Module benötigen. Bringt ein aktualisierter Kernel sie nicht von Haus aus mit, ist die betroffene Peripherie erst einmal nutzlos. Bei Linux sind der Kernel und die Module eins zu eins aufeinander abgestimmt. Passen sie nicht zueinander, lassen sich die Treiber nicht laden, geschweige denn verwenden.
Knigge für die Struktur von Modul-Quellcodes
Als Ausweg aus diesem Schlamassel hatte der PC-Hersteller Dell bereits 2003 für eigene Kunden und als Beitrag zur Linux-Entwicklung den Dynamic Kernel Module Support (DKMS) konzipiert [1]. Einmal installiert wird DKMS bei jedem Update des Kernels aktiv. Das Werkzeug kümmert sich um außerhalb des normalen Kernel-Quellcodes gepflegte Treiber: Sobald der Admin die Treiber angemeldet hat, übersetzt und installiert DKMS sie bei jeder Aktualisierung des Kerns.
Dazu müssen jedoch die Treiber- und Kernelmodul-Programmierer DKMS explizit unterstützen. Zum Glück fällt dies Entwicklern leicht, denn es nützt ihnen, dass die Software als Beigabe automatisch Deb- und RPM-Installationspakete baut.
Um den eigenen Quellcode DKMS anzuvertrauen, muss der Entwickler einige Konventionen einhalten und eine Konfigurationsdatei verfassen. So erwartet DKMS den Quellcode eines Moduls in einem Unterverzeichnis von »/usr/src/«
. Sein Name setzt sich aus Paket und Versionsnummer zusammen.
DKMS organisiert Module nämlich in Paketen, die eine eindeutige Version haben. Ein Paket darf dabei auch mehrere Module beinhalten. Enthält ein Paket nur ein Modul, legt der Entwickler seinen Quellcode direkt in dem neuen Ordner ab. Ansonsten erhält jedes Modul ein eigenes Unterverzeichnis.
Prominentes Beispiel dafür ist die Virtualisierungslösung Virtual Box: Das Paket nennt sich »vboxhost«
und seine Version von Anfang Februar ist »4.0.0«
. Damit lautet das Paketverzeichnis »/usr/src/vboxhost-4.0.0/«
. Da Virtual Box für den Betrieb den Basistreiber »vboxdrv«
, den Treiber für die virtuelle Netzwerkkarte »vboxnetadp«
sowie einen für den Netzfilter »vboxnetflt«
mitbringt, befinden sich unterhalb des Paketverzeichnisses drei Ordner mit diesen Namen (siehe Abbildung 1).
Abbildung 1: Um mit DKMS ein Modul zu verwalten, legt der Admin unter /usr/src eine Verzeichnis- und Dateistruktur an und richtet sie in dkms.conf ein.
Pflegehinweise beachten
Auch wenn ein Paket mehrere Module hat, erwartet DKMS pro Paket genau eine Konfigurationsdatei. Sie trägt den Namen »dkms.conf«
und befindet sich direkt im Paketverzeichnis. Einstellungen macht der Systemverwalter in Form von Variablenzuweisungen – das als Bash-Skript verfasste Tool verleibt sich die Datei per »source«
ein. Die Modulverwaltung erfordert mindestens Angaben zum Paketnamen, zur Version und zu den Modulnamen (siehe Listing 1). Die durch »yes«
aktivierte Variable »AUTOINSTALLER«
sorgt letztlich dafür, dass DKMS beim nächsten Kernelupdate alle betroffenen Module passend übersetzt und installiert.
01 /* Dummy-Modul erklärt Funktionsweise von DKMS: */
02 #include <linux/module.h>
03
04 static int __init lm_init(void)
05 {
06 printk("Linux-Magazin Modulinitialisierung\n");
07 return 0;
08 }
09
10 static void __exit lm_exit(void)
11 {
12 printk("Linux-Magazin Deinitialisierung\n");
13 return;
14 }
15
16 module_init(lm_init);
17 module_exit(lm_exit);
18 MODULE_LICENSE("GPL");
Ubuntu kennt das praktische Subsystem in seinem Repository als Paket »dkms«
, das ein gleichnamiges Tool installiert. Es beherrscht insgesamt 13 Kommandos, im Alltag benötigen Entwickler und Admins aber nur die acht Befehle aus Abbildung 2 (siehe Kasten "Hinter den Kulissen"). Getreu dem Grundprinzip, Linux möglichst unangetastet zu lassen und Änderungen rückgängig machen zu können, übernimmt DKMS seine zu verwaltenden Module in eine eigene Datenbasis, die es unterhalb von »/var/lib/dkms/«
speichert.
Ein 4000-Zeilen-Bash-Skript bildet das Rückgrat von DKMS. Es legt Kopien der Originaldateien an, überprüft, ob die Voraussetzungen zum Generieren eines Moduls erfüllt sind, übersetzt es für mehrere Kernelversionen, kopiert das Ergebnis in die zugehörigen Verzeichnisse und lädt das Modul – falls gewünscht – in den aktuell laufenden Betriebssystemkern. DKMS erzeugt auch initiale Ramdisks [2]. Es passt die Konfigurationsdateien für das Laden der Module in »/etc/modprobe.d/«
an, falls sie Parameter benötigen oder Anwender sie per Alias ansprechen sollen.
Neben den modulspezifischen Konfigurationen findet DKMS im Ordner »/etc/dkms/«
in der Datei »framework.conf«
seine globale Konfiguration vor. Zu ihr gehören die Pfade zum Quellcode, wohin das Werkzeug die erzeugten Module speichern soll und wo temporäre Dateien residieren. Sämtliche Konfigurationen, sowohl die modulspezifischen als auch die globalen, bindet DKMS über Shellvariablen ein. Im Verzeichnis »/etc/dkms/«
liegen außerdem Template-Dateien, die die Paketierung benötigt. Typischerweise muss der Entwickler sie jedoch nicht anfassen.
Automatisch in die Aktualisierung einbinden
Neben dem eigentlichen Tool »dkms«
gehört noch das Skript »dkms_autoinstaller«
zum Projekt. Ein Dreizeiler im Verzeichnis »/etc/kernel/postinst.d/«
startet es auf einem Ubuntu-System. Das Skript wiederum durchsucht per »find«
alle unter »/var/lib/dkms/«
liegenden Konfigurationen mit dem Namen »dkms.conf«
. Steht in einer der Konfigurationsdateien die Variable »AUTOINSTALL«
auf »yes«
, ruft der automatische Installateur die Kommandos »dkms build«
und »dkms install«
auf.
DKMS arbeitet die skizzierten Kommandos nicht plump ab, sondern passt sie je nach Distribution an und kennt dazu RPM-basierte Systeme wie Red Hat, Fedora oder Open Suse genauso wie Debian-Derivate. Ein dediziertes Fehlermanagement sorgt für den reibungslosen Betrieb: Dazu gehört, dass das Tool beispielsweise vorhandene Module gleichen Namens sichert und später bei Bedarf wieder zurückspielt.
Abbildung 2: DKMS kennt viele Subkommandos. Mit add macht der Admin ein Paket bekannt, mit build baut er es für den lokalen Gebrauch und aktiviert es mit install. Weitere Befehle machen diese Schritte rückgängig, informieren über den Status oder bauen als Bonus Installationspakete für andere Rechner.
Der Aufruf von »dkms add«
pflegt ein neues Modul in die Datenbasis ein. Dazu legt das Tool ein Directory für das neue Paket und anschließend ein Unterverzeichnis für die zugehörige Version an. Ein symbolischer Link verweist auf das Quellcode-Verzeichnis mit der Datei »dkms.conf«
. Weil es Paketname und Version aufspaltet, verwaltet DKMS übersichtlich mehrere Releases der gleichen Komponente.