Zum Inhalt springen

udev

udev ist der Gerätemanager des Linux-Kernels. Er reagiert auf Kernel-Events (Geräte ein-/ausgesteckt, erkannt beim Booten) und führt konfigurierbare Aktionen aus: Kernel-Modul laden, /dev-Eintrag erstellen, Berechtigungen setzen, Symlinks anlegen.

Kernel erkennt Gerät
│ uevent (Netlink-Socket)
udevd (Daemon)
│ durchsucht Regeln in:
│ /usr/lib/udev/rules.d/ ← Distributions-Regeln (nicht editieren)
│ /etc/udev/rules.d/ ← eigene Regeln
Aktionen ausführen:
- Kernel-Modul laden (MODALIAS)
- /dev/name erstellen
- Symlink anlegen
- Berechtigungen setzen
- Programm ausführen

Regeln werden in aufsteigender Reihenfolge nach Dateiname ausgeführt (z. B. 10-... vor 90-...).

Bevor eine Regel geschrieben werden kann, müssen die Attribute des Geräts bekannt sein:

Terminal-Fenster
# Gerät über /sys-Pfad abfragen
udevadm info /sys/class/net/enp3s0
udevadm info /sys/block/sda
# Vollständige Attribut-Hierarchie (für Regeln)
udevadm info --attribute-walk /sys/class/net/enp3s0
udevadm info --attribute-walk /sys/bus/usb/devices/1-2

Die --attribute-walk-Ausgabe zeigt alle ATTRS{...}-Werte auf jedem Level der Gerätehierarchie — genau die Schlüsselwörter, die in Regeln verwendet werden.

Jede Regel besteht aus Bedingungen (Matching) und Aktionen:

# Kommentar
SUBSYSTEM=="net", ATTR{address}=="00:11:22:33:44:55", NAME="eth-intern"

Matching-Schlüsselwörter:

SchlüsselwortBedeutung
SUBSYSTEMGeräte-Subsystem (net, block, usb, …)
KERNELKernel-Gerätename (sda, ttyUSB*, …)
ATTR{name}sysfs-Attribut des Geräts
ATTRS{name}sysfs-Attribut eines Elterngeräts
ENV{name}Umgebungsvariable
ACTIONAktion (add, remove, change)

Aktions-Schlüsselwörter:

SchlüsselwortBedeutung
NAMEName des /dev-Eintrags
SYMLINKzusätzlicher Symlink in /dev
MODEDateiberechtigung (oktal)
OWNER / GROUPBesitzer/Gruppe
RUNProgramm ausführen
LABEL / GOTOSprünge innerhalb der Regeldatei

Operatoren: == (Bedingung), != (negierte Bedingung), = (Zuweisung), += (anhängen)

USB-Geräte bekommen als Gerätename /dev/sdb, /dev/sdc etc. — je nach Anschluss-Reihenfolge unterschiedlich. Eine udev-Regel kann einen festen Symlink setzen:

Terminal-Fenster
# Attribute des USB-Sticks ermitteln
udevadm info --attribute-walk /sys/block/sdb | grep -E "serial|vendor|model"
/etc/udev/rules.d/99-usb-backup.rules
SUBSYSTEM=="block", \
ATTRS{idVendor}=="0781", \
ATTRS{idSerial}=="12345678", \
SYMLINK+="backup"

Der USB-Stick ist jetzt zusätzlich als /dev/backup erreichbar — unabhängig davon, ob er als sdb, sdc oder sdd erkannt wird.

/etc/udev/rules.d/99-arduino.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="2341", MODE="0666", GROUP="dialout"
Terminal-Fenster
# Regel simulieren ohne Neustart
udevadm test /sys/block/sdb
udevadm test /sys/class/net/enp3s0
# Ausgabe zeigt, welche Regeln matchen und welche Aktionen ausgeführt würden
Terminal-Fenster
udevadm monitor # alle Kernel- und udev-Events
udevadm monitor --kernel # nur Kernel-Events
udevadm monitor --udev # nur verarbeitete udev-Events

Praktisch beim Einstecken eines USB-Geräts: man sieht sofort, welcher Gerätepfad vergeben wurde und welche Attribute vorhanden sind.

Terminal-Fenster
sudo udevadm control --reload-rules # Regeln neu einlesen (ohne udevd-Neustart)
sudo udevadm trigger # Events für alle Geräte erneut auslösen
sudo udevadm trigger --subsystem-match=block # nur Block-Geräte

Netzwerkschnittstellen heißen heute enp3s0 statt eth0. Diese Predictable Network Interface Names werden von udev (oder systemd-networkd) vergeben — basierend auf physischer Position (PCI-Slot, Port) statt Erkennungsreihenfolge.

Schema:

en p 3 s 0
│ │ │ │ └─ Port 0
│ │ │ └──── Slot (innerhalb des Buses)
│ │ └─────── PCI-Bus 3
│ └────────── p = PCI, u = USB, s = SATA/hotplug
└────────────── en = Ethernet (wl = WLAN, ww = WWAN)
Terminal-Fenster
# Aktuellen udev-Link-Namen anzeigen
udevadm info /sys/class/net/enp3s0 | grep ID_NET_NAME