Udev Rules
Aus Gentoo Linux Wiki
| Installationsmethoden • LiveCDs • Kernel & Hardware • Laptops & Notebooks • Portage • System • Netzwerke & Services • X • Software • Anderes • alphabetischer HOWTO Index |
Udev hat das Ziel mit dem Kernel 2.6 eine Userspace-Lösung für ein dynamisches /dev Verzeichnis einzuführen. Die vorhergehende Lösung devfs wurde Mitte 2005 aus dem Kernel entfernt.
Basierend auf dem englischen Original, Writing udev rules, beschreibt dieses Howto das effektive Erstellen von Udev-Regeln. Wie man Udev einrichtet, erfährt man im Udev Howto.
Udev-Regeln schreiben ist optional. Für gewöhnlich wird beim Einstecken eines USB-Sticks /dev/sda1 erzeugt. Ist aber beispielsweise schon eine Digitalkamera über USB angeschlossen, wird /dev/sdb1 erzeugt. Mit eigenen Regeln kann man z.B. /dev/usbstick und /dev/digicam erzeugen lassen, um die Geräte komfortabel mounten zu können.
Inhaltsverzeichnis |
[Bearbeiten] Begriffserklärung
Auf typischen linuxbasierten Systemen wird das /dev-Verzeichnis zum Speichern von 'device nodes', den Gerätedateien, genutzt. Jedes Userspace-Programm kann über die Gerätedateien die Geräte des Systems ansprechen, zum Beispiel fragt Xorg die Gerätedatei /dev/input/mice ab. Diese Datei liefert die Eingaben der Maus zurück.
Die ursprüngliche /dev-Lösung enthielt für jedes Gerät, welches in dem System verbaut sein könnte, eine Gerätedatei und aus diesem Grund wurde das Verzeichnis /dev ziemlich groß. Devfs wurde geschaffen um das /dev Verzeichnis kleiner zu halten, indem nur Dateien gespeichert werden, zu denen auch Geräte vorhanden sind. Es treten jedoch Probleme auf, die nicht leicht zu lösen sind.
Udev ist ein "neuer" Weg um das /dev-Verzeichnis zu managen und wurde entwickelt, um die Probleme vorheriger Lösungen zu beseitigen. Die Gerätedateien erstellt Udev nach bestimmten Regeln, die zum einen vorgefertigt mit dem Programm installiert werden und zum anderen über Regeln, die sich der Benutzer selber schreibt.
sysfs ist ein neues Dateisystem im 2.6er-Kernel und ist nicht zu verwechseln mit Dateisystemen wie ext3 oder reiserfs. Der Kernel gibt per sysfs grundlegende Informationen über die Geräte aus und Udev nutzt diese Informationen, um passende Gerätedateien zu erstellen. sysfs ist unter /sys eingehängt, worüber auch der Zugriff erfolgt.
[Bearbeiten] Grundlegendes über das Schreiben von Udev-Regeln
Beim Erstellen von /dev überprüft Udev anhand von Konfigurationsdateien, wie die Gerätedateien zu benennen sind.
Die Standard-Udev-Regeln sind in /etc/udev/rules.d/50-udev.rules gespeichert; man sollte seine eigenen Regeln nicht in diese Datei schreiben, da diese bei Udev durch etc-update überschrieben werden.
Dateien in /etc/udev/rules.d/ werden in einer lexikalischen Ordnung aufgerufen. Udev durchsucht chronologisch die Dateien solange, bis es für das Gerät eine entsprechende Regel gefunden hat. Es ist wichtig, dass die eigenen Regeln vor der Standarddatei aufgerufen wird. Dazu erstellt man sich eine Datei, deren Zahl niedriger als die der Standarddatei ist, zum Beispiel /etc/udev/rules.d/10-udev.rules.
Die Standard-Syntax einer Regel ist:
key,[key,...] name [, symlink]
- keys werden benutzt, um die Regel einem Gerät zuzuordnen.
- Für die Benennung der zu erstellenden Gerätedatei ist der Parameter name wichtig.
- Der optionale Symlink erlaubt zusätzliche, verlinkte Dateien zu erstellen.
- keys werden mit zwei Gleichheitszeichen angegeben, Zuweisungen nur mit einem.
Ein kleines Beispiel:
BUS=="usb", SYSFS{serial}=="HXOLL0012202323480", NAME="lp_epson", SYMLINK="printers/epson_stylus"
Die Keys sind in dem Fall die Parameter BUS und SYSFS{serial}. Udev wendet diese Regel auf Geräte an, die mit dem USB-Port verbunden werden und die Seriennummer HXOLL0012202323480 aufweisen. Alle Keys müssen mit dem Gerät übereinstimmen, ansonsten wird nicht die gewünschte Gerätedatei erstellt. Udev nennt die Gerätedatei lp_epson, zu finden ist diese dann unter /dev/lp_epson. Udev wird weiterhin einen Symlink /dev/printers/epson_stylus auf /dev/lp_epson setzen und das /dev/printers-Verzeichnis automatisch erstellen. Über beide Dateien lässt sich nun der Drucker ansprechen.
[Bearbeiten] Weitere Infos für die NAME- und SYMLINK-Parameter
Mit den NAME- und SYMLINK-Parametern einer Regel ist man in der Lage, Standardoperatoren für das Benennen der Gerätedateien zu verwenden. Zum Beispiel:
BUS=="usb", SYSFS{vendor}=="FUJIFILM", SYSFS{model}=="M100", NAME="camera%n"
Der %n-Operator wird durch die "Kernel-Nummer" der Kamera ersetzt und ergibt camera0, camera1, usw.
Ein anderer Operator ist %k. Er gibt an, wie der Kernel das Gerät benennen würde, z.B. "hda1". NAME="%k" produziert Standardnamen für die betreffende Hardware.
Eine komplette Liste der Operatoren inkl. Erklärungen findet man in der Udev manpage.
[Bearbeiten] Shellähnliche Expansion in Keys nutzen
Man kann die aus der Shell bekannte Dateinamenexpansion nutzen, um mehr Flexiblität beim Schreiben von Udev-Regeln zu erreichen. Hier ein Beispiel einer Standardregel:
KERNEL=="ts*", NAME="input/%k"
Der *-Operator wird genutzt, um die Regel für ts0, ts1 usw nutzbar zu machen.
Die Bedeutung der einzelnen Zeichen:
- * eine beliebige Zeichenfolge, auch die leere
- ? ein beliebiges einzelnes Zeichen
- [...] eines der in [...] aufgeführten Zeichen
- [!...] keines der in [!...] aufgeführten Zeichen (das Ausrufezeichen wirkt als Negation)
Ein weiteres Beispiel:
KERNEL=="fd[0-9]*", NAME="floppy/%n"
Mit der Regel werden alle fd0, fd1, ..., fd9 erfasst.
[Bearbeiten] Key
Udev unterstützt ein paar Standardzuordnungsmethoden und ebenso flexible Möglichkeiten, per SYSFS eine Regel dem gwünschten Gerät eindeutig zuzuordnen. Eine typische Regel beinhaltet die zwei normalen Keys BUS und KERNEL; SYSFS differenziert zwischen der Hardware, die zum Beispiel in den selben Port eingesteckt wird.
"Wie kann ich die Seriennummer meines Druckers herausfinden oder was ist das Model meiner Kamera?" Das Regelschreiben ist nicht so schwer wie es klingt, das Schwierigste daran ist herauszufinden, wo in /sys das Gerät zu finden ist und für welche Informationen man sich entscheidet.
[Bearbeiten] Geräte mit Standard Keys identifizieren
Die Udev manpage beinhaltet mehr Infos zu diesen Keys.
Diese sind z.B.:
- BUS - Bustyp des Gerätes.
- KERNEL - Wie der Kernel das Gerät benennen würde.
- ID - Gerätenummer bezüglich des Bus (z.b. PCI bus ID).
- PLACE - Die physikalische Position, wo das Gerät eingesteckt ist (nützlich für USB).
Dieses Dokument bezieht sich hauptsächlich auf die BUS-, KERNEL- und SYSFS{...}-Keys.
[Bearbeiten] Geräte mit Hilfe der SYSFS-Dateien identifizieren
Hintergrundinformation: SYSFS speichert viele kleine Dateien in einem Verzeichnisbaum unter /sys, die Informationen über die Hardware geben. Eine Datei enthält normalerweise eine Information, z.b. Gerätename, Hersteller oder Produkt ID.
SYSFS{...}-Keys können mit den Standardkeys kombiniert werden.
Man kann die Keys in dem Format SYSFS{filename} für eine spezifische Info von SYSFS nutzen. Wenn ich zum Beispiel meinen USB-Stick einstecke, dann wird für den Stick unter /sys mehrere Dateien erzeugt, eine davon ist z.B. /sys/block/sda/device/model und enthält "Mobile Disk". Um diese zu nutzen, kann man dann in der Regel den Key SYSFS{model}=="Mobile Disk" nutzen, wobei es egal ist, ob die Datei unter /sys/block/sda/device/ oder /sys/block/sdb/device/ zu finden ist.
udevinfo, ein Tool in dem Udev-Paket, erleichtert die Suche nach den passenden Informationen.
Zuerst muss man herausfinden, welches Verzeichnis in /sys zu finden ist, das zu der gewünschten Hardware gehört. Eine Datei namens "dev" muss in dem Verzeichnis enthalten sein, da udevinfo nicht mit anderen Verzeichnissen arbeiten kann. Diese Verzeichnisse findet man nur unter /sys/block oder /sys/class, allerdings folgt udevinfo Links in dem Verzeichnis und liest komplett die Informationen aus, die auch an anderen Stellen in /sys gespeichert sind.
Wenn man ein Verzeichnis dieses Typs gefunden hat, kann man folgendendes Kommando ausführen, um die Infos zum Regelschreiben zu erhalten:
udevinfo -a -p /sys/pfad/zur/hardware/info
Es ist nicht immer nötig, das Verzeichnis in /sys per Hand zu finden. Wenn man ein Gerät ansteckt und in /dev eine Gerätedatei erzeugt wird, kann man sich mit diesen den Pfad zu dem /sys-Verzeichnis mit udevinfo ausgeben lassen. Zum Beispiel, wenn man seinen USB-Stick ansteckt:
udevinfo -q path -n /dev/sda
/block/sda
Nun kann man "udevinfo -a -p /sys/block/sda" ausführen um sich die Infos anzeigen zu lassen. Alternativ kann man auch beide Kommandos verknüpfen:
udevinfo -a -p `udevinfo -q path -n /dev/sda`
Als Beispiel eine Ausgabe für weiterführende Informationen:
follow the class device's "device"
looking at the device chain at '/sys/devices/pci0000:00/0000:00:02.1/usb3/3-3/3-3:1.0/host0/0:0:0:0':
BUS="scsi"
ID="0:0:0:0"
SYSFS{detach_state}="0"
SYSFS{type}="0"
SYSFS{max_sectors}="240"
SYSFS{device_blocked}="0"
SYSFS{queue_depth}="1"
SYSFS{scsi_level}="3"
SYSFS{vendor}=" "
SYSFS{model}="USB 2.0M DSC "
SYSFS{rev}="1.00"
SYSFS{online}="1"
looking at the device chain at '/sys/devices/pci0000:00/0000:00:02.1/usb3/3-3':
BUS="usb"
ID="3-3"
SYSFS{detach_state}="0"
SYSFS{bNumInterfaces}=" 1"
SYSFS{bConfigurationValue}="1"
SYSFS{bmAttributes}="c0"
SYSFS{bMaxPower}=" 0mA"
SYSFS{idVendor}="052b"
SYSFS{idProduct}="1514"
SYSFS{bcdDevice}="0100"
SYSFS{bDeviceClass}="00"
SYSFS{bDeviceSubClass}="00"
SYSFS{bDeviceProtocol}="00"
SYSFS{bNumConfigurations}="1"
SYSFS{speed}="12"
SYSFS{manufacturer}="Tekom Technologies, Inc"
SYSFS{product}="USB 2.0M DSC"
Das udevinfo-Tool zeigt jede Menge Informationen, die man einfach mit copy'n'paste in die Udev-Regeln einfügen kann. Bei SYSFS{model}="USB 2.0M DSC " sollte man beispielsweise die Leerzeichen am Ende entfernen, da sonst die Regel nicht greifen wird. Auch folgendes Beispiel wird nicht funktionieren:
BUS=="scsi", SYSFS{manufacturer}=="Tekom Technologies, Inc", NAME="%k"
Der Grund ist, dass Informationen kombiniert wurden, die in unterschiedlichen Verzeichnissen unter /sys gespeichert sind. Die Regel wird erst funktionieren, wenn man BUS=="scsi" mit BUS=="usb" austauscht, da SYSFS{manufacturer} und BUS=="usb" im selben Verzeichnis gespeichert sind.
Viele Informationen sind nicht relevant zum Regelschreiben, gerätspezifische Angaben wie model, product oder manufactorer sind geeignet.
Bedenke, dass beim Schreiben der eigenen Regeln die devfs-ähnelnde Regel keinen Effekt mehr hat. Es hat oft Sinn, den Parameter NAME="%k" zu nutzen und den gewünschten, eigenen Namen mit dem SYMLINK Parameter zu setzen.
Nützliche Infos für die zu erstellenden Regeln können bei KDE im Kontrollzentrum gefunden werden. Ein Blick in das Info Center können die gewünschten Infos wie number, vendor ID, etc zeigen.
[Bearbeiten] Beispiele, Tipps und Tricks
[Bearbeiten] Beispiel 1: USB-Drucker
Nach Einstecken des Druckers begibt man sich auf die Suche nach den Informationen. Dies kann man in /sys machen, indem man den Inhalt von /dev vergleicht, bevor und nachdem der Drucker eingesteckt wurde. So findet man zum Beispiel die Gerätedatei /dev/lp0. Nun kommt udevinfo zum Einsatz:
udevinfo -q path -n /dev/lp0
Ausgabe:
/class/usb/lp0
Mit udevinfo -a -p /sys/class/usb/lp0 erhält man die benötigten Infos. Zum Beispiel (gekürzt):
looking at the device chain at '/sys/devices/pci0000:00/0000:00:02.1/usb3/3-3':
BUS="usb"
SYSFS{manufacturer}="EPSON"
SYSFS{product}="USB Printer"
SYSFS{serial}="L72010011070626380"
Die Regel kann nun wie folgt lauten:
BUS=="usb", SYSFS{serial}=="L72010011070626380", NAME="%k", SYMLINK="epson_680"
Für das Beispiel existiert die Gerätedatei unter /dev/lp0 und /dev/epson_680 zeigt auf die zu dem Drucker zugehörige Gerätedatei.
[Bearbeiten] Beispiel 2: USB-Massenspeicher Digicam
Bemerkung: Nicht jede Kamera lässt sich wie ein USB-Stick ansprechen, manche benötigen extra Software wie zum Beispiel gphoto2 um auf die Bilder zuzugreifen.
Nach dem Einstecken werden normalerweise Gerätedateien erzeugt: /dev/sda und /dev/sda1 und/oder evtl. /dev/sg1. Dies ist ein Beispiel, warum eine Regel möglichst genau sein sollte. Ist sie es nicht, dann könnte sie auf alle drei genannten Gerätedateien zutreffen. In diesem Fall wird die Regel nicht beachtet.
/dev/sda1 ist die Gerätedatei, die man vielleicht auch gern als /dev/camera für den bequemen Zugriff hätte. Udevinfo zeigt meist keine nützlichen Unterschiede zwischen sda, sda1, and sg1. In dem Fall kommt der KERNEL Parameter zum Einsatz.
KERNEL=="sd?1" würde auf Kernel Namen wie "sda1", "sdb1" oder "sdc1" zutreffen, auf "sda", "sdb", oder "sg1" nicht.
Da diese Gerätedatei (sda1) ein "block device", ist der Blick in /sys/block ein guter Ort für die Suche.
In /sys/block wird ein Verzeichnis erstellt: /sys/block/sda, und ein Unterverzeichnis sda1. Beide Verzeichnisse hatten in dem Beispiel eine "dev" Datei, so kann man entweder:
udevinfo -a -p /sys/block/sda
oder:
udevinfo -a -p /sys/block/sda/sda1
ausführen.
Mithilfe der Ausgabe wurde die Regel wie folgt erstellt:
BUS=="usb", SYSFS{product}=="USB 2.0M DSC", KERNEL=="sd?1", NAME="%k", SYMLINK="camera"
[Bearbeiten] Zusätzliche Infos zu USB Massenspeichern
Bei USB Festplatten, die mit mehreren Partitionen ausgestattet ist, kann folgende Regel als Beispiel dienen:
BUS=="usb", KERNEL=="sd*", SYSFS{product}=="USB 2.0 Storage Device", NAME="%k", SYMLINK="usbhd%n"
Die Regel kann folgende Symlinks kreieren:
- /dev/usbhd - Für den Zugriff mit fdisk
- /dev/usbhd1 - Die erste Partition
- /dev/usbhd2 - Die zweite Partition
Bei Cardreadern oder dem Erstellen von Partitionen passiert es allerdings dass nach dem Einstecken einer anderen Karte oder nachdem eine Partition erstellt wurde, dass kein neuer Symlink nach dem obigen Schema erstellt wird. Bedenke dass folgendes nicht mit jedem Cardreader funktioniert, einige müssen mit der Karte neu angesteckt werden um überhaupt Zugriff auf die Karte zu bekommen. Um nun nicht das Gerät neu anstecken zu müssen, damit der Symlink erstellt wird, kann man die Regel auch wie folgt schreiben:
BUS=="usb", SYSFS{product}=="USB 2.0 Storage Device", NAME{all_partitions}="usbhd"
[Bearbeiten] Beispiel 3: CD Laufwerke
IDE CD-Laufwerke werden für gewöhnlich wie Festplatten benannt. Also hdc zum Beispiel, wenn das Laufwerk als Master am sekundären IDE-Port hängt. Folgendes Beispiel, wenn man die Laufwerke zusätzlich unter einem anderen Namen ansprechen möchte:
BUS=="ide", KERNEL=="hdc", NAME="%k", SYMLINK="dvd cdroms/cdrom%n" BUS=="ide", KERNEL=="hdd", NAME="%k", SYMLINK="cdrw cdroms/cdrom%n"
[Bearbeiten] Beispiel 4: Netzwerkkarte
Mit Udev ist es auch möglich Netzwerkkarten umzubenennen. Normalerweise werden für die Karten keine Gerätedateien unter /dev erstellt.
Mit ifconfig kann man den vom System verwendeten Namen (z.B. eth0) herausfinden.
Wenn man nun eth0 umbenennen will, benötigt man die von
udevinfo -a -p /sys/class/net/eth0/
bereitgestellten Informationen (Ausgabe gekürzt).
looking at class device '/sys/class/net/eth0':
SYSFS{address}="00:52:8b:d5:04:48"
Jede Netzwerkkarte hat eine spezifische MAC-Adresse, die man sich wie oben gezeigt anzeigen lassen kann. Die Regel kann nun wie folgt aussehen:
KERNEL=="eth*", SYSFS{address}=="00:52:8b:d5:04:48", NAME="lan"
!!! WICHTIG !!! hierbei ist, das man die Ausgabe von "udevinfo" benutzt und nicht die MAC-Adresse die von "ifconfig" ausgegeben wird. Es sind zwar beide gleich, jedoch mit dem Unterschied, das "ifconfig" die Buchstaben der MAC-Adresse immer groß schreibt. Da die Regeln jedoch case-sensitiv sind (Groß- und Kleinbuchstaben werden unterschieden), bekommt man mit der MAC-Adresse von "ifconfig" Probleme.
Damit die Regel dann greift, muss man den Treiber der Karte neuladen oder das Modul neuladen. Das System muss man nun so konfigurieren, dass es statt "eth0" als Netzwerkkartennamen "lan" benutzt. Ifconfig sollte nun "lan" als Kartennamen ausgeben.
Nicht zu vergessen ist, dass man den Symlink unter /etc/init.d/ anpassen muss:
cd /etc/init.d/ rm net.eth0 ln -s net.lo net.lan
Ergänzung: Wenn man ständig eine andere MAC-Adresse benutzt, sollte man die Regel etwas anpassen: Wichtig ist die ID entsprechend der Ausgabe von udevinfo anzupassen. Damit wird der Name "lan" entsprechend dem PCI-Steckplatz vergeben und damit unabhängig der MAC-Adresse:
Beispiel:
KERNEL=="eth*", ID=="0000:01:0a.0", NAME="lan"
[Bearbeiten] Anmerkungen
- Wenn für das Gerät unter /dev eine Gerätedatei erzeugt wurde, kann der Pfad zum /sys-Verzeichnis folgendermaßen ausgeben werden:
udevinfo -q path -n /dev/yournode
- Falls man nicht fündig wird, kann man sich alle Verzeichnisse unter /sys anzeigen lassen, die die Datei "dev" enthalten, um diese dann mit udevinfo zu durchsuchen:
find /sys -iname dev
- Wenn das Gerät ein Flash-Cardreader, Usb Flash-Drive (Stick, HDD, etc) oder eine Digitale Kamera (die als USB-Massenspeicher arbeitet) ist, schaue zuerst in /sys/block/sdX.
- Wenn für USB Drucker /dev/lpX erzeugt wird, dann hilft ein erster Blick in /sys/class/usb/lpX.
- Für USB-Scanner kann man keine Regel schreiben, hier hilft das Udev Howto weiter.
- Der Kernel exportiert nicht für alle Geräte Informationen in SYSFS, für die betroffenen Geräte kann man zur Zeit keine Regeln schreiben
[Bearbeiten] USB-Sticks einhängen
Zum automatischen Einhängen von USB-Sticks kann man folgende Regel verwenden
# mount block device when added SUBSYSTEM=="block", ACTION=="add", RUN+="/usr/local/bin/mount-device.sh /dev/%k"
Dazu benötigt man ein Skript /usr/local/bin/mount-device.sh à la
#!/bin/sh
DEVICE="$1"
GID=`grep plugdev /etc/group | cut -d: -f 3`
if [ "$DEVICE" = "" ] ; then exit 1 ; fi
# wait a moment till' hal has information about the device
sleep 2
HAL_UID=`hal-find-by-property --key block.device --string "$DEVICE"`
if [ "$HAL_UID" = "" ]
then
# can't find device in hal db
MOUNTPOINT=/media/${DEVICE##/dev/}
else
LABEL=`hal-get-property --key volume.label --udi "$HAL_UID"`
if [ "$LABEL" != "" ]
then
MOUNTPOINT="/media/$LABEL"
else
MOUNTPOINT=/media/${DEVICE##/dev/}
fi
fi
mkdir -p "$MOUNTPOINT" &&
touch "$MOUNTPOINT"/.created_by_pmount &&
mount "$DEVICE" "$MOUNTPOINT" -o gid=$GID,umask=007 ||
rm "$MOUNTPOINT"/.created_by_pmount &&
rmdir "$MOUNTPOINT"
Die Datei .created_by_pmount wird angelegt, damit pumount das angelegte Verzeichnis wieder entfernt. Typischerweise ruft das Skript /usr/lib/hal/hal-unmount.sh pumount auf, wenn der USB-Stick wieder entfernt wird. pmount sollte also installiert sein!
[Bearbeiten] SYMLINK Regeln erstellen
Ein anderes Feature von Udev ist, dass man Regeln erstellen kann, die kein NAME beinhalten. Diese werden in Verbindung mit normalen Regeln genutzt um mehrere Symlinks zu erstellen. Zum Beispiel:
KERNEL=="hdc", SYMLINK="dvd"
Wenn Udev diese "Symlink-Regel" findet, wird es später diese anwenden wenn die passende normale Regel angewandt wurde.
Wie normale Regeln wird Udev diese Regeln nur anwenden, wenn diese vor den eigentlichen aufgerufen wird.
[Bearbeiten] Links
Udev Installation und Problemlösung
Der Originalauthor: Daniel Drake
Übersetzt, ein wenig umgeschrieben und dem Wiki angepasst von --Misterjack 23:14, 20. Dez 2004 (GMT)
