Diese Seite wird aktuell überarbeitet. Bitte hier keine Änderungen mehr vornehmen, sondern in Baustelle/udev!
Ubuntu 12.04 „Precise Pangolin“
Ubuntu 10.04 „Lucid Lynx“
Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
udev ist ein Programm zur Überwachung und Auswertung von hotplug-Ereignissen. Bekommt udev Informationen über ein neues Gerät, wertet es diese anhand frei konfigurierbarer Regeln aus und gibt dem Gerät einen Namen. Anhand dieses Namens ist es dann als neue Gerätedatei im /dev/-Verzeichnis ansprechbar.
Nach udev-Regeln wird entschieden, wie ein Gerät heißt und was passieren soll, wenn ein Gerät erkannt wird, das einer Regel entspricht. Um den Namen zu vergeben, wird ein Symlink vom Kernelnamen des Geräts zu dem Namen erzeugt, den es bekommen soll. Die Regeln liegen in /lib/udev/rules.d/ bzw. bei älteren Systemen auch in /etc/udev/rules.d/. Die einzelnen Regeldateien beginnen hier mit einer zweistelligen Zahl. So ist sichergestellt, dass wichtige Regeln zuerst behandelt werden. Die Regeln werden in alphanumerischer Reihenfolge abgearbeitet. Es können mehrere Regeln auf ein Gerät angewendet werden, das hat z.B. den Vorteil, dass ein Gerät mit mehreren Symlinks ausgestattet wird.
Eigene udev-Regeln legt man im Verzeichnis /etc/udev/rules.d/ ab. Um sicherzugehen, dass die eigenen Regeln vor den Systemstandards ausgeführt werden, sollte man die Datei mit einer niedrigen Zahl beginnen lassen. Wichtig ist auch, dass die Dateien, die die Regeln enthalten, mit .rules enden, da sie sonst nicht ausgeführt werden.
Ab Ubuntu 10.04 Lucid Lynx werden über udev auch Eingabegeräte konfiguriert, da HAL entfällt. Weitere Hinweise hierzu findet man im englischen Wiki .
SYSFS
wird in zukünftigen Versionen durch ATTR
für Events (event device) und ATTRS
für den Haupteintrag ("parent device") verwendet (siehe Beispiel von udevadm weiter unten im Artikel).
Eigene Regeln sind z.B. sinnvoll, wenn man mehrere USB-Massenspeicher besitzt und diese nicht mit eindeutig zugeordneten Verzeichnis- oder Gerätenamen eingebunden werden. Dies ist dann ärgerlich, wenn z.B. auf einer USB-Festplatte mp3-Dateien liegen, die Platte aber immer anders eingebunden wird und die Sammlung vom Mediaplayer dann neu eingelesen werden muss.
Mit udev erreicht man auch eine Unabhängigkeit von der Einschaltreihenfolge. Gerätenamen werden unter Linux "hochgezählt", so heißt z.B. der erste USB-Stick /dev/sda1, der zweite /dev/sdb1. Das System kennt zunächst keinen Unterschied zwischen beiden Sticks.
Ein ähnliches Problem ergibt sich beim fehlerhaften Aushängen von Geräten. Das Gerät verschwindet plötzlich aus dem System, Gerätedateien, z.B. /dev/cdrom funktionieren nicht mehr. SCSI-Geräte werden bei Fehlern einfach "hochgezählt" und fehlerhafte Gerätedateien verworfen. Ein zunächst als sr0 eingebundenes Gerät heißt nach einem Trennen der Verbindung ("disconnect") etwa sr1, und der zugehörige Verweis - z.B. von /dev/cdrom auf /dev/sr0 - ist dann nicht mehr verwendbar.
#USB-Stick SUBSYSTEMS=="usb", KERNEL=="sd?1", SYSFS{idVendor}=="0204", SYMLINK+="usbstick", RUN+="/usr/local/bin/usbstick-backup" #USB HDD Musik SUBSYSTEMS=="usb", KERNEL=="sd?1", SYSFS{serial}=="ABCDEF012345", SYMLINK+="musik" #externes LG DVD-ROM SUBSYSTEMS=="scsi", KERNEL=="sr?", ATTRS{model}=="DVD-ROM GDR8163B", NAME="dvd-rom-lg" #Handy sync SUBSYSTEMS=="usb", SYSFS{serial}=="123456789123456789" , OWNER="benutzername"
Hier sieht man vier Beispiele für udev-Regeln.
Im ersten Beispiel wird ein USB-Stick, der die Herstellernummer "0204" übermittelt, als /dev/usbstick erzeugt und ein Skript usbstick-backup gestartet.
Im zweiten Beispiel wird eine USB-Festplatte über die Seriennummer erkannt, und die Gerätedatei wird in /dev/musik erzeugt.
Das dritte Beispiel bindet ein externes USB-DVD-Laufwerk mit der Modellbezeichnung "DVD-ROM GDR8163B" immer mit denselben Gerätenamen /dev/dvd-rom-lg ein, unabhängig davon, ob es als sr1
, sr2
oder sr3
eingebunden wird.
Das vierten Beispiel schaltet ein Mobilegerät am USB-Port für den Zugriff als normaler Benutzer frei. Das ermöglicht die Synchronisierung z.B. per OpenSync.
Hier wird die Erstellung eigener udev-Regeln am Beispiel einer USB-Festplatte und eines externen USB-DVD-Laufwerks erklärt.
Die Aufgabe ist, die USB-Festplatte beim Einschalten oder Anstecken automatisch einzubinden und ein Backup-Skript zu starten, um eine bequeme Datensicherung durchzuführen.
Die Aufgabe für das DVD-Laufwerk ist simpler. Es geht darum, dass das Gerät immer unter einem spezifischen Gerätenamen verfügbar ist.
Zunächst müssen Informationen über die Geräte gesammelt werden. Diese werden später als Filter zur Erkennung des Gerätes genutzt. Informationen kann man auf mehrerlei Weise sammeln.
Es kann sein, dass eine Kamera nicht als Massenspeichermedium erkannt wird, sondern nur über das Protokoll Gphoto2 arbeitet. In diesem Fall erfolgt die Bearbeitung durch normale ("Userspace") Programme anstatt über einen Kernel-Treiber. Das Problem daran ist vor allem, dass die später erwähnten Kernel-Namen in diesem Fall nicht funktionieren, da die Kamera ja kein Block-Device ist.
Zunächst die USB-Festplatte: Zuerst sollte man das Gerät anstecken oder einschalten und im Terminal[1] folgenden Befehl ausführen:
sudo lsusb
Die Ausgabe sieht dann in etwa wie folgt aus:
Bus 005 Device 036: ID 04b4:6830 Cypress Semiconductor Corp. USB-2.0 IDE Adapter Bus 005 Device 033: ID 144d:c019 Bus 005 Device 001: ID 0000:0000 Bus 001 Device 001: ID 0000:0000 Bus 003 Device 001: ID 0000:0000 Bus 004 Device 001: ID 0000:0000 Bus 002 Device 001: ID 0000:0000
Wichtig ist die Nummer hinter Device
, hier die 036
.
Jetzt führt man Folgendes aus:
sudo lsusb -v > ~/lsusb.txt
Die Ausgabe von lsusb
wird hierbei in die Datei lsusb.txt im Homeverzeichnis umgelenkt, man öffnet sie am besten mit einem Editor [2].
Dort sucht man dann den Abschnitt, der wie folgt beginnt:
Bus 005 Device 036: ID 04b4:6830 Cypress Semiconductor Corp. USB-2.0 IDE Adapter
Darunter sind viele Eigenschaften des Gerätes aufgeführt, man benötigt aber nur den Abschnitt Device Descriptor
:
Bus 005 Device 013: ID 04b4:6830 Cypress Semiconductor Corp. USB-2.0 IDE Adapter Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x0ab4 Cypress Semiconductor Corp. idProduct 0x685a USB-2.0 IDE Adapter bcdDevice 0.01 iManufacturer 56 Cypress Semiconductor iProduct 78 USB2.0 Storage Device iSerial 100 ABCDEF012345 bNumConfigurations 1
Hier sind vor allem die Zeilen idVendor
, idProduct
und iSerial
interessant.
SCSI- oder andere Geräte können eine andere Vorgehensweise nötig machen. Dazu verwendet man die Angaben aus der Logdatei /var/log/messages (in Ubuntu 11.10: /var/log/syslog), dort werden am Ende die Linuxkernel-Informationen anzeigt, z.B. mit dem Befehl
tail -n 10 -f /var/log/messages
bzw. in Ubuntu 11.10
tail -n 10 -f /var/log/syslog
Wie oben sollte man anschließend das Gerät - den Scanner, ein SCSI-Laufwerk, Mobiltelefon, Kamera - anstecken oder einschalten. Die Ausgabe für ein externes USB-DVD-Gerät, welches als SCSI-Gerät erkannt wird, zeigt, was nach dem Einstecken passiert.
[51755.613225] usb 4-1: new high speed USB device using ehci_hcd and address 16 [51755.754296] usb 4-1: configuration #1 chosen from 1 choice [51755.766872] scsi13 : SCSI emulation for USB Mass Storage devices [51755.767872] usb-storage: device found at 16 [51755.767880] usb-storage: waiting for device to settle before scanning [51760.764575] usb-storage: device scan complete [51760.769702] scsi 13:0:0:0: CD-ROM HL-DT-ST DVD-ROM GDR8163B 0L23 PQ: 0 ANSI: 0 [51760.790142] sr1: scsi3-mmc drive: 52x/52x cd/rw xa/form2 cdda tray [51760.790274] sr 13:0:0:0: Attached scsi CD-ROM sr1 [51760.790372] sr 13:0:0:0: Attached scsi generic sg1 type 5
Wie man sieht, wurde ein externes CD-ROM-USB-Laufwerk eingesteckt, das jedoch als SCSI-Gerät erkannt und geführt wird: sr1. Wenn die Erkennung des Gerätes nach ein paar Sekunden abgeschlossen ist, kann man die Ausgabe abbrechen. Eine Kontrolle im /dev/-(Geräte)-Verzeichnis zeigt die Existenz des neuen Gerätes /dev/sr1:
ls -l /dev/sr1
Nun kann man mit diesem Gerätenamen (/dev/sr1) genaue Informationen darüber finden, mit welchen Attributen das Gerät im System geführt wird. Diese Attribute können später 1:1 für eine udev-Regel verwendet werden. Die Eingabe des Befehls
udevadm info --query=all --name=/dev/sr1
bzw. ab Ubuntu 9.10
udevadm info --query=all --attribute-walk --name=/dev/sr1
führt meist zu einer sehr langen Ausgabe, da alle beim Einstecken des Gerätes beteiligten Systeme angezeigt werden. Dies können z.B. sein
einzelne Chipsätze, Controller
Subsysteme, wie verschiedene USB Systeme (1.0, 1.1, 2.0)
Linux-Treiber (z.B. ehci_hcd)
einzelne Partitionen des Gerätes
Entsprechend abgestimmt kann die Erkennung dieser Geräte mit udev für einen speziellen Zweck erfolgen. Es ist jedoch mit ein wenig Fantasie möglich, die Spreu vom Weizen zu trennen.
Die Ausgabe der beteiligten (Unter-)Systeme erfolgt blockweise. Jeder Block beginnt mit:
looking at ...
Der erste Ausgabeblock für das obige Gerät lautet z.B.
looking at device '/block/sr1': KERNEL=="sr1" SUBSYSTEM=="block" [...]
Der nächste und in diesem Fall interessante Ausgabeblock:
looking at parent device '/devices/pci0000:00/[...gekürzt]': [...] SUBSYSTEMS=="scsi" [...] ATTRS{model}=="DVD-ROM GDR8163B" ATTRS{vendor}=="HL-DT-ST" [...]
Hier bekommt man direkt die nötigen Informationen, welche später als "Filter" zur Erkennung eines spezifischen Gerätes verwendet werden können. Hier nimmt man die Modellnummer (ATTRS{model}
), um das DVD-Laufwerk als solches eindeutig zu erkennen. Der Unterschied zur Methode mit lsusb
ist, dass man dies für beliebige Geräte anwenden kann und direkt die Attributnamen (ATTRS{...}
) für die Erstellung der udev-Regeln verwenden kann. Beliebt ist auch die Seriennummer des Gerätes, meist ATTRS{serial}
.
udev-Regeln erstellt man in einem Editor mit Root-Rechten [2]. Es ist vorteilhaft für spätere Änderungen, nicht mit Kommentaren zu sparen.
# USB-Festplatte für Backups
Nun geht es an das eigentliche Erstellen der udev-Regel. Da die Festplatte am USB-Port hängt, wird dies der erste Teil der Regel:
SUBSYSTEMS=="usb"
USB-Festplatten werden vom Kernel meist mit /dev/sda oder /dev/sdb usw. benannt, die erste Partition dann /dev/sda1 usw. Daher wird als Regel gesetzt, dass das Gerät als sd?1 erkannt werden wird:
SUBSYSTEMS=="usb", KERNEL=="sd?1"
Nun braucht man die Werte, die man vorher ermittelt hat. Ist die iSerial
vorhanden bzw. nicht Null, ist der beste Weg, das Gerät über die Seriennummer zu erkennen:
SUBSYSTEMS=="usb", KERNEL=="sd?1",SYSFS{serial}=="Hier Serialnummer einfügen"
Ist die iSerial
nicht gesetzt, kann man die Erkennung auch alternativ über idProduct
:
SUBSYSTEMS=="usb", KERNEL=="sd?1",SYSFS{idProduct}=="685a"
oder über idVendor
machen.
SUBSYSTEMS=="usb", KERNEL=="sd?1",SYSFS{idVendor}=="0ab4"
Ist das geschehen, kann man bestimmen, welchen Namen das Gerät bekommen soll:
SUBSYSTEMS=="usb", KERNEL=="sd?1",SYSFS{serial}=="ABCDEF012345",SYMLINK+="backup"
Mit der gleichen Methode wurde die Regel für das externe DVD-Laufwerk erstellt (drittes Beispiel der Einführung). Lediglich wurden zur näheren Bestimmung des Gerätes SUBSYSTEMS=="scsi"
und das Attribut ATTRS{model}
verwendet. Dies genügt zur eindeutigen Bestimmung.
# LG DVD-ROM SUBSYSTEMS=="scsi", KERNEL=="sr?", ATTRS{model}=="DVD-ROM GDR8163B", NAME="dvd-rom-lg"
Abschließend muss die Datei im Verzeichnis /etc/udev/rules.d/ gespeichert werden, z.B. als 70-usb-storage-custom.rules. Ein paar Richtlinien, nach denen man die Zahl am Anfang aussuchen sollte, finden sich in der Datei /etc/udev/rules.d/README.
Ein Neustart von udev ist eigentlich nicht erforderlich, da udev beim Anschließen eines neuen Gerätes automatisch die Regeln im Verzeichnis /etc/udev/rules.d/ durchgeht.
Ein Neustart kann nichts desto trotz sinnvoll sein, da udev dann alle Regeln ebenfalls neu einliest und, falls Fehler in einer Regel vorliegen, diese in /var/log/syslog protokolliert.
Für ältere Linux/Ubuntu-Versionen:
sudo /etc/init.d/udev reload
Wenn der Hinweis:
"Rather than invoking init scripts through /etc/init.d, use the service(8) utility, e.g. service udev reload"
erscheint, so funktioniert der Neustart nicht über init.d, dann muss der nächste Befehl benutzt werden!
Für neuere Linux/Ubuntu-Versionen:
sudo service udev reload
neu einlesen lassen.
Wurden Regeln für fest eingebaute Geräte (z.B. PCI-Karten) festgelegt, muss udev zusätzlich dazu veranlasst werden, alle Geräte neu einzulesen. Dies geschieht mittels
sudo udevtrigger
oder bei neueren Distributionen mittels
sudo udevadm trigger
Wurden die Regel für entfernbare Geräte erstellt, müssen diese einfach entfernt und wieder eingesteckt werden.
Der Funktionstest ist recht einfach durchzuführen, dazu muss man einfach die USB-Festplatte abziehen und neu anstecken. Ist dann eine Gerätedatei /dev/backup erstellt worden, hat alles geklappt. Wenn nicht, dann ist an der udev-Regel etwas falsch, und man sollte sie korrigieren.
Um die Festplatte auch vernünftig an einem festen Punkt im Dateisystem einbinden zu können, muss die Datei /etc/fstab angepasst werden.
Zuerst wird ein neuer Einhängepunkt angelegt [1]:
sudo mkdir /media/backup/
Anschließend muss die fstab editiert werden [2]. Da die Platte schon einmal eingebunden war, muss diese nur angepasst werden. Ein vorhandenes
/dev/sda1 /media/sda1 ext3 users,atime,noauto,rw,nodev,exec,nosuid 0 0
wird dazu in
/dev/backup /media/backup ext3 users,atime,noauto,rw,nodev,exec,nosuid 0 0
geändert.
Sollte keine Zeile vorhanden sein, die der USB-Festplatte entspricht, muss eine neue Zeile angelegt werden, siehe hierzu den Artikel über fstab.
Nun kann man die Festplatte mit
mount /media/backup
Man kann über udev ein Skript automatisch starten lassen, wenn ein Gerät erkannt wird. Hierzu werden der udev-Regel zwei weitere Punkte hinzugefügt:
SUBSYSTEMS=="usb",ACTION=="add",KERNEL=="sd?1",SYSFS{serial}=="ABCDEF012345",SYMLINK+="backup",RUN+="/usr/local/bin/backup"
Der Punkt ACTION=="add"
sorgt dafür, dass die Regel nur zutrifft, wenn das Gerät neu angeschlossen wird. Anderenfalls würde das auszuführende Skript nach Beenden sofort automatisch erneut gestartet werden.
Der Punkt RUN+="/usr/local/bin/backup"
ruft das Skript /usr/local/bin/backup auf. Dabei muss darauf geachtet werden, dass das Skript mit vollständiger Pfadangabe aufgerufen wird. Dem Punkt RUN
kann immer nur ein einzelner Befehl (mit Parametern) übergeben werden. Allerdings lassen sich über mehrere RUN+="..."
-Einträge mehrere Befehle hintereinander ausführen:
SUBSYSTEMS=="usb",ACTION=="add",KERNEL=="sd?1",SYSFS{serial}=="ABCDEF012345",SYMLINK+="backup",RUN+="/usr/bin/logger Starte Backup.", RUN+="/usr/local/bin/backup"
In obigem Beispiel wird vor Ausführung des Backup-Skripts die Zeile "Starte Backup." in das Systemlog geschrieben.
Das Skript /usr/local/bin/backup wird nun beim Anstecken der USB-Festplatte gestartet. Dabei muss es sich selbst um das korrekte Einbinden kümmern:
1 2 3 4 5 | #!/bin/sh
mount /media/backup
backup.start
eject /media/backup
|
Wenn man Nautilus in der Übersicht "Computer" öffnet, sieht man alle im System eingehängten Massenspeichergeräte. Ein -Klick auf das gewünschte Laufwerk, die Auswahl von "Eigenschaften", und ein
-Klick auf den Reiter "Drive" liefert die nötigen Informationen, welche auch durch
udevadm
auf der Kommandozeile angezeigt werden (siehe oben).
Unter "Settings" kann auch direkt ein Einhängepunkt eingegeben werden, ohne eine udev-Regel erstellen zu müssen. Der Einhängepunkt ist ein Verzeichnisname, welcher automatisch unterhalb des Verzeichnisses /media eingebunden wird.
Die weiteren Editierfelder "Dateisystemart" und "Mount Optionen" haben bis Gutsy Gibbon noch nicht funktioniert. Das Einbinden ("Mounten") wird jedoch in den meisten Fällen automatisch korrekt durchgeführt. Ein Editieren der /etc/fstab entfällt deswegen in den meisten Fällen. Auf Dauer wird dieser Dialog sicher das Erstellen von udev-Regeln nur noch in Ausnahmefällen nötig machen.
Adam hat zu wenig Festplattenspeicherplatz auf seinem PC. Er entschließt sich, eine externe USB-Festplatte zu kaufen, um damit seine Musiksammlung auszulagern. Er hört und verwaltet seine Musiksammlung mit Banshee und möchte dies auch unkompliziert weiterhin tun. Er entschließt sich, die externe Festplatte so zu integrieren, dass sie beim Anschließen sofort einsatzbereit ist und Banshee anfangen kann zu spielen. Ist die Festplatte nicht angeschlossen, ist die Musiksammlung in Banshee leer.
Folgende Schritte werden durchgeführt:
Eine Regel für udev erstellen
In fstab vier neue Einträge festlegen
Zunächst wird mit einem Editor mit Root-Rechten eine neue Datei erstellt, z.B. /etc/udev/rules.d/50-usb-storage-custom.rules. Inhalt der Datei:
# USB Festplatte für Musik SUBSYSTEMS=="usb", KERNEL=="sd?1", SYSFS{serial}=="ABCDEF012345", SYMLINK+="Adam-Music", RUN="/bin/mount /media/Adam-Music", RUN+="/bin/mount /media/Adam-Music/Music", RUN+="/bin/mount /media/Adam-Music/.config/banshee", RUN+="/bin/mount /media/Adam-Music/.config/banshee-1"
Die Regel identifiziert zuerst die externe Festplatte anhand der Seriennummer und ordnet ihr einen Namen zu. Danach wird die Festplatte erst einmal allgemein eingebunden ("mounted"). Dann werden noch weitere Aktionen durchgeführt: Das "Mounten" des Ordners mit der großen Musiksammlung und das Einbinden der beiden Konfigurationsordner von Banshee, in denen unter anderem die Musikdatenbank gespeichert ist.
Damit die Kommandos wie z.B.
/bin/mount /media/Adam-Music/Music
richtig ausgeführt werden können, müssen in die Datei /etc/fstab folgende Zeilen hinzugefügt werden:
# Adam-Music /dev/Adam-Music /media/Adam-Music ext3 users,atime,noauto,rw,nodev,exec,nosuid 0 0 /media/Adam-Music/Music /home/adam/Music none user,bind 0 0 /media/Adam-Music/.config/banshee /home/adam/.config/banshee none users,bind 0 0 /media/Adam-Music/.config/banshee-1 /home/adam/.config/banshee-1 none users,bind 0 0
Die Festplatte ist in diesem Fall mit ext3 formatiert.
Auf der externen Festplatte existieren drei Ordner: Music, .config/banshee und .config/banshee-1. Der Inhalt der drei Ordner wurde anfangs von den gleichnamigen Ordnern aus dem Homeverzeichnis von Adam auf die externe Festplatte verschoben.
Die Mountpoints /media/Adam-Music, /home/adam/Music, /home/adam/.config/banshee und /home/adam/.config/banshee-1 müssen vor dem ersten Einbinden bspw. mit mkdir angelegt werden.
Sind in den Mountpoints vor dem Einhängen der Ordner von der externen Festplatte schon Dateien vorhanden, so werden sie beim Einbinden "überdeckt". Das heißt, sie sind nicht mehr erreichbar, wenn die externe Festplatte angeschlossen ist. Nach dem Aushängen sind die Daten wieder frei zugänglich. Es empfiehlt sich, die Mountpoints leer zu lassen.
Ist die externe Festplatte gerade einmal nicht angeschlossen und Banshee wird gestartet, ist die Musiksammlung von Banshee naturgemäß leer. Außerdem generiert Banshee automatisch Inhalte in die beiden Ordner /home/adam/.config/banshee und /home/adam/.config/banshee-1, sofern die Ordner leer sind. Dies kann ignoriert werden, da dies den Mountvorgang nicht stört (siehe vorherigen Punkt).
Die externe Festplatte sollte nur angeschlossen oder ausgehängt werden, wenn Banshee gänzlich (auch im Hintergrund) geschlossen ist, da es sonst zu Dateifehlern kommen kann.
Soll die Festplatte im laufenden Betrieb entfernt werden, muss das Aushängen über ein Terminal und mit Root-Rechten erfolgen.
Wenn die Festplatte schon beim Hochfahren von Ubuntu angeschlossen ist, ist die Musiksammlung schon automatisch eingehängt.
Wenn der PC heruntergefahren ist, kann die externe Festplatte problemlos entfernt werden.
Viele Nutzer haben neben Ubuntu auch noch eine Partition (hier /dev/sda1) mit Windows. Diese Partition wird unter Orte und im Nautilus ständig angezeigt, obwohl man sie gar nicht braucht.
Mit Hilfe der folgenden Regel kann die Partition leicht ausgeblendet werden.
KERNEL=="sda1", ENV{UDISKS_PRESENTATION_HIDE}="1"
Writing udev rules (gut erklärt und mit Beispielen)
ubuntuforums.org Udev-HowTo
LinuxUser Magazin Udev-HowTo
udev-notify - grafische Rückmeldungen beim Anschluss externer Geräte