GNU/Linux >> LINUX-Kenntnisse >  >> Cent OS

Anfängerleitfaden für Udev unter Linux

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.


Cent OS
  1. Eine Anleitung zum Linux-Terminal für Anfänger

  2. Was ist CentOS – Ein Leitfaden für Anfänger

  3. Root-Passwort unter Linux zurücksetzen

  4. Anfängerleitfaden für Device Mapper (DM) Multipathing

  5. Anfängerleitfaden zur Kernelmodulkonfiguration in Linux

Ein Leitfaden für Anfänger zu Linux-Berechtigungen

Ein Leitfaden für Anfänger zu LVM

Vollständiger Anfängerleitfaden zum Rooten des Samsung Galaxy S2 in Ubuntu Linux

Ein Leitfaden für Anfänger zu Cron-Jobs

Einsteigerleitfaden für die Linux-Softwareverwaltung mit RPM

Leitfaden für Anfänger zu NFS in CentOS / RHEL