Ubuntu - udev Regeln
Heute versuche ich mal zu verstehen wie diese udev Regeln funktionieren.
Die Regeln liegen in unterschiedlichen Dateien im Verzeichnis /lib/udev/rules.d/. Die Dateinamen haben einen beliebigen Namen mit .rules ans Dateiendung. Die Dateien werden wohl in alphabetischer Reihenfolge geladen, weswegen die Datei mit einer Nummer gepräfixed sind. Eine Datei kann z.B. 50-udev-default.rules heißen.
Eine udev-Rule sieht z.B. so aus:
KERNEL=="sd?1", SUBSYSTEMS=="usb", ATTRS{idVendor}=="0204", ATTRS{idProduct}=="0275", SYMLINK+="usbstick", ACTION=="add", RUN+="/usr/local/bin/usbstick-backup"
Die einzelnen Keywords haben folgende Bedeutung:
Keyword | Bedeutung |
---|---|
KERNEL | Devicename unter /dev/. Wirdcards können verwendet werden. |
SUBSYSTEMS | Prüft auf ein bestimmtes Subsystem, z.B. usb |
ATTRS | Hier können zusätzliche Attribute abgefragt werden, wie z.B. Vendor ID, Produkt ID, ... |
SYMLINK | Erzeugt einen Symlink mit einem bestimmten Namen |
ACTION | Legt fest bei welcher Aktion die Rule greifen soll (add, remove) |
RUN | Wird das Gerät erkannt, kann hiermit automatisch ein Befehl oder ein Script ausgeführt werden |
OWNER | Legt den Besitzer des Devices fest |
GROUP | Legt die Gruppe des Devices fest |
MODE | Legt die Dateirechte für das Devices fest |
ENV | Matched einen Wert einer Geräte-Eigenschaft, z.B. ENV{DEVTYPE}=="disk" |
NAME | Legt den Namen für das Device fest, z.B. eth0, ttyUSB0, ... |
TEST | Prüft ob eine bestimmte Datei oder Verzeichnis existiert |
OPTIONS | Definiert Optionen für die rule, z.B. verhindert OPTIONS+="ignore_remove" dass die Device-Datei gelöscht wird wenn das Device entfernt wird |
Geräteinformationen herausfinden
Um herauszubekommen welche Werte man wo eintragen muss benötigt man Befehle mit denen man diese Informationen abfragen kann.
USB Geräte
Für USB-Geräte ist der Befehl lsusb sehr nützlich. Dieser zeigt ausführliche Informationen über alle über USB angeschlossene Geräte. Um Informationen über das USB-Gerät zu bekommen führt man diesen Befehl aus:
sudo lsusb
Das ergibt dann etwa so eine Ausgabe:
Bus 001 Device 004: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Um jetzt weitere Informationen zu einem bestimmten Gerät, in diesem Beispiel der USB-Serial Adapter, zu bekommen führt man den Befehl ein weiteres mal mit zusätzlichen Parametern aus:
sudo lsusb -vs 001:004
Hier sind insbesondere die Werte von idVendor, idProduct und iSerial von Interesse da sich diese besonders gut für die Erstellung einer udev Rule eignen. Eine udev Rule mit diesen drei Parametern sieht z.B. so aus:
KERNEL=="sd?1", ATTRS{idVendor}=="13fe", ATTRS{idProduct}=="1f00", ATTRS{serial}=="50E6920B000AE8", SYMLINK+="some-fancy-device"
Es gibt jedoch auch USB Devices, wie z.B. die günstigen Arduinos aus China, die keine eindeutige Seriennummer haben. Für diese Geräte ist ein sehr nützliches Tool udevadm.
udevadm info -a -n /dev/ttyUSB0
Das Tool listet alle Attribute auf die zum Auffinden des angegebenen Devices verwendet werden können.
Sind die beiden Geräte ohne einduetige Seriennummer eingesteckt und man vergleicht die Ausgabe fällt auf das der Wert von KERNELS abweicht und zwar je nach Postition in den USB Ports. Man muss jetzt eigentlich nur noch darauf achten die Devices immer wieder in die richtigen Ports zu stecken, dann kann man daraus eine Rule erstellen.
KERNEL=="ttyUSB?", KERNELS=="1-1.4:1.0", SYMLINK+="mysensors", GROUP=="diaout" MODE=="0666"
KERNEL=="ttyUSB?", KERNELS=="1-1.5:1.0", SYMLINK+="nanocul", GROUP=="diaout" MODE=="0666"
Noch etwas, was ich bei meiner Recherche gefunden habe und hier notieren möchte ist eine Art udev - Monitoring, mit dem man Events beobachten kann.
udevadm monitor --property