DKMS
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 22.10 Kinetic Kudu
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Artikel für fortgeschrittene Anwender
Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
DKMS 🇬🇧 steht für Dynamic Kernel Module Support. Das von Dell entwickelte Hilfsprogramm überwacht, ob zusätzliche Kernelmodule manuell installiert wurden und aktualisiert die Module immer dann, wenn ein neuer oder aktualisierter Kernel installiert wird. Dies ist insofern praktisch, dass das Kompilieren des Kernelmoduls nicht immer von Hand durchgeführt werden muss, wenn der Kernel aktualisiert wurde.
Hat man also z.B. zusätzliche Treiber in Form von selbstkompilierten Kernelmodulen von Hand installiert, so stehen diese in der Regel direkt nach dem ersten Neustart (nach dem Kernelupdate) wieder zur Verfügung. DKMS prüft entweder bei der Installation eines neuen Kernels oder spätestens beim Rechnerstart, ob die passenden Module für den aktuellen Kernel vorhanden sind und erstellt diese bei Bedarf automatisch.
Praktisch wird DKMS meist bei proprietären (unfreien) Treibern für Grafikkarten und RAID-Controller sowie Softwarelösungen zur Virtualisierung eingesetzt, also Bereiche, bei denen ein Kernelupdate unter Umständen zu einem nicht mehr funktionierendem System bzw. Programm führen kann.
Installation¶
DKMS kann über folgende Pakete installiert [1] werden:
build-essential (zum Übersetzen des Quellcodes)
dkms
Befehl zum Installieren der Pakete:
sudo apt-get install build-essential dkms
Oder mit apturl installieren, Link: apt://build-essential,dkms
Konfiguration¶
DKMS wird über eine einzelne Datei konfiguriert. Die Standardkonfiguration findet man unter Ubuntu im Verzeichnis /etc/dkms/framework.conf. Die Datei ist relativ kurz und gut kommentiert, weitere Informationen findet man auch in der Manpage zu DKMS. Ein Anpassung der Datei ist in der Regel nicht notwendig.
Benutzung¶
Ist DKMS installiert, nimmt es die Arbeit ohne weiteres Zutun direkt auf. Weiterhin wird DKMS bei jedem Systemstart über ein init-Skript automatisch gestartet.
Installiert man von Hand ein Kernelmodul (z.B. mittels des module-assistant), so fließt es direkt in die Liste der überwachten Module ein. Möchte man wissen, welche Module aktuell von DKMS überwacht werden, so kann man dies abfragen oder schaut alternativ in das Verzeichnis /var/lib/dkms. Für jedes Kernelmodul existiert hier ein Unterverzeichnis mit dem Namen des Moduls. Innerhalb der jeweiligen Unterverzeichnisse findet man den Quellen des Moduls sowie die kompilierten Module für die jeweiligen Kernel.
dkms status ls -l /var/lib/dkms
Manuell¶
Auch wenn DKMS unter Ubuntu quasi "vollautomatisch" läuft, bietet es eine Reihe von Möglichkeiten, manuell einzugreifen.
Die allgemeine Syntax von DKMS lautet [3]:
dkms AKTION OPTION
AKTION
kann dabei z.B. das manuelle Hinzufügen (add
) oder Entfernen (remove
) eines Moduls zu DKMS sein oder auch das von Hand angestoßene Kompilieren (build
) und Installieren (install
) des Moduls. Dies funktioniert auch für einen anderen Kernel als den aktuell laufenden. Als OPTION
kann z.B. angegeben werden, für welchen Kernel oder welche (Prozessor-) Architektur das Modul gebaut werden soll. Recht ausführlich kann man alle Aktionen und Optionen in der Manpage von DKMS nachlesen.
Weiterhin wird noch eine Datei dkms.conf benötigt bzw. diese ist von Hand anzulegen. Diese enthält einige Informationen über das Kernelmodul, welche von DKMS eingelesen werden. Die möglichen Angaben für die dkms.conf sind ebenfalls in der Manpage dokumentiert.
Beispiel¶
Gegeben sei ein Quelltextarchiv mit dem fiktiven Namen xyz-1.2.3.tar.gz, das nicht aus den offiziellen Paketquellen stammt, sondern beispielsweise vom Hersteller der Hardware-Komponente mitgeliefert wird. Dieses wird zuerst einmal im Homeverzeichnis entpackt. Das Archiv enthält dabei in der Regel
einige Textdateien (README, INSTALL, NEWS etc.) mit Informationen, die zuerst gelesen werden sollten
zur Kompilieren erforderliche Dateien wie Makefile, configure etc.
und einen Unterordner src, der den eigentlichen Quellcode enthält.
Nun wird der Archivinhalt mit Root-Rechten in einen Ordner unterhalb von /usr/src/ kopiert. Die Benennung des Unterordners folgt dabei immer dem Schema MODULNAME-VERSION
, also praktisch /usr/src/xyz-1.2.3/. Falls das Archiv Unterordner enthält, müssen auch diese kopiert werden.
Im nächsten Schritt wird eine Datei /usr/src/xyz-1.2.3/dkms.conf mit Root-Rechten und folgendem Inhalt angelegt:
PACKAGE_NAME=xyz PACKAGE_VERSION=1.2.3 DEST_MODULE_LOCATION=/extra BUILT_MODULE_NAME=xyz BUILT_MODULE_LOCATION=src/ MAKE="'make' -C src/ all" CLEAN="'make' -C src/ clean" AUTOINSTALL="yes"
Erwähnenswert ist hier die Option -C src/
. Da sich im Beispiel der eigentliche Quellcode in einem Unterordner befindet, wird hierüber angegeben, wo DKMS den Quellcode suchen soll. Falls ein Quelltextarchiv keine Unterordner enthält, kann man diese Option auch weglassen.
Das Kompilieren mittels DKMS wird mit folgenden Schritten getestet:
Mit dem Befehl:
sudo dkms add -m xyz -v 1.2.3
wird das Kompilieren von
xyz
vorbereitet.Der eigentliche Kompilierungsvorgang wird mit:
sudo dkms build -m xyz -v 1.2.3
gestartet.
Abschließend erfolgt die Installation des Kernelmoduls:
sudo dkms install -m xyz -v 1.2.3
Nur erforderlich, wenn man das Kernelmodul wieder aus DKMS entfernen möchte:
sudo dkms remove -m xyz -v 1.2.3 --all
Alternative Syntax zur Installation mit einem einzigen Schritt ... (vereinfacht):
sudo dkms install Modulname/Version
... und Deinstallation:
sudo dkms remove Modulname/Version --all
Soll eine andere oder neuere Quellcodevariante installiert werden, muss zuvor zusätzlich der Quellcode manuell in /usr/src
und ggf. auch in /var/lib/dkms
entfernt werden!
Gibt es bei einem dieser Schritte Probleme, informiert DKMS darüber mit entsprechenden (englischen) Meldungen. Leider kann es passieren, das sich der Quellcode nicht unter dem installierten Kernel übersetzen lässt. Dieses kann unterschiedliche Ursachen haben, die eine Anpassung des Quellcodes erforderlich machen. Zum Beispiel ändern sich manchmal interne Schnittstellen im Kernel oder der Pfad zu System-Bibliotheken. Diese Probleme würden jedoch auch beim manuellen Kompilieren ohne DKMS auftreten.
Experten-Info:
Empfehlenswert ist vor dem Einsatz von DKMS ein manuelles Kompilieren des Quellcodes [2], um bereits hier auftretende Fehler zu erkennen und gegebenenfalls zu beheben.
Problembehebung¶
Kernelquellen nicht installiert¶
Tritt bei Verwendung von DKMS folgende Meldung auf – zum Beispiel während der Installation eines Pakets oder während anderer Verwendung des Paketmanagers im Zusammenhang mit Treibern oder Kerneln – so sind für den verwendeten Kernel die Header nicht vorhanden:
Module build for the currently running kernel was skipped since the kernel source for this kernel does not seem to be installed.
Die Header können über die Paketverwaltung installiert werden. Je nachdem, wie der Kernel installiert worden ist, sei auf die Artikel Kernel oder Mainline-Kernel verwiesen. Nach Installation der Header wird DKMS das zuvor fehlgeschlagene Kompilieren und Installieren der Module erneut anstoßen.
Kernel Modul wurde nach dem Kernel Update nicht neu gebaut¶
Falls nach einem Kernel Update ein Kernel Modul (das aus den Paketquellen installiert wurde) nicht oder nicht richtig gebaut wurde kann es reichen dies einfach noch einmal manuell anzustoßen:
sudo dpkg-reconfigure kernel-modul-paket-name
oder vereinfacht:
sudo dkms autoinstall
Auch hier werden ggf. entsprechende Fehlermeldungen angezeigt.
Links¶
DKMS 🇬🇧 im Ubuntu-Wiki
Kernel Korner - Exploring Dynamic Kernel Module Support (DKMS) 🇬🇧 - Grundlagenartikel, 09/2003
RocketRAID 2310 RAID Host Adapter mit DKMS unter Ubuntu installieren 🇩🇪 - Blogbeitrag 12/2010, kann als Beispiel genutzt werden