Udev ist der Gerätemanager für den Linux-Kernel. Udev erstellt oder entfernt Geräteknotendateien beim Booten dynamisch im /dev-Verzeichnis für alle Gerätetypen. Udev ist jetzt Teil von systemd, wie Sie sehen können, indem Sie sich die „udev“-Dateinamen ansehen, die im systemd-RPM-Paket enthalten sind.
# rpm -ql systemd | grep udev /etc/udev /etc/udev/hwdb.bin /etc/udev/rules.d /etc/udev/udev.conf /usr/bin/udevadm ...
Der Udev-Daemon, systemd-udevd , erhält Geräte-Ereignisse direkt vom Kernel, wenn ein Gerät zum System hinzugefügt oder daraus entfernt wird. Für jedes Ereignis führt systemd-udevd übereinstimmende Anweisungen aus, die in den Udev-Regeln angegeben sind.
Gerätedateinamen können sich ändern, wenn Datenträger aufgrund eines Fehlers aus dem System entfernt werden. Beispielsweise werden Geräte beim Booten mit /dev/sda, /dev/sdb und /dev/sdc bezeichnet. Aber beim nächsten Neustart schlägt /dev/sdb fehl und was zuvor /dev/sdc war, heißt /dev/sdb. Alle Konfigurationsverweise auf /dev/sdb enthalten jetzt Inhalte, auf die ursprünglich von /dev/sdc verwiesen wurde.
Die Lösung, um diese Art von Situation zu vermeiden, besteht darin, konsistente Namen für Geräte durch Neustarts zu gewährleisten. Sie können Udev so konfigurieren, dass es persistente Namen erstellt und diese Namen in der Mount-Tabelle des Dateisystems, /etc/fstab, oder als Argument für den Mount-Befehl verwendet.
Udev-Regeldateien und -Verzeichnisse
Udev-Regeln bestimmen, wie Geräte identifiziert werden und wie ein Name zugewiesen wird, der durch Neustarts oder Festplattenänderungen beständig ist. Wenn Udev ein Geräteereignis empfängt, gleicht es die konfigurierten Regeln mit den Geräteattributen in sysfs ab, um das Gerät zu identifizieren. Regeln können auch zusätzliche Programme angeben, die als Teil der Geräteereignisbehandlung ausgeführt werden sollen.
Udev-Regeldateien befinden sich in den folgenden Verzeichnissen:
- /lib/udev/rules.d/ – Das Standardregelverzeichnis
- /etc/udev/rules.d/ – Das benutzerdefinierte Regelverzeichnis. Diese Regeln haben Vorrang.
Regeldateien müssen eindeutige Namen haben. Dateien im Verzeichnis für benutzerdefinierte Regeln überschreiben gleichnamige Dateien im Standardverzeichnis für Regeln. Regeldateien werden in lexikalischer Reihenfolge sortiert und verarbeitet. Das Folgende ist eine Teilliste der Regeldateien aus den Standard- und benutzerdefinierten Regelverzeichnissen:
# ls -l /lib/udev/rules.d/ total 348 -r--r--r--. 1 root root 7266 Aug 5 2017 10-dm.rules -r--r--r--. 1 root root 2454 Aug 5 2017 11-dm-lvm.rules -rw-r--r--. 1 root root 2865 Jan 25 16:05 11-dm-mpath.rules -r--r--r--. 1 root root 1499 Aug 5 2017 13-dm-disk.rules -rw-r--r--. 1 root root 553 Aug 6 2017 39-usbmuxd.rules -rw-r--r--. 1 root root 1622 Mar 7 13:27 40-redhat.rules ...
# ls -l /etc/udev/rules.d/ total 8 -rw-r--r--. 1 root root 709 Aug 4 2017 70-persistent-ipoib.rules -rw-r--r--. 1 root root 96 Apr 21 05:09 70-persistent-net.rules lrwxrwxrwx. 1 root root 9 Sep 29 2014 80-net-name-slot.rules -> /dev/null
Beispiel für Udev-Regeln
Das folgende Beispiel enthält ausgewählte Einträge aus /lib/udev/rules.d/50-udev-default.rules Datei. Diese Regeldatei enthält über 60 Einträge.
# cat /lib/udev/rules.d/50-udev-default.rules # do not edit this file, it will be overwritten on update SUBSYSTEM=="virtio-ports", KERNEL=="vport*", ATTR{name}=="?*", SYMLINK+="virtio-ports/$attr{name}" # select "system RTC" or just use the first one SUBSYSTEM=="rtc", ATTR{hctosys}=="1", SYMLINK+="rtc" SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100" SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb" SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id" ENV{MODALIAS}!="", IMPORT{builtin}="hwdb --subsystem=$env{SUBSYSTEM}" ACTION!="add", GOTO="default_permissions_end" SUBSYSTEM=="tty", KERNEL=="ptmx", GROUP="tty", MODE="0666" SUBSYSTEM=="tty", KERNEL=="tty", GROUP="tty", MODE="0666" SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620" SUBSYSTEM=="tty", KERNEL=="sclp_line[0-9]*", GROUP="tty", MODE="0620" SUBSYSTEM=="tty", KERNEL=="ttysclp[0-9]*", GROUP="tty", MODE="0620" ....
Die ausgewählten Einträge helfen bei der Beschreibung der Syntax der Regeldateien.
1. Kommentare beginnen mit einem #-Zeichen.
2. Jede nicht kommentierte Zeile in einer Regeldatei besteht aus einer Liste mit einem oder mehreren Schlüssel-Wert-Paaren, die durch ein Komma getrennt sind. Es gibt zwei Arten von Schlüsseln:
- Match-Keys
- Zuweisungsschlüssel
3. Wenn alle Übereinstimmungsschlüssel mit ihrem jeweiligen Wert übereinstimmen, wird die Regel angewendet und den Zuordnungsschlüsseln wird der angegebene Wert zugewiesen. Jede Taste hat je nach Bediener eine unterschiedliche Funktion. Gültige Operatoren sind:
- == :Auf Gleichheit vergleichen
- != :Auf Ungleichheit vergleichen
- = :Einer Taste einen Wert zuweisen
- += :Addiere den Wert zu den aktuellen Werten für den Schlüssel
- := :Weisen Sie der Taste den endgültigen Wert zu. Spätere Änderungen durch spätere Regeln verbieten.
4. Der Musterabgleich im Shell-Stil (*, ?, []) wird auch in Udev-Regeln unterstützt.
Match-Keys
Die folgenden Schlüsselnamen werden zum Abgleich mit Geräteeigenschaften verwendet. Einige der Schlüssel stimmen auch mit Eigenschaften der übergeordneten Geräte in sysfs überein, und nicht nur mit dem Gerät, das das Ereignis generiert hat. Wenn mehrere Schlüssel in einer einzelnen Regel angegeben werden, müssen alle diese Schlüssel übereinstimmen.
- AKTION :Übereinstimmung mit dem Namen der Ereignisaktion.
- DEVPATH :Übereinstimmung mit dem Entwicklungspfad des Ereignisgeräts.
- KERN :Übereinstimmung mit dem Namen des Ereignisgeräts.
- NAME :Übereinstimmung mit dem Namen einer Netzwerkschnittstelle. Es kann verwendet werden, wenn der NAME-Schlüssel in einer der vorherigen Regeln festgelegt wurde.
- SYMLINK :Übereinstimmung mit dem Namen des symbolischen Links, der auf den Knoten abzielt. Er kann verwendet werden, wenn in einer der vorhergehenden Regeln ein SYMLINK-Schlüssel gesetzt wurde. Es können mehrere Symlinks vorhanden sein, aber nur einer muss übereinstimmen.
- SUBSYSTEM :Passen Sie das Subsystem des Ereignisgeräts an.
- TEST{oktale Modusmaske} :Testen Sie die Existenz einer Datei. Sie können eine Oktalmodusmaske angeben.
Andere Übereinstimmungsschlüssel sind DRIVER, ATTR{filename}, KERNELS, SUBSYSTEMS, DRIVERS, ATTRS{filename}, TAGS, ENV{key}, TAG, PROGRAM und RESULT.
Zuweisungsschlüssel
Den folgenden Schlüsseln können Werte zugewiesen werden:
- NAME – Der für eine Netzwerkschnittstelle zu verwendende Name. Der Name eines Geräteknotens kann von Udev nicht geändert werden, es können nur zusätzliche Symlinks erstellt werden.
- SYMLINK – Der Name des symbolischen Links, der auf den Knoten abzielt
- BESITZER, GRUPPE, MODUS – Die Berechtigungen für den Geräteknoten
- OPTIONEN – Regel- und Geräteoptionen. Die im Beispiel verwendete Option ignore_remove bedeutet „Entferne den Geräteknoten nicht, wenn das Gerät verschwindet.“
Andere Zuweisungsschlüssel sind ATTR{key}, ENV{key}, TAG, RUN{type}, LABEL, GOTO, IMPORT{type}, WAIT_FOR und OPTIONS.
String-Ersetzungen
Die Tasten NAME, SYMLINK, PROGRAM, OWNER, GROUP, MODE und RUN unterstützen viele printf-ähnliche Ersetzungen von Zeichenfolgen. Die im Beispiel verwendeten Ersetzungen sind:
- %M – Die Kernel-Major-Nummer für das Gerät
- %m – Die Kernel-Minor-Nummer für das Gerät
Zusätzliche Zeichenfolgensubstitutionen werden unterstützt. Alle unterstützten Substitutionen und Details zu zusätzlichen Übereinstimmungsschlüsseln, zusätzlichen Zuweisungsschlüsseln und zusätzlichen Regel- und Geräteoptionen finden Sie auf der udev-Manpage.
udevadm-Dienstprogramm
Das Dienstprogramm udevadm ist ein Userspace-Verwaltungstool für Udev. Neben anderen Funktionen können Sie udevadm verwenden, um sysfs abzufragen und Geräteattribute abzurufen, um beim Erstellen von Udev-Regeln zu helfen, die zu einem Gerät passen. So zeigen Sie die Verwendung von udevadm an:
# udevadm --help udevadm [--help] [--version] [--debug] COMMAND [COMMAND OPTIONS] Send control commands or test the device manager. Commands: info Query sysfs or the udev database trigger Request events from the kernel settle Wait for pending udev events control Control the udev daemon monitor Listen to kernel and udev events test Test an event run test-builtin Test a built-in command
Sie können auch die Nutzung für jeden der udevadm-Befehle erhalten. Um beispielsweise Hilfe zur Verwendung des info-Befehls zu erhalten:
# udevadm info --help udevadm info [OPTIONS] [DEVPATH|FILE] Query sysfs or the udev database. -h --help Print this message --version Print version of the program -q --query=TYPE Query device information: name Name of device node symlink Pointing to node path sysfs device path property The device properties all All values -p --path=SYSPATH sysfs device path used for query or attribute walk -n --name=NAME Node or symlink name used for query or attribute walk -r --root Prepend dev directory to path names -a --attribute-walk Print all key matches walking along the chain of parent devices -d --device-id-of-file=FILE Print major:minor of device containing this file -x --export Export key/value pairs -P --export-prefix Export the key name with a prefix -e --export-db Export the content of the udev database -c --cleanup-db Clean up the udev database
Beispiel für das Dienstprogramm udevadm
Einige Beispiele folgen. So fragen Sie die Udev-Datenbank nach dem Gerätepfad von /dev/xvdd ab:
# udevadm info --query=path --name=/dev/xvdd /devices/vbd-5696/block/xvdd
So fragen Sie die Udev-Datenbank nach allen Geräteinformationen für /dev/xvda ab:
# udevadm info --query=all --name=/dev/xvda P: /devices/vbd-768/block/xvda N: xvda E: DEVNAME=/dev/xvda E: DEVPATH=/devices/vbd-768/block/xvda E: DEVTYPE=disk E: DM_MULTIPATH_TIMESTAMP=1524287355 E: ID_PART_TABLE_TYPE=dos E: MAJOR=202 E: MINOR=0 E: MPATH_SBIN_PATH=/sbin E: SUBSYSTEM=block E: TAGS=:systemd: E: USEC_INITIALIZED=476119
Geben Sie Folgendes ein, um alle sysfs-Eigenschaften von /dev/xvda zu drucken. Diese Eigenschaften können in Udev-Regeln verwendet werden, um das Gerät abzugleichen. Es druckt alle Geräte entlang der Kette bis zur Wurzel von sysfs.
# udevadm info --attribute-walk --name=/dev/xvda Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at device '/devices/vbd-768/block/xvda': KERNEL=="xvda" SUBSYSTEM=="block" DRIVER=="" ATTR{ro}=="0" ATTR{size}=="41943040" ATTR{stat}==" 16775 4 686095 36372 2953 313 203104 42044 0 19603 78392" ATTR{range}=="16" ATTR{discard_alignment}=="0" ATTR{ext_range}=="16" ATTR{alignment_offset}=="0" ATTR{badblocks}=="" ATTR{inflight}==" 0 0" ATTR{removable}=="0" ATTR{capability}=="10" looking at parent device '/devices/vbd-768': KERNELS=="vbd-768" SUBSYSTEMS=="xen" DRIVERS=="vbd" ATTRS{devtype}=="vbd" ATTRS{nodename}=="device/vbd/768"
Erstellen eines symbolischen Links zu einem Geräteknoten
Die Reihenfolge, in der Regeln ausgewertet werden, ist wichtig. Wenn Sie Ihre eigenen Regeln erstellen, möchten Sie, dass diese vor den Standardwerten ausgewertet werden. Da Regeln in lexikalischer Reihenfolge verarbeitet werden, erstellen Sie eine Regeldatei mit einem Dateinamen wie /etc/udev/rules.d/10-local.rules, damit sie zuerst verarbeitet wird.
Die folgende Regel erstellt den symbolischen Link /dev/my_disk zum Geräteknoten /dev/xvdd. Sie können eine Udev-Regel erstellen, um den Namen einer Netzwerkschnittstelle zu ändern, aber der Name eines Geräteknotens kann nicht von Udev geändert werden. Für Geräteknoten können nur zusätzliche Symlinks erstellt werden.
KERNEL=="xvdd", SUBSYSTEM=="block", SYMLINK="my_disk"
Führen Sie den udevadm-Trigger aus, um die Regeldateien zu verarbeiten:
# udevadm trigger
Der Symlink existiert jetzt.
# ls –l /dev/my* lrwxrwxrwx. ... /dev/my_disk -> xvdd
Entfernen Sie die Datei 10-local.rules und führen Sie den udevadm-Trigger aus, um den symbolischen Link zu entfernen.