DKMS

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

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:

  1. Installation von Programmen

  2. Programme bzw. Kernelmodule aus dem Quelltext übersetzen

  3. Ein Terminal öffnen

Inhaltsverzeichnis
  1. Installation
  2. Konfiguration
  3. Benutzung
  4. Problembehebung
  5. Links

Wiki/Icons/develop.png 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.

Wiki/Icons/synaptic.png

Installation

DKMS kann über folgende Pakete installiert [1] werden:

Paketliste zum Kopieren:

sudo apt-get install build-essential dkms 

Oder mit apturl installieren, Link: apt://build-essential,dkms

Wiki/Icons/settings.png

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.

Wiki/Icons/hint.png

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:

  1. Mit dem Befehl:

    sudo dkms add -m xyz -v 1.2.3 

    wird das Kompilieren von xyz vorbereitet.

  2. Der eigentliche Kompilierungsvorgang wird mit:

    sudo dkms build -m xyz -v 1.2.3 

    gestartet.

  3. Abschließend erfolgt die Installation des Kernelmoduls:

    sudo dkms install -m xyz -v 1.2.3 
  4. 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.