c't 3/2023
S. 160
Praxis
Udev-Regeln unter Linux
Bild: Rudolf A. Blaha

Aufgescheucht

Mit Udev Zugriffsrechte auf Hardware gewähren

Die Alleinherrschaft über den eigenen USB-Stick? Oder die Maustasten für jedes Spiel individuell neu belegen? Kein Problem für Udev, den Daemon für Hardware-Events unter Linux. Mit ausgefeilten Udev-Regeln erleichtern Sie sich den Linux-Alltag.

Von Mirko Dölle

Erkennt Linux ein neues USB-Gerät, übernimmt der Daemon Udev mit seinem komplexen Regelwerk die Initialisierung der Hardware, spielt Firmware auf und legt Gerätedateien an. Indem Sie Ihre eigenen Regeln einfügen, können Sie im Alltag auch ohne Root-Rechte Ihren USB-Stick mit neuen Linux-Distributionen bespielen oder Hardware individuell konfigurieren, damit die Gaming-Maus die gewünschte Tastenbelegung für Ihr Lieblingsspiel hat.

Die Aufgabe des Udev-Daemon ist, vom Kernel festgestellte Hardware-Veränderungen nach einem Regelwerk zu verarbeiten – also immer dann tätig zu werden, wenn etwa ein USB-Gerät angeschlossen oder auch eine Festplatte aus dem Wechselrahmen entfernt wird. Die meisten der über 100 vorinstallierten Regeln verändern die Zugriffsrechte auf die vom Kernel erkannte Hardware und kümmern sich etwa darum, dass Benutzer ohne Root-Rechte auf DVD-Laufwerke, USB-Sticks oder Modems zugreifen dürfen oder dass CD- und DVD-Laufwerke unabhängig vom konkreten Typ stets unter dem symbolischen Link /dev/cdrom erreichbar sind. Die prominentesten Regeln jedoch sind jene, die dem Sound-System des Desktops Zugriff auf die Soundkarte verschaffen – ohne sie bliebe der Desktop stumm.

Die meisten der standardmäßig unter /usr/lib/udev/rules.d gespeicherten Regeln werden beim Booten abgearbeitet, wenn der Kernel die einzelnen Systembusse nach Geräten scannt und dann an den Udev-Daemon meldet. Ändern sollten Sie diese Regeldateien nicht, denn sie würden bei einem Update von Udev überschrieben. Stattdessen legen Sie bei Bedarf eine neue Datei im Verzeichnis /etc/udev/rules.d an, die als Dateiendung .rules im Namen tragen muss. Udev vermischt den Inhalt beider Verzeichnisse und arbeitet die Regeldateien in lexikografischer Reihenfolge ab – die Regeln aus /usr/lib/udev/rules.d/50-firmware.rules werden also vor denen aus der Datei /etc/udev/rules.d/70-persistent-net.rules verarbeitet; haben zwei Dateien den gleichen Namen, so kommt die aus /usr/lib/udev/rules.d zuerst dran.

Die Regeldateien liegen im Textformat vor und lassen sich leicht lesen. Folgendes zeigt einen Auszug aus der Datei /etc/udev/rules.d/70-persistent-net.rules einer openSUSE-Installation:

# PCI device 0x10ec:0x8168 (r8169)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="f8:a9:63:48:d4:7a", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

Kommentarzeilen beginnen wie auch bei anderen Programmen üblich mit einem Doppelkreuz. Alle anderen Zeilen sind Udev-Regeln, die jeweils aus Bedingungen und Zuweisungen bestehen. Der Unterschied ist einfach: Die Operatoren == und != stehen für Vergleiche, Zuweisungen sind =, +=, -= und := – letzteres bedeutet, dass die Zuweisung final ist und durch keine weitere Regel mehr verändert werden darf.

Feine Unterschiede

Die Regel aus dem Beispiel bezieht sich auf das Netzwerk (SUBSYSTEM=="net") und gilt nur, wenn ein Gerät hinzugefügt wird (ACTION=="add"). Deutlich zu erkennen: Zeichenketten müssen stets von Anführungszeichen eingeschlossen sein. Die einzelnen Bestandteile einer Regel sind über Kommas miteinander verknüpft. Auch Wildcards sind erlaubt, bei DRIVERS=="?*" zum Beispiel steht das Fragezeichen für ein beliebiges einzelnes Zeichen, der Stern dahinter für beliebig viele weitere Zeichen. In der Kombination bedeutet "?*", dass das Feld nicht leer sein darf (darauf würde "*" nämlich auch passen), der Name des Treibers aber beliebig ist.

Der wichtigste Teil der Regel ist ATTR{address} gefolgt von einer Ethernet-MAC-Adresse: Die Regel gilt also nur für ein Gerät, das ein Attribut address mit der genannten MAC-Adresse hat. Da MAC-Adressen von Netzwerkadaptern für jedes einzelne Gerät individuell vergeben werden, passt die Regel auch nicht auf einen anderen Netzwerkadapter desselben Herstellers und Modells. Was die Regel bewirkt, steht ganz am Ende: NAME="eth0" legt den Gerätenamen fest und sorgt dafür, dass dieser eine Netzwerkadapter mit der angegebenen MAC-Adresse stets den Namen eth0 erhält. Schließen Sie einen anderen Netzwerkadapter an, so bekommt dieser einen anderen Namen. So ist sichergestellt, dass bei Rechnern mit zwei Ethernet-Anschlüssen nicht versehentlich die Ports vertauscht werden und plötzlich interne Dienste von außerhalb erreichbar sind.

Kommentieren