Detaillierte Erklärung von udev im Linux-System

Dieser Artikel enthält Verweise auf viele Informationen im Internet. Er dient nur der Bequemlichkeit des Lernens und des Gedächtnisses. Es gibt keinen anderen Zweck. Bei Urheberrechtsverletzungen wenden Sie sich bitte rechtzeitig an.

udev Einführung

udev ist ein neu hinzugefügtes Modul zur Verwaltung von Gerätedateien in der Linux-Kernel2.6-Serie. Seine Funktion besteht hauptsächlich darin, Gerätedateien dynamisch zu verwalten, z. B. das Hinzufügen und Löschen von Vorgängen. Wenn das neu eingefügte Gerät vom Treiber erkannt wird, registriert es neue Daten (einige Informationsdateien, die sich auf dieses Gerät beziehen) auf sysfs. Gleichzeitig sendet der Kernel ein Ereignis des Geräts an udev, und udev greift nach dem Empfang auf die Konfigurationsregeln zu. Führen Sie dann die entsprechenden Vorgänge gemäß den Konfigurationsregeln aus, z. B. Ändern der Gerätegruppe, Gruppe, Berechtigungen, Erstellen von Verknüpfungsdateien und Mounten. In ähnlicher Weise empfängt udev nach dem Trennen des Geräts auch vom Kernel gesendete Ereignisereignisse. Udev führt Vorgänge wie das Löschen von Gerätedateien, das Demontieren, das Löschen von Linkdateien usw. gemäß den uevnet-Regeln aus. Auf diese Weise können die Gerätedateien dynamisch verwaltet und das Gerät im laufenden Betrieb ausgetauscht werden. Es ist nicht erforderlich, im Voraus viele statische Gerätedateien im Verzeichnis / dev zu erstellen .
Neben der oben erwähnten dynamischen Verwaltung von Gerätedateien besteht ein weiteres Highlight von udev darin, dass es im Benutzerbereich ausgeführt wird und entsprechende Vorgänge gemäß kundendefinierten Regeln ausführen kann. Beispielsweise gibt es mehrere USB-Schnittstellen auf dem Gerät und zwei USB-Schnittstellendrucker. Wenn sie gleichzeitig mit dem Gerät verbunden sind, werden zwei Gerätedateien im Verzeichnis / dev / auf dem Gerät generiert, z. B. / dev / sda und / dev / sdb . Wie ist ihre Korrespondenz? sda entspricht Drucker 1 oder Drucker 2. Dies hängt mit dem Betrieb des Kunden zusammen, z. B. der Reihenfolge des Einfügens und der Situation der Maschine in Bezug auf die Mittelausrüstung. Dies kann in der vorherigen statischen Gerätedateiverwaltung und in devfs nicht behandelt werden. Wir müssen nur die Regeln von udev ändern, um eine Eins-zu-Eins-Zuordnung zu erreichen. Beispielsweise werden die Gerätedateiverbindungen Drucker1, Drucker2 basierend auf der Seriennummer des Geräts, der Hersteller-ID usw. erstellt. Solange der Drucker 1 angeschlossen ist, wird eine Verbindungsdatei Drucker1 generiert, und wir benötigen keine Einschränkungen mehr wie die Reihenfolge des Einfügens von Zeitmessgeräten.Da udev ein Modul ist, das im Benutzerbereich ausgeführt wird, generiert der Kernel weiterhin sda, sdab und andere Gerätedateien.
Das Funktionsprinzip von udev: Das sysfs-Dateisystem wurde in der Linux2.6-Version eingeführt. sysfs organisiert die mit dem System verbundenen Geräte und Busse in einer hierarchischen Datei und bietet Zugriff auf den Benutzerbereich. udev wird im Benutzermodus ausgeführt, nicht im Kernel . Das udev-Initialisierungsskript erstellt beim Starten des Systems einen Geräteknoten. Nachdem ein neues Gerät erkannt wurde, wird eine Reihe von Dateien auf sysfs generiert, und udev erstellt einen neuen Geräteknoten. udev muss sysfs und tmpfs im Kernel unterstützen, sysfs bietet Geräteeintrag und Ereigniskanal für udev und tmpfs bietet Speicherplatz für udev-Gerätedateien . Die folgende Abbildung zeigt das Arbeitsablaufdiagramm von udev. Die Konfigurationsdatei wird in der Datei /etc/udev/udev.conf gespeichert.
Fügen Sie hier eine Bildbeschreibung ein
Warum udev verwenden, da die zuvor verwendeten Methoden zur Verwaltung von Gerätedateien (statische Dateien und devfs) einige Mängel aufweisen:

  • Unsichere Gerätezuordnung. Insbesondere für diese dynamischen Geräte, wie z. B. USB-Geräte, ist die Zuordnung von Gerätedateien zu tatsächlichen Geräten nicht zuverlässig und deterministisch. Nehmen Sie ein Beispiel: Wenn Sie zwei USB-Drucker haben. Einer kann / dev / usb / lp0 heißen und der andere ist / dev / usb / lp1. Es ist jedoch nicht klar, welches, welches lp0, lp1 und das tatsächliche Gerät keine Eins-zu-Eins-Entsprechung haben, da er möglicherweise feststellt, dass die Reihenfolge des Geräts, des Druckers selbst ausgeschaltet ist und andere Gründe, die zu dieser Zuordnung führen, nicht sicher sind. Der ideale Weg sollte sein: Zwei Drucker sollten mithilfe einer eindeutigen Gerätedatei basierend auf ihrer Seriennummer oder anderen Identifikationsinformationen zugeordnet werden. Dies können jedoch weder statische Dateien noch devfs.
  • Es gibt nicht genügend Primär- / Sekundärgerätenummern. Wir wissen, dass jede Gerätedatei zwei 8-stellige Nummern hat: eine ist die Hauptgerätenummer und die andere ist die Nummer des Zusatzgeräts. Diese beiden 8-Bit-Nummern plus der Gerätetyp (Blockgerät oder Zeichengerät) zur eindeutigen Identifizierung eines Geräts. Leider reichen die Zahlen um sie herum nicht aus.
  • Das Verzeichnis / dev enthält zu viele Dateien. Ein System verwendet die statische Zuordnung von Gerätedateien, daher müssen sich genügend Dateien in diesem Verzeichnis befinden. Gleichzeitig wissen Sie nicht, welche Gerätedateien auf Ihrem System aktiviert sind.
  • Die Benennung ist nicht flexibel genug. Obwohl devfs einige der vorherigen Probleme löst, bringt es selbst einige Probleme mit sich. Eine davon ist, dass die Benennung nicht flexibel genug ist und Sie den Namen der Gerätedatei sehr einfach ändern können. Der Standard-Devfs-Befehlsmechanismus selbst ist ebenfalls sehr seltsam. Er muss viele Konfigurationsdateien und -programme ändern. ;;
  • Die Verwendung des Kernel-Speichers, ein weiteres Problem, das nur bei devfs auftritt, besteht darin, dass devfs als Kernel-Treibermodul viel Speicher verbrauchen muss, insbesondere wenn sich eine große Anzahl von Geräten auf dem System befindet (z. B. das oben erwähnte System verfügt über Tausende von Festplatten auf einer).

Das Ziel von udev ist es, diese oben genannten Probleme zu lösen. Er verwendet das User-Space-Tool, um den vom Dateisystem getrennten Verzeichnisbaum / dev / zu verwalten. Wenn Sie wissen, wie Sie die Standardkonfiguration ändern, können Sie Ihr System anpassen, z. B. Gerätezeichenverbindungen erstellen, Gerätedateigruppen ändern und Berechtigungen.

udev Regeln

Wie oben erwähnt, führt udev verwandte Vorgänge gemäß den Benutzerregeln aus. Wo werden diese Regeldateien abgelegt und wie lauten die Regeln? In diesem Artikel werden unter anderem nur einige häufig verwendete Regeln erläutert. Weitere Informationen finden Sie in der Dokumentation zu man udev.
Die Hauptkonfigurationsdatei von udev ist ** / etc / udev / udev.conf **. Diese Datei ist normalerweise sehr kurz, wie unten gezeigt. Unter diesen gibt udev_root das Stammverzeichnis an, in dem Gerätedateien gespeichert sind, udev_rules gibt den Speicherpfad der Regeln an und udev_log gibt die Protokollierungsstufe an. Es gibt andere Konfigurationen, die hier nicht erläutert werden, z. B. die Datenbank, in der Protokolle gespeichert sind.

udev_root="/dev/"

udev_rules="/etc/udev/rules.d/"

udev_log="err"

Die Regeldatei wird in dem durch udev_rules angegebenen Verzeichnis gespeichert, und das Dateinamensuffix lautet .lures. Es können mehrere Regeldateien vorhanden sein, und die Übereinstimmungssequenz wird durch Installieren von ASCII-Codes ausgeführt. Wenn eine Übereinstimmungsregel gefunden wird, wird die Übereinstimmung ausgesetzt und die nachfolgenden Regeldateien werden nicht abgeglichen. Daher beginnen benutzerdefinierte Regeldateien grundsätzlich mit Zahlen, wodurch die Priorität von Regeldateien erhöht wird. Die folgende Abbildung ist eine einfache Regeldatei. Die Regeldatei ist in Zeileneinheiten angegeben, und eine Zeile ist eine Regel

KERNEL=="*", OWNER="root" GROUP="root", MODE="0600"
KERNEL=="tty", NAME="%k", GROUP="tty", MODE="0666", OPTIONS="last_rule"
KERNEL=="scd[0-9]*", SYMLINK+="cdrom cdrom-%k"
KERNEL=="hd[a-z]", BUS=="ide", SYSFS{removable}=="1", SYSFS{device/media}=="cdrom", SYMLINK+="cdrom cdrom-%k"
ACTION=="add", SUBSYSTEM=="scsi_device", RUN+="/sbin/modprobe sg"

In der Regeldatei bestehen Regeln aus einer Reihe von Schlüssel-Wert-Paaren, die durch Kommas getrennt sind. Schlüssel-Wert-Paare werden in passende Schlüssel und Zuweisungsschlüssel unterteilt. Der Übereinstimmungsschlüssel wird verwendet, um die Übereinstimmungsregel anzugeben, und der Zuweisungsschlüssel wird für die Zuweisung verwendet. Der Zuweisungsschlüssel kann eine Liste mit mehreren Werten verarbeiten.

udev Regel alle Operatoren

  • "==": Schlüssel und Wert vergleichen, wenn gleich, ist die Bedingung erfüllt;
  • "! =": Schlüssel und Wert vergleichen, wenn nicht gleich, ist die Bedingung erfüllt;
  • "=": Weisen Sie einem Schlüssel einen Wert zu.
  • "+ =": Weisen Sie mehreren Einträgen einen Schlüssel zu.
  • ": =": Weisen Sie einem Schlüssel einen Wert zu und lehnen Sie alle nachfolgenden Änderungen am Schlüssel ab. Damit soll verhindert werden, dass nachfolgende Regeldateien dem Schlüssel Werte zuweisen.

Übereinstimmungsschlüssel für udev-Regeln

  • AKTION : Das Verhalten des Ereignisses (Ereignis), zum Beispiel: Hinzufügen (Gerät hinzufügen), Entfernen (Gerät entfernen).
  • KERNEL : Name des Kernel-Geräts, zum Beispiel: sda, cdrom.
  • DEVPATH : Der Devpath des Geräts.
  • SUBSYSTEM : Der Subsystemname des Geräts, z. B. das Subsystem von sda, ist block.
  • BUS : Der Busname des Geräts im Devpath, zum Beispiel: usb.
  • DRIVER: Der Gerätetreibername des Geräts in devpath, zum Beispiel: ide-cdrom.
  • ID: Die Identifikationsnummer des Geräts im Devpath.
  • SYSFS {Dateiname} : Unter dem Devpath des Geräts wird der Inhalt der Eigenschaftendatei "Dateiname" des Geräts angezeigt. Beispiel: SYSFS {model} == "ST936701SS" bedeutet: Wenn das Modell des Geräts ST936701SS ist, stimmt das Gerät mit dem passenden Schlüssel überein.
  • ENV {Schlüssel} : Umgebungsvariable. In der Regel können Sie bis zu fünf übereinstimmende Schlüssel für Umgebungsvariablen einrichten.
  • PROGRAMM: Rufen Sie externe Befehle auf.
  • ERGEBNIS: Das Rückgabeergebnis des externen Befehls PROGRAM.

Udevs wichtiger Zuweisungsschlüssel

  • NAME: Der unter / dev generierte Name der Gerätedatei. Nur die erste Zuweisung des NAMENS eines Geräts wird wirksam, und die darauf folgenden Übereinstimmungsregeln werden für die NAME-Zuweisung des Geräts ignoriert. Wenn es keine Regel zum Zuweisen eines Namens zum Gerät gibt, verwendet udev den Gerätenamen des Kernels, um die Gerätedatei zu generieren.
  • SYMLINK: Generieren Sie symbolische Links für Gerätedateien unter / dev /. Da udev nur eine Gerätedatei für ein bestimmtes Gerät generieren kann, wird empfohlen, symbolische Links zu verwenden, um die durch die Standard-udev-Regeln des Systems generierten Dateien nicht zu überschreiben.
  • EIGENTÜMER, GRUPPE, MODUS: Legen Sie die Berechtigungen für das Gerät fest.
  • ENV {Schlüssel}: Importiert eine Umgebungsvariable.

udev-Wert und aufrufbarer Ersatzoperator

  • $ kernel,% k: Der Kernel-Gerätename des Geräts, zum Beispiel: sda, cdrom.
  • $ number,% n: Die Kernelnummer des Geräts, zum Beispiel: Die Kernelnummer von sda3 ist 3.
  • $ devpath,% p: Der Devpath-Pfad des Geräts.
  • $ id,% b: Die ID-Nummer des Geräts in devpath.
  • $ sysfs {Datei},% s {Datei}: Der Inhalt der Datei in den sysfs des Geräts. Tatsächlich ist es der Attributwert des Geräts.
  • $ env {key},% E {key}: Der Wert einer Umgebungsvariablen.
  • $ major,% M: Die Hauptnummer des Geräts.
  • $ minor% m: Die untergeordnete Nummer des Geräts.
  • $ result,% c: Das von PROGRAM zurückgegebene Ergebnis.
  • $ parent,% P: Der Gerätedateiname des übergeordneten Geräts.
  • $ root,% r: Der Wert von udev_root, der Standardwert ist / dev /.
  • $ tempnode,% N: Temporärer Gerätename.
  • %%: Das Symbol% ​​selbst.
  • $$: Das Symbol $ selbst.

Die Regel in der Abbildung unten lautet, den angegebenen Linknamen gemäß dem ID-Anbieter und dem ID-Produkt des Scanners zu erstellen. Der Link wird bei jedem Einschalten des Scanners festgelegt, sodass die Zuordnungsbeziehung gut bestimmt werden kann.

SYSFS{idVendor}=="0686",SYSFS{idProduct}=="400e", SYMLINK+="scanner", MODE="0664", group="scanner"

Wenn die Regeln nach dem Ändern der Regeln wirksam werden, können wir unser Gerät ein- und ausstecken, um ein Ereignis zu generieren, oder Informationen in die Ereignisdatei des Geräts einfügen, um unsere udev-Regeln zum Senden von Ereignissen zu aktualisieren. Eine bequemere Methode besteht darin, den folgenden Befehl auszuführen

udevadm test /sys/class/block/sdc4
udevinfo -q path -n /dev/sda 这个命令会产生一个该设备名对应的在sysfs下的路径
udevinfo -a -p /sys/block/sda 这个命令会显示一堆信息,这些信息实际来自于操作系统维护的sysfs链表。

udev port

Der udev- Quellcode kann von der udev-Download-URL heruntergeladen werden . Im Folgenden sind die Migrationsschritte aufgeführt.

  • Laden Sie das udev-Quellpaket herunter und entpacken Sie es
  • Ändern Sie das CROSS-Cross-Compilation-Tool im Makefile in den Compiler Ihres eigenen Entwicklungsboards
  • Führen Sie make zum Kompilieren aus.
  • Führen Sie dann strip udev uded udevstart udevinfo udevtest aus. Und kopieren Sie diese Dateien in das Verzeichnis rootfs / bin.
  • Fügen Sie Unterstützung für udev hinzu, ändern Sie das Skript /etc/init.d/rcS und fügen Sie den folgenden Befehl hinzu:
/bin/mount -t sysfs sysfs /sys
/bin/mount -t tmpfs tmpfs /dev
/bin/udevd --deamon
/bin/udevstart 
  • Erstellen Sie das Verzeichnis udev unter / etc.
  • Erstellen Sie rules.d und die Datei udev.conf unter / etc / udev. Der Inhalt von udev.conf lautet wie folgt:
    # udev.conf
    # The initial syslog(3) priority: 'err', 'info', 'debug' or its
    # numerical equivalent. For runtime debugging, the daemons internal
    # state can be changed with: 'udevcontrol log_priority='.
    udev_root="/dev/"
    udev_rules="/etc/udev/rules.d"
    udev_log="err"
  • Erstellen Sie Ihre eigene Regeldatei im Verzeichnis rules.d. Die Datei muss das Suffix .rules verwenden.
    Da udev sysfs-Unterstützung und tmpfs-Unterstützung benötigt, müssen Sie diese beiden Verzeichnisse bereitstellen, bevor Sie udev starten.
Veröffentlichte 35 Originalartikel · Like1 · Besuche 1870

Ich denke du magst

Origin blog.csdn.net/lzj_linux188/article/details/105094697
Empfohlen
Rangfolge