Geräteschuppen

Udev & Co.

01.12.2007 Udev heißt das Zauberwort, wenn's um Hardware geht: Das Programm räumt den Linux-Geräteschuppen so richtig auf.

Gerade im Bereich der Erkennung und Verwaltung von Hardware hat sich unter Linux in den letzten Jahren einiges getan. Längst vergangen sind die Zeiten statisch angelegter Gerätedateien im Verzeichnis /dev, und auch Devfs hat mittlerweile ausgedient. Udev [1] übernimmt seit Kernel 2.6 sowohl die Aufgaben des Device-Filesystems als auch die von Hotplug. Dazu gehören unter anderem das Anlegen der entsprechenden Gerätedatei, das Setzen der Zugriffsrechte und optional der Start bestimmter Programme.

Im Gegensatz zu seinem Vorgänger arbeitet Udev im Userspace, das heißt als "normales" Programm. Das bringt verschiedene Vorteile mit – unter anderem die Tatsache, dass die Verwaltung und Namensgebung der angeschlossenen Geräte nicht beim Kernel liegt und sich daher leichter konfigurieren lässt. Für den Anwender bietet Udev weitere Vorteile: So kann er die Gerätenamen frei wählen, und die Zuordnung der Hardware fällt eindeutig aus. Damit das alles reibungslos klappt, benötigt Udev Regeln – anhand dieser entscheidet das Programm dann, wie ein Gerät heißen und was weiterhin passieren soll.

Geräteschuppen

Udevs "Ablage" ist das Verzeichnis /dev. Hier liegen die Gerätedateien, über welche die Anwendungen auf die Hardware zugreifen. Werfen Sie einen Blick in diesen Ordner, sehen Sie nicht nur die Dateinamen für die Festplatte(n) und Partitionen (zum Beispiel sda, entsprechend sda1, sda2), sondern auch für CD-/DVD-Laufwerke (in der Regel zeigt der Symlink cdrom auf das "echte" Device, zum Beispiel hdc), serielle Schnittstellen (beispielsweise ttyS0, ttyS1) und so weiter (Abbildung 1).

Abbildung 1: Der Linux-Geräteschuppen befindet sich im Ordner /dev.

Das Betriebssystem speichert den Inhalt des Ordners /devin einem temporären Dateisystem. wovon Sie sich durch das Ausgeben der aktuell eingehängten Verzeichnisse leicht selbst überzeugen::

$ mount
…
udev on /dev type tmpfs (rw,mode=0755)
…

Linux richtet die in /dev enthaltenen Dateien einerseits beim Systemstart ein, andererseits immer dann, wenn ein Gerät neu hinzukommt. Entsprechend verschwinden die Device-Namen, sobald Sie ein Gerät entfernen. Dafür, dass das das Verzeichnis einerseits übersichtlich und dynamisch bleibt, den Anwender aber andererseits nicht mit wechselnden Device-Namen verwirrt, dafür sorgen die Udev-Regeln.

Alles genau geregelt

Das Verhalten von Udev steuern zahlreiche Regeldateien, die Sie im Verzeichnis /etc/udev/ beziehungsweise in /etc/udev/rules.d/ finden. Bei einigen Distributionen, zum Beispiel unter Debian, sind die dort liegenden Dateien symbolische Links auf die Regeln in /etc/udev/.

Listing 1 zeigt, dass die Regeln durchnummeriert sind beziehungsweise mit einem Buchstaben beginnen. Der Grund: Udev arbeitet bei jedem Ereignis das Verzeichnis in lexikalischer Reihenfolge ab. Dieses Vorgehen stellt sicher, dass wichtige Regeln zuerst an die Reihe kommen. An der letzten Stelle steht normalerweise immer die Anweisung für den HAL-Daemon (Udev informiert diesen über das neue Gerät).

Listing 1
$ ls -la /etc/udev/rules.d/
…
lrwxrwxrwx 1 root root   20 2007-05-09 23:40 020_permissions.rules -> ../permissions.rules
lrwxrwxrwx 1 root root   19 2007-05-10 00:39 025_libgphoto2.rules -> ../libgphoto2.rules
lrwxrwxrwx 1 root root   16 2007-05-10 00:39 025_libsane.rules -> ../libsane.rules
…
lrwxrwxrwx 1 root root   12 2007-05-10 00:36 z99_hal.rules -> ../hal.rules
@KE;

In einer solchen Regeldatei finden eine oder mehrere Anweisungen Platz; diese stehen jeweils in einer durchgehenden Zeile (ohne Umbruch). Sie enthalten verschiedene Bedingungen und Steuerbefehle, jeweils durch Kommas voneinander getrennt. Die von der Shell bekannten Platzhalter wie *, ?, [...] und so weiter sind erlaubt. Darüber hinaus finden Sie in den Regeln verschiedene Operatoren (Tabelle "Operatoren"). Die Tabelle "Udev: Konstanten und Variablen" zeigt eine Übersicht häufig verwendeter Konstanten und Variablen. Die Operatoren, alle verfügbaren Konstanten und Variablen listet darüber hinaus die Manpage (man udev) auf.

Operatoren

Operator

Typ

Bedeutung

== Vergleich wahr, wenn beide Ausdrücke gleich sind
!= Vergleich wahr, wenn die beiden Ausdrücke ungleich sind
= Zuweisung weist den Wert der rechten Seite der linken zu
:= Zuweisung wie =, schützt die linke Seite aber vor späteren Veränderungen
+= Zuweisung fügt der linken Seite den Wert der rechten an

Udev: Konstanten und Variablen

Name

Bedeutung

ACTION Ereignis, entweder add oder remove
SUBSYSTEM Gerätetyp, zum Beispiel usb_device, block, und so weiter
BUS Bussystem des Geräts, zum Beispiel ieee1394 oder usb
ID Geräte-ID (bezogen auf den Bus)
NAME Name des Netzwerkgeräts (eth0, eth1 etc.) oder der Gerätedatei in /dev
KERNEL Gerätename laut Kernel
SYSFS{Datei } Verwendet Informationen bestimmter Dateien aus /sys (enthalten Angaben zur Hardware); pro Regel maximal fünf SYSFS-Konstanten
OWNER Besitzer (Benutzername oder UID)
GROUP Gruppe (Name oder GID)
MODE Zugriffsrechte (Oktalzahlen)
RUN führt das angegebene Programm aus.
SYMLINK legt einen symbolischen Link an, der auf den tatsächlichen Devicenamen verweist.
GOTO springt zu einer angegebenen Sprungmarke.
LABEL Name der Sprungmarke

Selbst ist der Admin

Mit wenigen Handgriffen erstellen Sie eigene Udev-Regeln und erweitern so die Funktionalität der Hardware-Erkennung. Falls Sie externe USB-Massenspeicher verwenden, erhalten diese – abhängig von der Reihenfolge, in der Sie sie anstecken – immer unterschiedliche Namen. Angenommen, Sie besitzen eine externe Festplatte, auf der Sie regelmäßig Sicherungskopien ablegen. Natürlich können Sie die Platte einstecken, warten, bis sie korrekt gemountet wurde, den Einhängepunkt herausfinden und ein entsprechendes Backup-Skript starten. Dank Udev sparen Sie einige Arbeitsschritte. Dazu erstellen Sie eine Regel, die der Festplatte automatisch immer denselben Device-Namen zuweist. Optional enthält die Regel einen Mount-Befehl und/oder ruft ein Shell-Skript fürs Backup auf.

Finden Sie zunächst einige Informationen über das jeweilige Gerät heraus, beispielsweise mit Hilfe des Programms lsusb (Listing 2). Notieren Sie sich eine der Angaben hinter idVendor, idProduct oder iSerial – über diese identifizieren Sie das Gerät eindeutig.

Listing 2
$ lsusb -v
…
Bus 003 Device 010: ID 152d:2338
Device Descriptor:
…
  idVendor           0x152d
  idProduct          0x2338
  bcdDevice            1.00
  iManufacturer           1
  iProduct                2
  iSerial                 5
  bNumConfigurations      1
…

Eigene Regel erstellen

Nun geht es daran, eine neue Regeldatei zu schreiben. Diese findet ebenfalls Platz im Verzeichnis /etc/udev/rules.d. Sie erstellen die Datei als Systemverwalter root mit einem Texteditor Ihrer Wahl. Reihen Sie sie mit einer entsprechenden Nummer in die Reihenfolge der Anweisungen ein und geben ihr die Endung .rules. Auf einem Debian-"Etch"-Testsystem erhielt die Regel den Namen z98_usb-platte.rules und den folgenden Inhalt:

SUBSYSTEM=="block", SYSFS{idProduct}=="2338", SYSFS{idVendor}=="152d", NAME="backup"

Außer der Angabe, dass es sich um ein Blockdevice handelt, definiert die Regel die über lsusb herausgefundenen Informationen zu idProduct und idVendor und bestimmt den Namen, den die Gerätedatei haben soll. Über den Befehl

udevcontrol reload_rules

liest der Systemverwalter die neue Regel ein. Alternativ können Sie auch das USB-Gerät aus- und wieder einstecken. Was hinter den Kulissen passiert, verrät der Befehl udevmonitor. Zusammen mit der Option --env gibt sich das Tool redselig und zeigt für die auf dem Testrechner angelegte Regel allerhand interessante Informationen an:

# udevmonitor --env
…
ACTION=add
DEVPATH=/block/sda/sda1
SUBSYSTEM=block
…
DEVNAME=/dev/backup
…

Ein prüfender Blick ins Verzeichnis /dev bestätigt: Udev hat tatsächlich die gewünschte Gerätedatei /dev/backup erstellt. Entfernen Sie die USB-Platte, verschwindet der Eintrag wieder.

Mounten oder Skripten?

Wie die Tabelle "Udev: Konstanten und Variablen" zeigt, definieren Sie über RUN bei Bedarf ein auszuführendes Programm in der Regel. Wollen Sie das Gerät /dev/backup in einem Rutsch nach /media/backup mounten, erweitern Sie die Regel zum Beispiel so:

SUBSYSTEM=="block", SYSFS{idProduct}=="2338", SYSFS{idVendor}=="152d", NAME="backup", RUN+="/bin/mount /dev/backup /media/backup"

Achten Sie darauf, den vollständigen Pfad zum Programm (hier: /bin/mount) anzugeben. Den Einhängepunkt /media/backup legen Sie vorher mit Root-Rechten und dem Kommando mkdir an:

$ mkdir /media/backup

Danach können Sie das Backup-Programm von Hand starten. Alternativ erstellen Sie für das Gerät einen entsprechenden Eintrag in der Datei /etc/fstab[2], der beispielsweise so aussehen könnte:

/dev/backup /media/backup ext3 users,atime,noauto,rw,nodev,exec,nosuid 0 0

In diesem Fall integrieren Sie die Mount-Anweisung direkt ins Backup-Skript, sodass die externe Platte vor der Datensicherung eingehängt wird. In der Udev-Regel ersetzen Sie "/bin/mount ... dann durch den Pfad zum Backup-Skript:

…, RUN+="/home/huhn/bin/sicherung.sh"

Kampf dem Netzwerkkarten-Chaos

Enthält der Rechner eine einzige Ethernet-Karte, heißt diese (nach der Einrichtung) in der Regel eth0. Wandert eine zweite Karte, zum Beispiel ein WLAN-Gerät, in die Maschine, heißt diese (abhängig vom Treiber) eventuell ath0 oder eth1. Möchten Sie, dass die Netzwerkkarten immer denselben Namen erhalten, erstellen Sie eine entsprechende Regel. Anstelle von idProduct oder idVendor geben Sie hier hinter SYSFS{address} die MAC-Adresse der Netzwerkkarte an. Diese finden Sie über den Befehl ifconfig heraus:

$ /sbin/ifconfig
eth0  Protokoll:Ethernet  Hardware Adresse 00:10:A7:21:36:7C
…
ath0  Protokoll:Ethernet  Hardware Adresse 00:00:C0:77:D8:F5
…

Die entsprechenden Regeln könnten anschließend so aussehen, wie in Listing 3 zu sehen.

Listing 3
KERNEL=="eth*", SYSFS{address}=="00:10:A7:21:36:7C", NAME="eth0"
KERNEL=="eth*", SYSFS{address}=="00:00:C0:77:D8:F5", NAME="wlan0"

Glossar

Devfs

Der Vorgänger von Udev. Das Device-Filesystem verwaltete bis Kernel 2.4 die Dateien im Verzeichnis /dev. Zu den Aufgaben gehörte unter anderem das Erstellen und Löschen der Gerätedateien von Wechselmedien. Darüber hinaus war Devfs für die Rechteverwaltung zuständig und regelte damit den Zugriff der Benutzer auf die Geräte.

Hotplug

Das Hotplug-System steuert die Initialisierung von Hardware. Das gilt nicht nur für während des Bootens gefundene Hardware, sondern auch für Geräte, die während der Laufzeit hinzugefügt und entfernt werden.

Userspace

Bereich des Arbeitsspeichers, der für Benutzeranwendungen reserviert ist (also für Programme und Daten, die nichts direkt mit dem Kernel zu tun haben).

HAL

Hardware Abstraction Layer; der HAL-Daemon stellt Informationen (zum Beispiel Treiberinformationen, Laufwerkstypen und so weiter) über alle verfügbaren Geräte für die Programme zur Verfügung.

Infos

[1] Udev-Homepage: http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html

[2] Mount und Fstab: Heike Jurzik, "Ganz schön anhänglich", LinuxUser 05/2006, S. 94, http://www.linux-user.de/ausgabe/2006/05/094-zubefehl/

Einem Freund empfehlen    Druckansicht beenden Bookmark and Share
Kommentare
udev und die MAC-Adressen
netwalker (unangemeldet), Sonntag, 15. Februar 2009 22:08:26
Ein/Ausklappen

Netter, hilfreicher Beitrag.

Leider werd ich aus Listing 3 nicht schlau:
Da sind die Buchstaben der MAC-Adressen in Grossbuchstaben
angegeben. Andere seiten weisen ausdrücklich auf Kleinbuchstaben hin. Was gilt denn nun? ist das evtl. Versions-abhängig?

Gruss
Netwalker


Bewertung: 199 Punkte bei 18 Stimmen.
Den Beitrag bewerten: Gut / Schlecht
-
Re: udev und die MAC-Adressen
Dude (unangemeldet), Donnerstag, 16. Juli 2009 12:03:01
Ein/Ausklappen

Ist egal. Wird so oder so in Großbuchstaben konvertiert.


Bewertung: 113 Punkte bei 11 Stimmen.
Den Beitrag bewerten: Gut / Schlecht