Symlink zur eindeutigen Erkennung mittels udev-Regel

Aus Siduction Wiki DE
Wechseln zu: Navigation, Suche

Das Problem bei mehreren gleichen USB-Geräten ist, daß die Devices dazu der Reihenfolge des Anstöpselns nach in /dev angelegt und schlicht durchnummeriert werden. Oft kommt dies bei USB-Seriell-Wandlern vor, die wie hier im Beispiel einen FTDI-Chip verwenden. Per udev-Regel kann man die eindeutige Seriennummer dazu verwenden, einen eindeutigen selbst gewählten device-Eintrag erstellen zu lassen.

Die alten Möglichkeiten bestehen bei neuem udev nicht mehr, als da waren SYSFS==-Abfragen. Die neue Methode arbeitet mit ATTRS{xx}==yy Einträgen.

Zuerst gilt es, die eindeutigen Zuordnungen, wie die Seriennummer des Gerätes herauszufinden. Einmal kann man direkt nach dem Einstöpseln des Gerätes sich mit dmesg die letzten Systeminformationen ausgeben lassen und erhält etwas wie:

# dmesg
usb 5-1: new full speed USB device using uhci_hcd and address 2
usb 5-1: New USB device found, idVendor=0403, idProduct=6001
usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 5-1: Product: FT232R USB UART
usb 5-1: Manufacturer: FTDI
usb 5-1: SerialNumber: ABC12345
usbcore: registered new interface driver usbserial
USB Serial support registered for generic
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial Driver core
USB Serial support registered for FTDI USB Serial Device
ftdi_sio 5-1:1.0: FTDI USB Serial Device converter detected
usb 5-1: Detected FT232RL
usb 5-1: Number of endpoints 2
usb 5-1: Endpoint 1 MaxPacketSize 64
usb 5-1: Endpoint 2 MaxPacketSize 64
usb 5-1: Setting MaxPacketSize 64
usb 5-1: FTDI USB Serial Device converter now attached to ttyUSB0
usbcore: registered new interface driver ftdi_sio
ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver

und sieht, daß das Gerät als /dev/ttyUSB0 ansprechbar ist. Sollten bereits andere Wandler angeschlossen sein, könnte dieser auch auf z.B. /dev/ttyUSB4 landen.

Zum anderen hilft, wenn man den originären device-Namen kennt

# udevadm info --name=/dev/ttyUSB0 --attribute-walk

Dieses liefert z.B.

looking at device '/devices/pci0000:00/0000:00:1d.3/usb5/5-1/5-1:1.0/ttyUSB0/tty/ttyUSB0':          
   KERNEL=="ttyUSB0"
   SUBSYSTEM=="tty" 
   DRIVER=="" 
[...]
looking at parent device '/devices/pci0000:00/0000:00:1d.3/usb5/5-1':
   KERNELS=="5-1"
   SUBSYSTEMS=="usb"
   DRIVERS=="usb"
   ATTRS{idVendor}=="0403"
   ATTRS{idProduct}=="6001"
   ATTRS{manufacturer}=="FTDI"
   ATTRS{product}=="FT232R USB UART"
   ATTRS{serial}=="ABC12345"

Mittels udev-Regel läßt man udev einen Symlink anlegen, damit bei jedem Einstöpseln das Gerät eindeutig gefunden wird, hier wähle ich dev/ttyUSB_MeinGeraet.

Als root erstelle man eine Datei in /etc/udev/rules.d/ die eine zweistellige Zahl, einen Unterstrich/Minus und einen sinngebenden Namen gefolgt von ".rules" haben soll, ich nenne meine 20_MeinUSBGeraet.rules. Darin trägt man die oben gefundenen Informationen zur Erkennung ein. Das "tty" ist in diesem Fall fest für USB-Seriell-Wandler eingestellt. Das "+=" funktioniert wie in C und legt den neuen Symlink an.

# Datei: /etc/udev/rules.d/20_MeinUSBGeraet.rules
# Gerät MeinGeraet mit FTDI-Seriellwandler an USB
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="ABC12345", SYMLINK+="ttyUSB_MeinGeraet" 

Danach ein Neustart des udev-Dämons

# /etc/init.d/udev restart

Test nach Ab- und Wiederanstöpseln des Gerätes:

$ ls -l /dev/ttyU*
crw-rw---- 1 root dialout 188, 0  1. Jun 07:50 /dev/ttyUSB0                                   
lrwxrwxrwx 1 root root         7  1. Jun 07:50 /dev/ttyUSB_MeinGeraet -> ttyUSB0

und dann sollte sich das Device auch über den neuen Symlink eindeutig ansprechen lassen.

Übrigens: Der user, der nachher das Gerät benutzen will, sollte in der Gruppe dialout sein. Aber auch dieses könnte man mittels udev-Regel anpassen....