Werden Treibermodule automatisch geladen und entladen?

15

Unter Ubuntu 14.04 stellte ich fest, dass das Modul rt2800usbin angezeigt wird , wenn ich meinen externen WLAN-Adapter nicht einstecke lsmod.

  1. Wann erfolgt das automatische Laden eines Treibermoduls? Ist es, wenn das Gerät an den Computer angeschlossen ist oder wenn das Betriebssystem startet?

  2. Wann erfolgt das automatische Entladen eines Treibermoduls? Liegt es daran, dass das Gerät nicht mit dem Computer verbunden ist oder dass das Betriebssystem heruntergefahren wird?

StackExchange für alle
quelle

Antworten:

13

Wenn der Kernel ein neues Gerät erkennt, führt er das Programm aus modprobeund übergibt ihm einen Namen, der das Gerät identifiziert. Die meisten Geräte werden durch registrierte Nummern für einen Hersteller und ein Modell identifiziert , z. B. PCI- oder USB- Kennungen. Das modprobeProgramm durchsucht die Modul-Alias-Tabelle nach dem Namen der Datei, die den Treiber für dieses bestimmte Gerät enthält. Ein ähnliches Prinzip gilt für Treiber für Dinge, die keine Hardwaregeräte sind, wie Dateisysteme und kryptografische Algorithmen. Weitere Einzelheiten finden Sie unter Debian erkennt nach dem Neustart keine serielle PCI-Karte/lib/modules/VERSION/modules.alias

Sobald modprobe identifiziert hat, welche Moduldatei ( .ko) den angeforderten Treiber enthält, lädt es die Moduldatei in den Kernel: Der Modulcode wird dynamisch in den Kernel geladen . Wenn das Modul erfolgreich geladen wurde, wird es in der Liste von angezeigt lsmod.

Das automatische Laden von Modulen erfolgt, wenn der Kernel neue Hot-Plug-fähige Hardware erkennt, z. B. wenn Sie ein USB-Peripheriegerät anschließen. Das Betriebssystem führt auch einen Durchlauf durch, bei dem die gesamte Hardware, die sich zu Beginn des Startvorgangs auf dem System befindet, aufgelistet wird, um Treiber für Peripheriegeräte zu laden, die zum Zeitpunkt des Startvorgangs vorhanden sind.

Es ist auch möglich, das Laden eines Moduls manuell mit dem Befehl modprobeoder anzufordern insmod. Die meisten Distributionen enthalten ein Startskript, das die in aufgelisteten Module lädt /etc/modules. Module können auch geladen werden, wenn sie von einem Modul abhängen: Wenn Modul A von Modul B abhängt, wird modprobe AB vor dem Laden von A geladen .

Sobald ein Modul geladen ist, bleibt es geladen, bis es explizit entladen wird, selbst wenn alle Geräte, die diesen Treiber verwenden, getrennt wurden. Vor langer Zeit gab es einen Mechanismus zum automatischen Entladen nicht verwendeter Module, der jedoch entfernt wurde, wenn ich mich richtig erinnere, als udev auf die Bühne kam. Ich vermute, dass das automatische Entladen von Modulen kein alltägliches Merkmal ist, da die Systeme, die es normalerweise benötigen würden, meistens Desktop-PCs sind, die sowieso viel Speicher haben (auf der Skala des Treibercodes).

Gilles 'SO - hör auf böse zu sein'
quelle
Vielen Dank. Ich habe nicht geändert /etc/modules. rt2800usbist in der Ausgabe von lsmodund bedeutet das, dass ich sein Gerät vor dem Booten an meinen Computer angeschlossen habe?
StackExchange for All
1
@Tim Wenn das Modul geladen ist und Sie es nicht explizit geladen haben und es nicht in aufgeführt /etc/modulesist, liegt dies vermutlich daran, dass das Gerät irgendwann vorhanden war.
Gilles 'SO- hör auf böse zu sein'
5

Module werden geladen, wenn das System über die Initial RAM Disk (initrd) gestartet wird . In der Begründung heißt es:

Viele Linux-Distributionen liefern ein einzelnes generisches Linux-Kernel-Image aus - eines, das die Entwickler der Distribution speziell für das Booten auf einer Vielzahl von Hardwarekomponenten erstellen. Die Gerätetreiber für dieses generische Kernel-Image sind als ladbare Kernel-Module enthalten, da das statische Kompilieren vieler Treiber in einem Kernel dazu führt, dass das Kernel-Image viel größer ist, möglicherweise zu groß, um auf Computern mit begrenztem Speicher zu starten. Dies wirft dann das Problem auf, die Module zu erkennen und zu laden, die zum Mounten des Root-Dateisystems beim Booten erforderlich sind, oder zu ermitteln, wo oder was sich das Root-Dateisystem befindet.

Ubuntu lädt wie viele andere Distributionen jeden Gerätetreiber in diese initrd, unabhängig davon, ob der Treiber benötigt wird oder nicht, und auch unabhängig davon, ob das Gerät auf dem System vorhanden ist oder nicht. Wie Giles betonte, wird das Ganze in den RAM geladen, und dann werden die verwendeten Module beim Start erkannt und die nicht verwendeten werden aus dem RAM entfernt. Durch diese Vorgehensweise wird sichergestellt, dass Ubuntu unabhängig vom Setup auf jedem System gestartet wird. Ubuntu ahmt einen monolithischen Kernel mit Hilfe von Mikrokernel-Konstrukten nach. Siehe Der Grund, warum dies funktioniert


  1. Das Modul rt2800usbwird immer beim Booten geladen werden , da das Modul in dem aufgenommen wurde Initramfs dass Gilles bezeichnet. Das initramfs ist ein Nachfolger des initrd, daher wird es immer von angezeigt lsmod. Beachten Sie, dass Sie ein neu kompiliertes Modul in den Kernel einfügen können, indem Sie modprobegefolgt vom Modulnamen verwenden.

Starten Sie Ihr System zum Test neu, während der WLAN-Adapter nicht angeschlossen ist. Wenn alles lsmodin Ordnung ist, wird das Modul nicht in der Ausgabe aufgeführt, da der vom initramfs und dem init-System während des Startvorgangs gestartete Erkennungsprozess das Gerät nicht gefunden hat und das Modul aus dem RAM entfernt wurde.

  1. Um ein Modul zu entfernen, während ein System ausgeführt wird, können Sie Befehle wie rmmododer modprobe -rgefolgt vom Modulnamen verwenden. Beim nächsten Start wird das Modul neu geladen. Siehe oben. In den meisten Fällen wird ein Modul nicht dynamisch entfernt, da dies das Hotplugging deaktiviert, dh wenn ein Modul entfernt wird, kann das Gerät, das es verwendet, beim erneuten Einstecken nicht mehr erkannt werden.

Um ein Modul aus zu entfernen lsmod, müssen Sie es aus dem initramfs-Image entfernen, das durch erneutes Kompilieren des Kernels ohne das ausgewählte Modul und anschließendes Neuerstellen des Images erstellt wurde. Auf diese Weise wird die gesamte Erkennung des Moduls deaktiviert.

eyoung100
quelle
3
Sie verwechseln das Laden einer Datei in den RAM als Teil einer RAM-Disk und das Laden (dh das dynamische Verknüpfen) eines Moduls in den laufenden Kernel. Module werden vorübergehend von initrd (heutzutage technisch ein initramfs) in den Speicher geladen - nicht in den Kernel -, aber sie werden dann aus dem Speicher entfernt, nachdem der echte Root gemountet wurde. Module werden nur dann in den Kernel geladen, wenn ein Gerät erkannt wird, das sie verwendet (mit wenigen Ausnahmen).
Gilles 'SO- hör auf böse zu sein'
Während ich hier zustimme, sprach er über das Entladen und Laden eines Moduls, was nur möglich ist, wenn er die Ubuntu-RAM-Disk neu konfiguriert. Dies wird nicht empfohlen, da Ubuntu bei jedem Kernel-Update alle Module in den RAM lädt. Alle Module werden jedes Mal geladen, sie werden nur nicht alle verwendet.
Eyoung100
2
Nein, die Frage betrifft das Laden und Entladen eines Moduls in den Kernel. Weder Ihre ursprüngliche Antwort noch Ihre überarbeitete Antwort sprechen das an. Das initramfs ist für diese Frage irrelevant (oder höchstens peripher relevant).
Gilles 'SO- hör auf böse zu sein'
@ Gilles Ist das besser?
eyoung100
1
@ eyoung100, ich stimme Gilles zu. Eine Diskussion über initramfs ist für die Frage nicht relevant. Das Laden von Modulen erfolgt in der Regel durch Auflisten der Geräte /sysund Laden der Treiber für Geräte, die sich tatsächlich im System befinden. Dies geschieht unabhängig davon, ob das Gerät beim Start vorhanden ist oder später im laufenden Betrieb angeschlossen wird. udevEs hat viel mehr damit zu tun als initramfs / initrd, und es /etc/initramfs-tools/initramfs.confist nicht besonders relevant , ob alle, die meisten oder nur einige Module in das initramfs kopiert werden (eine Konfigurationsoption in ).
Celada