[[Vorlage(getestet, kinetic,bionic)]] [[Vorlage(fortgeschritten)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Programme_kompilieren: Programme bzw. Kernelmodule aus dem Quelltext übersetzen] [:Terminal: Ein Terminal öffnen] }}} [[Inhaltsverzeichnis(1)]] [[Bild(Wiki/Icons/develop.png, 48, align=left)]] [http://linux.dell.com/dkms/ DKMS] {en} steht für '''D'''ynamic '''K'''ernel '''M'''odule '''S'''upport. 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 eine Kernel-Aktualisierung unter Umständen zu einem nicht mehr funktionierendem System bzw. Programm führen kann. [[Bild(Wiki/Icons/synaptic.png, 48, align=right)]] = Installation = DKMS kann über folgende Pakete installiert [1] werden: {{{#!vorlage Paketinstallation build-essential, zum Übersetzen des Quellcodes dkms }}} [[Bild(Wiki/Icons/settings.png, 48, align=right)]] = 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 [:man: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 [:Dienste: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. {{{#!vorlage Befehl 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]: {{{#!vorlage Befehl 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 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 [:man: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. [[Bild(Wiki/Icons/hint.png, 48, align=right)]] === 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: {{{#!vorlage Befehl sudo dkms add -m xyz -v 1.2.3 }}} wird das Kompilieren von `xyz` vorbereitet. 1. Der eigentliche Kompilierungsvorgang wird mit: {{{#!vorlage Befehl sudo dkms build -m xyz -v 1.2.3 }}} gestartet. 1. Abschließend erfolgt die Installation des Kernelmoduls: {{{#!vorlage Befehl sudo dkms install -m xyz -v 1.2.3 }}} 1. Nur erforderlich, wenn man das Kernelmodul wieder aus DKMS entfernen möchte: {{{#!vorlage Befehl sudo dkms remove -m xyz -v 1.2.3 --all }}} Alternative Syntax zur Installation mit einem einzigen Schritt ... (vereinfacht): {{{#!vorlage Befehl sudo dkms install Modulname/Version }}} ... und Deinstallation: {{{#!vorlage Befehl 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. {{{#!vorlage Experten 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 = == Kernel-Quellen 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 der Kernel-Aktualisierung nicht neu gebaut == Falls nach einer Aktualisierung ein Kernel-Modul (das aus den Paketquellen installiert wurde) nicht oder nicht richtig gebaut wurde, kann es ausreichen, dies einfach noch einmal manuell anzustoßen: {{{#!vorlage Befehl sudo dpkg-reconfigure kernel-modul-paket-name }}} oder vereinfacht: {{{#!vorlage Befehl sudo dkms autoinstall }}} Auch hier werden ggf. entsprechende Fehlermeldungen angezeigt. = Links = * [ubuntu_doc:/community/DKMS:DKMS] {en} im Ubuntu-Wiki * [http://www.linuxjournal.com/article/6896 Kernel Korner - Exploring Dynamic Kernel Module Support (DKMS)] {en} - Grundlagenartikel, 09/2003 * [http://www.thomas.maetz-bv.de/2010/12/25/howto-rocketraid-2310-raid-host-adapter-mit-dynamic-kernel-module-support-dkms-unter-ubuntu-installieren/ RocketRAID 2310 RAID Host Adapter mit DKMS unter Ubuntu installieren] {de} - Blogbeitrag 12/2010, kann als Beispiel genutzt werden ## * [:ISDN-Karten/AVM_FRITZ!Card_PCI/DKMS:] - weiteres Beispiel #tag: System, kernel module