Home.

Technik-Blog

Willkommen auf meinem
Notiz - Blog
Blog

Kmoser's Tech-Blog

Sonntag
11
Februar 2018

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:

udev
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:

Bash
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:

Bash
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:

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

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

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

Bash
udevadm monitor --property