ubuntuusers.de

Du betrachtest eine alte Revision dieser Wikiseite.

udev

Artikel wird überarbeitet

Dieser Artikel wird momentan überarbeitet.

  • Geplante Fertigstellung: 25.03.2013

  • Derzeitig gültiger Artikel: udev

  • Bearbeiter: BillMaier

Solltest du dir nicht sicher sein, ob an dieser Anleitung noch gearbeitet wird, kontrolliere das Datum der letzten Änderung und entscheide, wie du weiter vorgehst.


Achtung: Insbesondere heißt das, dass dieser Artikel noch nicht fertig ist und dass wichtige Teile fehlen oder sogar falsch sein können. Bitte diesen Artikel nicht als Anleitung für Problemlösungen benutzen!

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

./udev_logo.png udev ist ein Programm, das die Gerätedateien im Verzeichnis /dev dynamisch verwaltet. Es übernimmt außerdem die Rechteverwaltung von Geräten und legt bei Bedarf Symlinks auf Gerätedateien an. Dies geschieht sowohl beim Bootvorgang als auch durch nachträgliches An- oder Abstecken eines Gerätes im laufenden Betrieb (Hotplug). Bekommt udev vom Kernel Informationen über ein Gerät (sog. device uevents), wertet es diese anhand fester, aber frei konfigurierbarer Regeln aus.

Hinweis:

Seit Ubuntu 10.04 Lucid Lynx werden über udev auch Eingabegeräte konfiguriert, da HAL entfällt. Weitere Hinweise hierzu findet man im englischen Wiki 🇬🇧.

Udev-Regeln

Udev-Regeln bestimmen, was passiert, wenn ein Gerät erkannt wird. Eine udev-Regel enthält dazu mindestens eine Bedingungen und mindestens eine Zuweisung (#Regelsyntax). Treffen alle Bedingungen einer Regel auf ein Gerät zu, werden die Zuweisungen dieser Regel ausgeführt. Auf diese Weise werden auch Gerätenamen erzeugt, unter denen das Gerät anschließend im Dateisystem zur Verfügung steht. Es können mehrere Regeln auf ein Gerät angewendet werden. Damit ist es möglich, zusätzlich zu den Standardregeln eigene Regeln auf das gleiche Gerät anzuwenden. Die einzelnen Regeldateien beginnen mit einer zweistelligen Zahl und werden in alphanumerischer Reihenfolge abgearbeitet. So ist sicher gestellt, dass wichtige Regeln zuerst behandelt werden. Werden mehrere Regeln in eine Regeldatei geschrieben, werden diese zeilenweise voneinander getrennt.

Standardregeln

Die Standardregeln liegen in /lib/udev/rules.d/. Wenige Systemregeln, wie z.B. für die Netzwerkkarten, sind unter /etc/udev/rules.d/ zu finden.

Beispiele für Standardregeln

# block
SUBSYSTEM=="block", GROUP="disk"

Dieses Beispiel zeigt eine Standardregel aus der Datei 50-udev-default.rules. Sie besagt: Gehört ein erkanntes Gerät zum Subsystem "block", wird ihm die Gruppe "disk"[3] zugewiesen.

Die nächste Regel ist etwas länger: Wird ein Gerät im Subsystem "net" mit der MAC-Adresse 57:04:b6:c2:6c:z3 erkannt, bekommt es den Namen "eth0" - und damit die Gerätedatei /dev/eth0.

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="57:04:b6:c2:6c:z3", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" 

Eigene Udev-Regeln

Sinn eigener Regeln

Standardmäßig werden Gerätenamen 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.

Das bringt einige Nachteile mit sich, wie folgende Beispiele zeigen:

  • Auf einer USB-Festplatte liegen mp3-Dateien. Da die Platte immer anders eingebunden wird, wird die Sammlung vom Mediaplayer immer neu eingelesen.

  • Ein Gerät verschwindet plötzlich aus dem System, Gerätedateien, z.B. /dev/cdrom funktionieren nicht mehr. Der Grund: 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.

  • Ein Skript soll von oder zu einem Laufwerk kopieren (z.B. bei Backups oder beim Kopieren von SD-Karten).

Durch die Verwendung eigener Regeln ist es möglich, Geräte (hier: USB-Massenspeicher) mit eindeutig zugeordneten Verzeichnis- oder Gerätenamen einzuhängen. (#Erstellen-eigener-Regeln)

Durch die großen Möglichkeiten von udev lässt sich auch erreichen, dass beim Anstecken eines Gerätes ein Skript ausgeführt wird. Das kann z.B. sehr hilfreich für Backups sein. (#Automatischer-Start-eines-Skripts)

Hinweis:

Man unterscheidet das Einbinden von Geräten vom Einhängen eines Dateisystems. Dateisysteme auf externen (USB-)Geräten werden standardmäßig mit dem Partitionsnamen (Label) oder der UUID in das Verzeichnis /media eingehängt - unabhängig vom Gerätenamen. Dadurch wird zwar eine gewisse Eindeutigkeit in der Verzeichnisstruktur gewährleistet, die aber bei einer Neuformatierung des Datenträgers wieder verloren geht. Im Gegensatz dazu kümmern sich Udev-Regeln zuerst um das Einbinden des Geräts mit einem eindeutigen Namen in das Verzeichnis /dev. Sie können sich dazu an Kriterien orientieren, die fester und eindeutiger mit dem Gerät selbst "verbunden" sind.

Beispiele für eigene Regeln

#Beispiel 1: USB HDD Musik
SUBSYSTEMS=="usb", KERNEL=="sd?1", ATTRS{serial}=="ABCDEF012345", SYMLINK+="musik"
#Beispiel 2: externes LG DVD-ROM
SUBSYSTEMS=="scsi", KERNEL=="sr?", ATTRS{model}=="DVD-ROM GDR8163B", SYMLINK+="dvd-rom-lg"
#Beispiel 3: USB-Stick für Backups
SUBSYSTEMS=="usb", KERNEL=="sd?1", ACTION=="add", ATTRS{idVendor}=="0204", ATTRS{idProduct}=="0275", SYMLINK+="usbstick", RUN+="/usr/local/bin/usbstick-backup"
#Beispiel 4: Handy sync
SUBSYSTEMS=="usb", ATTRS{serial}=="123456789123456789" , OWNER="benutzername"
  • Beispiel 1: Hier wird für eine USB-Festplatte mit der Seriennummer ABCDEF012345 die Gerätedatei /dev/musik als Symlink erzeugt.

  • Beispiel 2: Für ein externes USB-DVD-Laufwerk mit der Modellbezeichnung "DVD-ROM GDR8163B" wird der Gerätenamen /dev/dvd-rom-lg als Symlink erzeugt.

  • Beispiel 3: Ein USB-Stick, der die Herstellernummer "0204" und die Produktnummer "0275" übermittelt, wird als /dev/usbstick erzeugt und ein Skript usbstick-backup gestartet.

  • Beispiel 4: Ein Mobilegerät am USB-Port wird für den Zugriff als normaler Benutzer frei geschaltet. Das ermöglicht die Synchronisierung z.B. per OpenSync.

Erstellen eigener udev-Regeln

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 bequem eine 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.

1. Auslesen von Informationen

Zunächst müssen möglichst eindeutige Informationen über das jeweilige Gerät ausgelesen werden. Je nachdem, um was für ein Gerät es sich handelt (und wie es angeschlossen wurde) eignen sich hierfür unterschiedliche Werkzeuge. Als Universalwerkzeug eignet sich udevadm.

Als Kriterien für eine Udev-Regel empfiehlt sich insbesondere:

  • Die Seriennummer des Geräts (falls vorhanden und nicht NULL)

  • Die Kombination aus Herstellerkennung und Produktkennung

  • Die Kombination aus Hersteller und Modellbezeichnung

Informationen kann man auf mehrerlei Weise sammeln.

a) Daten über ein USB-Gerät herausfinden mit lsusb

Zunächst die USB-Festplatte: Zuerst sollte man das Gerät anstecken oder einschalten. Standardmäßig wird das Dateisystem dabei automatisch eingehängt, was sich mit mount[4] überprüfen lässt.

mount 
...
/dev/sdb1 on /media/EE80-57H2 ... [gekürzt]

Die Partition wurde als /dev/sdb1 eingebunden, das Dateisystem ist unter /media/EE80-57H2 eingehängt.

Jetzt führt man folgenden Befehl aus:

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

Anhand der Bus-Nummer und der Device-Nummer fragt man jetzt mit der Option -v detailiertere Informationen über das Gerät ab.

sudo lsusb -vs  005:036 
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

Interessant sind vor allem die Zeilen idVendor, idProduct und iSerial, da sich ihre Werte aufgrund ihrer Eindeutigkeit relativ gut für eine udev-Regel verwenden lassen.

Mit diesen Angaben lassen sich bereits funktionierende Bedingungen für eine eigene Udev-Regel bauen. Weiter mit #2-udev-Regel-schreiben-und-speichern.

b) Daten über beliebige Geräte auslesen mit udevadm

SCSI- oder andere Geräte können eine andere Vorgehensweise nötig machen. Dazu verwendet man Angaben aus der Logdatei /var/log/syslog. Dort werden am Ende die Linuxkernel-Informationen anzeigt.

Mit dem Befehl

tail -n 10 -f /var/log/syslog 

lassen sich die letzten 10 Zeilen aus der Logdatei beobachten.

Wie oben sollte man jetzt 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/-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 --attribute-walk --name=/dev/sr1 

führt meist zu einer sehr langen Ausgabe. Es ist jedoch mit ein wenig Fantasie möglich, die Spreu vom Weizen zu trennen.

Die Ausgabe beginnt beim angegebenen Block-Device (in diesem Fall beim Dateisystem /dev/sr1). Anschließend folgen alle beteiligten "Elternsysteme" in aufsteigender Reihenfolge. Dies können z.B. sein

  • einzelne Partitionen des Gerätes

  • einzelne Chipsätze, Controller

  • Adapter (z.B. USB auf SATA) oder Lesegeräte

  • Subsysteme, wie verschiedene USB Systeme (1.0, 1.1, 2.0, 3.0)

  • Linux-Treiber (z.B. ehci_hcd)

Für jedes dieser Geräte werden alle Attribute ausgegeben, die in udev-Regeln verwendet werden können. Die Ausgabe der beteiligten Elternsysteme 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"
  [...]

Jetzt sucht man sich ein Elternsystem, das möglichst eindeutige Attribute für das Gerät enthält. In diesem Fall ist das bereits der nächste Ausgabeblock:

looking at parent device '/devices/pci0000:00/[...gekürzt]':
[...]
SUBSYSTEMS=="scsi"
[...]
ATTRS{model}=="DVD-ROM GDR8163B"
ATTRS{vendor}=="HL-DT-ST"
[...]

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}.

Hinweis:

Eine Kombination von Attributen aus mehreren Elternsystemen in einer udev-Regel ist nicht möglich. Es können aber problemlos Attribute aus einem Elternsystem mit Attributen des eigentlichen Geräts zu einer Bedingung kombiniert werden, was in unserem Beispiel auch gemacht wird.

c) Alternativen

Als Alternative zu o.g. Methoden gibt es noch

udevadm monitor --property 

Da die Ausgabe aber nicht zwischen Gerät und Elternsystem unterscheidet, empfiehlt sich die Verwendung nur für routinierte Autoren von Udev-Regeln.

2. udev-Regel schreiben und speichern

Eigene udev-Regeln erstellt man in einem Editor mit Root-Rechten [2] und legt sie im Verzeichnis /etc/udev/rules.d/ ab. Um sicher zu gehen, dass die eigenen Regeln nicht anschließend von Systemstandards "überschrieben" werden, sollte man den Dateinamen mit einer hohen Zahl oder ohne Zahl beginnen. Wichtig ist, dass die Dateien, die die Regeln enthalten, mit .rules enden, da sie sonst nicht ausgeführt werden. 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 aus den oben ermittelten Werten. Zuerst nimmt man die KERNEL-Information des Geräts selbst (also sdb1 oder sr1). Da man ja will, dass die Regel auch bei anderer Nummerierung durch den Kernel zutrifft (z.B. sdc1 oder sr2), sieht der erste Eintrag so aus:

KERNEL=="sd?1"

bzw.

KERNEL=="sr?"

Jetzt kombiniert man diesen Eintrag mit den ermittelten Werten aus einem Elternsystem. (Wurde die Abfrage mit lsusb gemacht, nimmt man einfach die ermittelten Werte und fügt sie wie folgt ein:)

KERNEL=="sd?1", SUBSYSTEMS=="usb", ATTRS{serial}=="Hier Serialnummer einfügen"

Ist die iSerial nicht gesetzt, kann man die Erkennung auch alternativ über idProduct machen:

KERNEL=="sd?1", SUBSYSTEMS=="usb", ATTRS{idProduct}=="685a"

oder über idVendor:

KERNEL=="sd?1", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ab4"

oder über eine Kombination aus beiden:

KERNEL=="sd?1", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ab4", ATTRS{idProduct}=="685a"

Damit hat man bereits eindeutige Bedingungen für das Gerät definiert. Nun folgt die Zuweisung, hier der zusätzliche Gerätename in /dev:

KERNEL=="sd?1", SUBSYSTEMS=="usb", ATTRS{serial}=="ABCDEF012345",SYMLINK+="backup"

Das Gerät steht dann künftig unter /dev/backup zur Verfügung.

Hinweis:

In den Standardregeln wird die Zuweisung für eine Gerätedatei oft mit dem Schlüssel NAME erzeugt. Dies verleitet möglicherweise dazu, in eigenen Regeln NAME="backup" zu schreiben. Udev sieht aber insgesamt nur eine Zuweisung für ein Gerät über NAME vor. Im Zweifelsfall sollte deshalb der Schlüssel SYMLINK verwendet werden, da hier mehrere Zuweisungen pro Gerät möglich sind (deshalb auch der Operator +=). So wird ein Konflikt mit einer NAME-Zuweisung in einer Standardregel vermieden.

Mit der gleichen Methode wird die Regel für das externe DVD-Laufwerk erstellt (zweites Beispiel der Einführung). Lediglich wurden zur näheren Bestimmung des Gerätes SUBSYSTEMS=="scsi" und das Attribut ATTRS{model} verwendet. Auch dies genügt zur eindeutigen Bestimmung.

# LG DVD-ROM
SUBSYSTEMS=="scsi", KERNEL=="sr?", ATTRS{model}=="DVD-ROM GDR8163B", SYMLINK+="dvd-rom-lg"

Abschließend muss die Datei 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.

Automatischer Start eines Skripts

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",ATTRS{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. (Stichwort: Bootvorgang noch prüfen)

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",ATTRS{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. Voraussetzung ist ein Header im Skript mit einem gülten Shebang. Dabei muss es sich selbst um das korrekte Einbinden kümmern:

1
2
3
4
5
#!/bin/bash
#
mount /media/backup
backup.start
eject /media/backup

3. Neustart des udev-Systems

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.

Wurde die Regel für entfernbare Geräte erstellt, können diese einfach entfernt und wieder eingesteckt werden.

Wurden Regeln für fest eingebaute Geräte (z.B. PCI-Karten) festgelegt, muss udev aber dazu veranlasst werden, alle Geräte neu einzulesen. Dies geschieht mittels

sudo udevadm trigger 

Falls es dennoch notwendig sein sollte, udev neu zu starten, verwendet man den Befehl:

sudo reload udev 

4. Funktionstest

Ein 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.

Dabei helfen verschiedene Werkzeuge:

Das System prüft eine udev-Regel in /etc/udev/rules.d/ sofort beim Speichern der Datei und protokolliert mögliche Fehler in /var/log/syslog. Es empfiehlt sich deshalb, die Log-Datei in einem Fenster mit tail -n 10 -f /var/log/syslog offen zu halten. Selbst auskommentierte Zeilen werden hier auf Ihre Syntax geprüft, auch wenn sie nicht angewendet werden.

Hinweis:

Ein "beliebter" Fehler ist die Angabe des Operatorts *= statt +=, weil das + als einziges Zeichen in der Kette ohne Umschalttaste eingegeben werden muss.

Als Universalwerkzeug kann man auch hier udevadm verwenden. Will man wissen, welche Symlinks für ein Gerät existieren, kann man das z.B. mit dem Befehl }}} sudo udevadm info --root --query=symlink --name=/dev/<GERÄTEDATEI_ODER_SYMLINK> }}} machen.

Weitere Anwendungsmöglichkeiten findet man in der Manpage von udevadm.

Einhängen eines Dateisystems

Über den erstellten Symlink des Geräts kann ein Dateisystem wie gewohnt eingehängt[4] werden.

# Allgemein:
sudo mkdir <EINHÄNGEPUNKT>
sudo mount <SYMLINK> <EINHÄNGEPUNKT>
#
# Beispiel:
sudo mkdir /media/usb-backup
sudo mount /dev/usb-backup /media/usb-backup

Für eine vernünftige Lösung bietet sich das Einhängen per /etc/fstab [5] an.

Regelsyntax

Hier noch eine Übersicht möglicher Schlüssel. Eine komplette Ausführung findet man in der Manpage von udev.

Vergleichsschlüssel, um Bedingungen zu definieren
Schlüssel Bedeutung Beispiel
ACTION Gerät neu eingesteckt bzw. entfernt ACTION=="add", ACTION=="remove"
KERNEL Kernelname des Geräts KERNEL=="block"
KERNELS Wert für den Kernelnamen des Elternsystems KERNELS=="3:0:0:0"
SUBSYSTEM Subsystem des Geräts SUBSYSTEM=="block"
SUBSYSTEMS Subsystem des Elternsystems SUBSYSTEM=="usb"
ATTRS SYSFS-Attribut des Elternsystems ATTRS{model}=="WDC WD20EARS-07M", ATTRS{vendor}=="WD", ATTRS{serial}=="AEFHSSK768KJH"

Zuweisungsschlüssel
Schlüssel Bedeutung Verwendung Hinweis
NAME definiert den NAMEN des Geräts in /dev NAME="eth0" darf nur 1x pro Gerät vergeben werden
SYMLINK definiert einen Symlink für das Gerät in /dev SYMLINK+="usb-backup" Kann mit dem Operator += mehrfach verwendet werden
OWNER, GROUP, MODE definiert Rechte für das Gerät OWNER="users" Ein angegebener Wert überschreibt den bisher definierten
RUN startet ein Skript oder ein Programm RUN+="/usr/local/bin/backup" verlangt den absoluten Pfad des Skripts, sollte zusammen mit ACTION="add" verwendet werden

Operatoren
Operator Typ Bedeutung Hinweis
== Vergleichsoperator prüft, ob der angegebene Schlüssel dem Wert entspricht erste Zeile, vierte Spalte
!= Vergleichsoperator prüft, ob der angegebene Schlüssel dem Wert nicht entspricht Hinweis
= Zuweisungsoperator weist einem Schlüssel einen Wert zu alle Werte, die bisher für diesen Schlüssel definiert wurden, werden ignoriert
+= Zuweisungsoperator weist einem Schlüssel einen Wert hinzu mehrere Werte pro Schlüssel möglich
:= Zuweisungsoperator weist einem Schlüssel einen Wert zu lässt ab sofort keine Änderungen an diesem Schlüssel mehr zu

Nutzung in der grafischen Oberfläche

Beispiel 1

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:

  1. Eine Regel für udev erstellen

  2. In fstab vier neue Einträge festlegen

Musiksammlung - Die udev-Regel erstellen

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", ATTRS{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 eine Gerätedatei 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.

Musiksammlung - fstab anpassen

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.

Musiksammlung: Ein paar Hinweise

  • 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.

Beispiel 2

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"

Weitere Befehle rund um udev

Zeigt Kernel-Events:

udevadm monitor --kernel 
udevadm monitor --udev  

Probleme

Probleme mit einigen Digitalkameras

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.

Die Ausgabe von lsusb -vs <BUS>:<DEVICE> ist leer

Wenn mit lsusb das gewünschte Gerät angezeigt wird, die Ausgabe von lsusb -vs <BUS>:<DEVICE> aber leer bleibt, liegt das wahrscheinlich daran, dass das Gerät nicht eingehängt ist. Möglicherweise wurde das Gerät zwar bereits eingehängt, hat sich aber in den Ruhezustand verabschiedet. In diesem Fall empfiehlt es sich, das Gerät ab- und wieder anzustecken. Dadurch ändert sich aber die Device-Nummer, sodass lsusb erneut ausgeführt und die neue Nummer zur Abfrage durch lsusb -vs <BUS>:<DEVICE> verwendet werden muss.

Diese Revision wurde am 8. März 2013 14:34 von BillMaier erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Hardware, System