[[Vorlage(Überarbeitung, 25.03.2013, udev, BillMaier)]] [[Vorlage(Getestet, precise,lucid)]] [[Vorlage(Fortgeschritten)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] [:Rechte:] [:Mount: Dateisysteme einhängen] [:fstab: Dateisysteme über /etc/fstab fest einhängen], optional }}} [[Inhaltsverzeichnis(3)]] [[Bild(./udev_logo.png, 64, align=left)]] [wikipedia:udev:] ist ein Programm, das die Gerätedateien im Verzeichnis '''/dev''' dynamisch verwaltet. Dies geschieht sowohl beim Bootvorgang als auch durch nachträgliches An- oder Abstecken eines Gerätes im laufenden Betrieb ([wikipedia:Hot_Swapping:Hotplug]). Bekommt udev vom Kernel Informationen über ein Gerät (sog. ''device uevents''), wertet es diese anhand fester, aber frei konfigurierbarer Regeln aus. {{{#!vorlage Hinweis Seit Ubuntu 10.04 [:Lucid Lynx:] werden über udev auch Eingabegeräte konfiguriert, da [:HAL:] entfällt. Weitere Hinweise hierzu findet man im [https://wiki.ubuntu.com/X/Config/Input?rev=16#Input_Configuration_with_udev_.28Ubuntu_10.04.29 englischen Wiki] {en}. }}} = Udev-Regeln = Udev-Regeln bestimmen, was passiert, wenn ein Gerät erkannt wird. Eine udev-Regel enthält dazu mindestens eine Bedingungen und Zuweisungen (#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/'''. Nur noch 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). Erst durch die Verwendung eigener Regeln ist es möglich, Geräte (hier: USB-Massenspeicher) mit eindeutig zugeordneten Verzeichnis- oder Gerätenamen einzuhängen. 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. (s. [#Erstellen-eigener-Regeln]) {{{#!vorlage 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. === 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. {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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. Dazu muss der Datenträger allerdings eingehängt sein, was sich bei Bedarf mit `mount`[4] prüfen lässt. {{{#!vorlage Befehl 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 [:Logdateien:Logdatei] '''/var/log/syslog'''. Dort werden am Ende die Linuxkernel-Informationen anzeigt. Mit dem Befehl {{{#!vorlage 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''': {{{#!vorlage Befehl 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 {{{#!vorlage Befehl 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}``. {{{#!vorlage 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. }}} === 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 vor den Systemstandards ausgeführt werden, sollte man die Datei mit einer niedrigen Zahl beginnen lassen. ''' (Muss noch verifiziert werden. Andere Quellen beginnen für eigene Regeln > 70)''' Wichtig ist auch, 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 entsprechenden Werten aus einem Elternsystem. Das sieht dann z.B. so aus: {{{ 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. {{{#!vorlage 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 [:Logdateien: 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_für_Shellskripte#Faustregeln:Shebang]. Dabei muss es sich selbst um das korrekte Einbinden kümmern: {{{#!code bash #!/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 {{{#!vorlage Befehl sudo udevadm trigger }}} Falls es dennoch notwendig sein sollte, udev neu zu starten, verwendet man den Befehl: {{{#!vorlage 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. {{{#!vorlage Hinweis Ein "beliebter" Fehler ist die Angabe des Operatorts `*=` statt `+=`, weil das `+` als einziges Zeichen in der Kette ohne Umschalttaste eingegeben werden muss. }}} '''Hier weitere unterschiedlichen Varianten zur Prüfung der Regeln vorstellen.''' == Einhängen eines Dateisystems == Über den erstellten Symlink des Geräts kann ein Dateisystem wie gewohnt eingehängt[4] werden. {{{ # Allgemein: sudo mkdir sudo mount # # 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 [:fstab:/etc/fstab] [5] an. == Regelsyntax == Neben den vorgestellten Schlüsseln gibt noch einige weitere. Eine komplette Ausführung findet man in der [:Manpage:] von udev. Hier eine Auswahl. vergrößern {{{#!vorlage Tabelle <-3 rowclass="titel"> Vergleichsschlüssel +++ 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" }}} {{{#!vorlage Tabelle <-4 rowclass="titel"> 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 1. 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. {{{#!vorlage Befehl /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 [:mount#umount: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" }}} = Probleme = === Probleme mit einigen Digitalkameras === Es kann sein, dass eine Kamera nicht als Massenspeichermedium erkannt wird, sondern nur über das Protokoll [http://www.gphoto.org/ Gphoto2] {en} 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 -v` ist leer === Wenn mit `lsusb` das gewünschte Gerät angezeigt wird, die Ausgabe von `lsusb -vs :` 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 :` verwendet werden muss. = Links = * [http://www.freedesktop.org/software/systemd/libudev udev Homepage] {en} * [http://www.reactivated.net/writing_udev_rules.html Writing udev rules] (gut erklärt und mit Beispielen) {en} * [http://ubuntuforums.org/showthread.php?t=168221 ubuntuforums.org] Udev-HowTo {en} * [http://www.linux-user.de/ausgabe/2007/12/096-udev/index.html LinuxUser Magazin] Udev-HowTo (teilweise veraltet) {de} * [http://udev-notify.learnfree.eu/ udev-notify] grafische Rückmeldungen beim Anschluss externer Geräte {en} * [http://www.gentoo.de/doc/de/udev-guide.xml Gentoo.de 2010 - Leitfaden und interessante Informationen zur UDEV-Entwicklung {de} * [http://www.heise.de/open/meldung/Udev-wird-Bestandteil-von-Init-System-Systemd-1500474.html] 12/2012 noch ein Link zur Entwicklung {de} * [http://wiki.ubuntuusers.de/Logitech_Harmony_Fernbedienung] # tag: Hardware, System