GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So laden oder entladen Sie ein Linux-Kernel-Modul

Dieser Artikel ist ein Auszug aus Kapitel 15 von Linux in Action, herausgegeben von Manning.

Linux verwaltet Hardware-Peripheriegeräte mithilfe von Kernelmodulen. So funktioniert das.

Ein laufender Linux-Kernel ist eines der Dinge, die Sie nicht stören sollten. Schließlich ist der Kernel die Software, die alles steuert, was Ihr Computer tut. Wenn man bedenkt, wie viele Details gleichzeitig auf einem Live-System verwaltet werden müssen, ist es besser, den Kernel mit so wenig Ablenkung wie möglich seine Arbeit erledigen zu lassen. Aber wenn es unmöglich ist, selbst kleine Änderungen an der Computerumgebung vorzunehmen, ohne das gesamte System neu zu starten, kann das Anschließen einer neuen Webcam oder eines neuen Druckers zu einer schmerzhaften Unterbrechung Ihres Arbeitsablaufs führen. Jedes Mal neu starten zu müssen, wenn Sie ein Gerät hinzufügen, damit das System es erkennt, ist kaum effizient.

Um ein effektives Gleichgewicht zwischen den gegensätzlichen Tugenden Stabilität und Benutzerfreundlichkeit zu schaffen, isoliert Linux den Kernel, lässt Sie jedoch spezifische Funktionen im Handumdrehen durch ladbare Kernelmodule (LKMs) hinzufügen. Wie in der Abbildung unten gezeigt, können Sie sich ein Modul als eine Software vorstellen, die dem Kernel mitteilt, wo er ein Gerät finden und was damit zu tun ist. Der Kernel wiederum stellt das Gerät Benutzern und Prozessen zur Verfügung und überwacht seinen Betrieb.

Nichts hindert Sie daran, Ihr eigenes Modul zu schreiben, um ein Gerät genau so zu unterstützen, wie Sie es möchten, aber warum sollten Sie sich die Mühe machen? Die Linux-Modulbibliothek ist bereits so robust, dass Sie normalerweise keine eigene erstellen müssen. Und in den allermeisten Fällen lädt Linux automatisch das Modul eines neuen Geräts, ohne dass Sie es überhaupt wissen.

Dennoch gibt es Zeiten, in denen es aus irgendeinem Grund nicht von selbst passiert. (Sie wollen diesen Personalchef nicht zu lange ungeduldig darauf warten lassen, dass Ihr lächelndes Gesicht zum Bewerbungsgespräch per Videokonferenz kommt.) Um die Sache voranzutreiben, sollten Sie etwas mehr über Kernel-Module und insbesondere verstehen , wie Sie das eigentliche Modul finden, das Ihr Peripheriegerät ausführt, und wie Sie es dann manuell aktivieren.

Kernel-Module finden

Gemäß anerkannter Konvention sind Module Dateien mit der Erweiterung .ko (Kernel-Objekt), die sich unterhalb von /lib/modules/ befinden Verzeichnis. Bevor Sie jedoch ganz nach unten zu diesen Dateien navigieren, müssen Sie wahrscheinlich eine Auswahl treffen. Da Sie beim Booten die Möglichkeit haben, eine Version aus einer Liste von Versionen zu laden, muss die spezifische Software, die zur Unterstützung Ihrer Auswahl erforderlich ist (einschließlich der Kernel-Module), irgendwo vorhanden sein. Nun, /lib/modules / ist einer von diesen irgendwo. Und dort finden Sie Verzeichnisse, die mit den Modulen für jede verfügbare Linux-Kernel-Version gefüllt sind; zum Beispiel:

$ ls /lib/modules
4.4.0-101-generic
4.4.0-103-generic
4.4.0-104-generic

In meinem Fall ist der aktive Kernel die Version mit der höchsten Release-Nummer (4.4.0-104-generic), aber es gibt keine Garantie dafür, dass dies auch bei Ihnen der Fall ist (Kernel werden häufig aktualisiert). Wenn Sie mit Modulen arbeiten, die Sie auf einem Live-System verwenden möchten, müssen Sie sicherstellen, dass Sie den richtigen Verzeichnisbaum haben.

Weitere Linux-Ressourcen

  • Spickzettel für Linux-Befehle
  • Spickzettel für fortgeschrittene Linux-Befehle
  • Kostenloser Online-Kurs:RHEL Technical Overview
  • Spickzettel für Linux-Netzwerke
  • SELinux-Spickzettel
  • Spickzettel für allgemeine Linux-Befehle
  • Was sind Linux-Container?
  • Unsere neuesten Linux-Artikel

Gute Nachrichten:Es gibt einen zuverlässigen Trick. Anstatt das Verzeichnis anhand des Namens zu identifizieren und zu hoffen, dass Sie das richtige finden, verwenden Sie die Systemvariable, die immer auf den Namen des aktiven Kernels zeigt. Sie können diese Variable mit uname -r aufrufen (das -r gibt die Kernel-Versionsnummer aus den Systeminformationen an, die normalerweise angezeigt würden):

$ uname -r
4.4.0-104-generic

Mit diesen Informationen können Sie uname integrieren in Ihre Dateisystemreferenzen mithilfe eines Prozesses, der als Befehlsersetzung bekannt ist . Um zum Beispiel zum richtigen Verzeichnis zu navigieren, würden Sie es zu /lib/modules hinzufügen . Um Linux mitzuteilen, dass "uname" kein Speicherort im Dateisystem ist, schließen Sie uname ein Teil in Backticks, wie folgt:

$ ls /lib/modules/`uname -r`
build   modules.alias        modules.dep      modules.softdep
initrd  modules.alias.bin    modules.dep.bin  modules.symbols
kernel  modules.builtin      modules.devname  modules.symbols.bin
misc    modules.builtin.bin  modules.order    vdso

Sie finden die meisten Module in ihren Unterverzeichnissen unter dem kernel/ Verzeichnis. Nehmen Sie sich ein paar Minuten Zeit, um durch diese Verzeichnisse zu blättern, um eine Vorstellung davon zu bekommen, wie die Dinge angeordnet sind und was verfügbar ist. Die Dateinamen geben Ihnen normalerweise eine gute Vorstellung davon, was Sie gerade sehen.

$ ls /lib/modules/`uname -r`/kernel
arch  crypto  drivers  fs  kernel  lib  mm
net  sound  ubuntu  virt  zfs

Das ist eine Möglichkeit, Kernel-Module zu finden; Eigentlich ist es der schnelle und schmutzige Weg, dies zu tun. Aber es ist nicht der einzige Weg. Wenn Sie den vollständigen Satz erhalten möchten, können Sie alle derzeit geladenen Module zusammen mit einigen grundlegenden Informationen auflisten, indem Sie lsmod verwenden . Die erste Spalte dieser abgeschnittenen Ausgabe (es wären viel zu viele, um sie hier aufzulisten) ist der Modulname, gefolgt von der Dateigröße und -nummer und dann den Namen anderer Module, von denen jedes abhängig ist:

$ lsmod
[...]
vboxdrv          454656  3 vboxnetadp,vboxnetflt,vboxpci
rt2x00usb        24576  1 rt2800usb
rt2800lib        94208  1 rt2800usb
[...]

Wie viele sind viel zu viele? Nun, lassen Sie uns lsmod ausführen noch einmal, aber dieses Mal wird die Ausgabe an wc -l weitergeleitet um die Anzahl der Zeilen zu erhalten:

$ lsmod | wc -l
113

Das sind die geladenen Module. Wie viele sind insgesamt verfügbar? Führen Sie modprobe -c aus und das Zählen der Zeilen ergibt diese Zahl:

$ modprobe -c | wc -l
33350

Es gibt 33.350 verfügbare Module!?! Es sieht so aus, als hätte jemand im Laufe der Jahre hart daran gearbeitet, uns die Software zur Verfügung zu stellen, mit der wir unsere physischen Geräte betreiben können.

Weitere Linux-Ressourcen

  • Spickzettel für Linux-Befehle
  • Spickzettel für fortgeschrittene Linux-Befehle
  • Kostenloser Online-Kurs:RHEL Technical Overview
  • Spickzettel für Linux-Netzwerke
  • SELinux-Spickzettel
  • Spickzettel für allgemeine Linux-Befehle
  • Was sind Linux-Container?
  • Unsere neuesten Linux-Artikel

Hinweis:Auf einigen Systemen stoßen Sie möglicherweise auf benutzerdefinierte Module, auf die entweder mit ihren eindeutigen Einträgen in /etc/modules verwiesen wird Datei oder als Konfigurationsdatei gespeichert unter /etc/modules-load.d/ . Die Chancen stehen gut, dass solche Module das Produkt lokaler Entwicklungsprojekte sind, die möglicherweise hochmoderne Experimente beinhalten. In jedem Fall ist es gut, eine Vorstellung davon zu haben, was Sie gerade sehen.

So finden Sie Module. Ihre nächste Aufgabe ist es, herauszufinden, wie Sie ein inaktives Modul manuell laden können, wenn es aus irgendeinem Grund nicht von selbst geschehen ist.

Kernel-Module manuell laden

Bevor Sie ein Kernel-Modul laden können, schreibt die Logik vor, dass Sie bestätigen müssen, dass es existiert. Und bevor Sie das tun können, müssen Sie wissen, wie es heißt. Diesen Teil zu bekommen, erfordert manchmal zu gleichen Teilen Magie und Glück und etwas Hilfe von der harten Arbeit der Autoren der Online-Dokumentation.

Ich werde den Prozess veranschaulichen, indem ich ein Problem beschreibe, auf das ich vor einiger Zeit gestoßen bin. Eines schönen Tages funktionierte die WiFi-Schnittstelle eines Laptops aus einem mir noch unbekannten Grund nicht mehr. Genau so. Vielleicht hat es ein Software-Update ausgeknockt. Wer weiß? Ich habe lshw -c network ausgeführt und wurde mit dieser sehr seltsamen Information konfrontiert:

network UNCLAIMED
    AR9485 Wireless Network Adapter

Linux erkannte die Schnittstelle (den Atheros AR9485), listete sie jedoch als nicht beansprucht auf. Nun, wie sie sagen:"Wenn es hart auf hart kommt, suchen die Harten im Internet." Ich habe nach atheros ar9 linux module gesucht und nachdem ich seitenweise fünf- und sogar 10 Jahre alte Ergebnisse durchgesehen hatte, die mir rieten, entweder mein eigenes Modul zu schreiben oder einfach aufzugeben, entdeckte ich schließlich, dass (mindestens mit Ubuntu 16.04) ein funktionierendes Modul existierte. Sein Name ist ath9k.

Ja! Der Kampf ist so gut wie gewonnen! Das Hinzufügen eines Moduls zum Kernel ist viel einfacher als es klingt. Um zu überprüfen, ob es verfügbar ist, können Sie find ausführen gegen den Verzeichnisbaum des Moduls, geben Sie -type f an um Linux mitzuteilen, dass Sie nach einer Datei suchen, und fügen Sie dann die Zeichenfolge ath9k hinzu zusammen mit einem Glob-Sternchen, um alle Dateinamen einzuschließen, die mit Ihrer Zeichenfolge beginnen:

$ find /lib/modules/$(uname -r) -type f -name ath9k*
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_common.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_htc.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_hw.ko

Nur noch ein Schritt, laden Sie das Modul:

# modprobe ath9k

Das ist es. Keine Neustarts. Keine Aufregung.

Hier ist ein weiteres Beispiel, das Ihnen zeigt, wie Sie mit beschädigten aktiven Modulen arbeiten können. Es gab eine Zeit, in der die Verwendung meiner Logitech-Webcam mit einer bestimmten Software die Kamera bis zum nächsten Systemstart für andere Programme unzugänglich machte. Manchmal musste ich die Kamera in einer anderen Anwendung öffnen, hatte aber keine Zeit, sie herunterzufahren und neu zu starten. (Ich führe viele Anwendungen aus, und es dauert einige Zeit, sie alle nach dem Booten an Ort und Stelle zu bekommen.)

Da dieses Modul vermutlich aktiv ist, verwenden Sie lsmod um nach dem Wort Video zu suchen sollte mir einen Hinweis auf den Namen des entsprechenden Moduls geben. Tatsächlich ist es besser als ein Hinweis:Das einzige Modul, das mit dem Wort Video beschrieben wird ist uvcvideo (wie Sie im Folgenden sehen können):

$ lsmod | grep video
uvcvideo               90112  0
videobuf2_vmalloc      16384  1 uvcvideo
videobuf2_v4l2         28672  1 uvcvideo
videobuf2_core         36864  2 uvcvideo,videobuf2_v4l2
videodev              176128  4 uvcvideo,v4l2_common,videobuf2_core,videobuf2_v4l2
media                  24576  2 uvcvideo,videodev

Es gab wahrscheinlich etwas, das ich hätte kontrollieren können, das den Absturz verursachte, und ich denke, ich hätte ein bisschen tiefer graben können, um zu sehen, ob ich die Dinge richtig beheben konnte. Aber Sie wissen, wie es ist; Manchmal ist Ihnen die Theorie egal und Sie möchten einfach nur, dass Ihr Gerät funktioniert. Also habe ich rmmod verwendet um das uvcvideo-Modul und modprobe zu beenden um es wieder ganz schön frisch zu starten:

# rmmod uvcvideo
# modprobe uvcvideo

Auch hier:keine Neustarts. Keine hartnäckigen Blutflecken.


Linux
  1. So aktualisieren Sie den Kernel auf dem Linux-Desktop

  2. Linux – Ein verdorbener Kernel in Linux?

  3. So erstellen, kompilieren und laden Sie ladbare Linux-LKM-Kernel-Module

  4. So schreiben Sie Ihr eigenes Linux-Kernel-Modul mit einem einfachen Beispiel

  5. So laden Sie das SELinux-Modul für Oracleasm

So überprüfen Sie die Kernel-Version in Linux

Modprobe-Befehl unter Linux

So überprüfen Sie Ihre Serverlast unter Linux

So installieren Sie das Modul „Python-Pexpect“ unter Linux

So erstellen Sie einen Linux-Kernel von Grund auf neu

Wie lädt Linux das 'initrd'-Image?