Monter USB-devices til statiske navne, fremfor fx. ttyUSB1, ttyACM0 eller lign.


Indledning

Selvom vi nok alle sammen har forskellige argumenter, så er det altid rart at have styr på enhederne i /dev hvis de skal styre kritiske ting i ens hjem. For mit vedkommende benytter jeg begge i forbindelse med Home Automation-systemer, og her er det noget værre rod, hvis der pludselig bytte om på fx. ttyACM1 og ttyACM0, fordi jeg har tildelt den pågældende enhed til en given container. På den måde virker mine knapper pludselig ikke, der er intet lys - og meget andet driller. Overstående er testet på Debian 8 - tjek din version med cat /etc/issue.

dmesg

dmesg kan bruges til at se mange forskellige aktiviteret hvad angår devices, men særligt til USB er det fremragende.

Brug følgende kommando til at lave et udtræk af de sidste aktiviter, og skriv ttyACM eller ttyUSB alt efter behov: dmesg | grep ttyACM

udevadm

Nu skal vi finde nogle unikke værdier som vi kan bruge til at matche op med USB-enheden en anden gang. Med det fylde navn på en enhed ud fra den sidste kommando, som fx. [142237.601540] cdc_acm 2-2.2:1.0: ttyACM1: USB ACM device er vi nu klar til at afvikle koden: udevadm info --name=/dev/ttyACM1 --attribute-walk. Bemærk ttyACM1 som skal udskiftes alt efter behov

Ud fra dette output, vælger du to-tre ting, og jeg har selv valgt idVendor og idProduct:

  • ATTRS{idVendor}=="0451"
  • ATTRS{idProduct}=="16a8"

rules.d

Nu skal vi have oprette vores regel. Dette er ret ligetil. Benyt følgende kommando til at åbne filen: sudo nano /etc/udev/rules.d/99-usb-serial.rules

I filen indsætter vi:

SUBSYSTEM=="tty", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="16a8", SYMLINK+="cc2531sniffer"

Som du nok har regnet ud, har jeg valgt at kalde min enhed cc2531sniffer . Der fremgår også en anden enhed, som du kan se bort fra.

Gem filen, og indlæs reglen med: sudo udevadm trigger

Tjek herefter om det har virket tilstrækkeligt med følgende kommando: ls -l /dev/ | grep 'cc2531' - Denne laver et filter, så vi kun ser ting som indeholder cc2531, hvilket var en del af vores navn. Du skal naturligvis udskifte eller fjerne alt fra og med | hvis du ikke ønsker et filter.

Som det ses nedenfor, er alt gået som det skulle:

[email protected]:~$ ls -l /dev/ | grep 'cc2531'
lrwxrwxrwx 1 root root           7 Feb 14 18:18 cc2531sniffer -> ttyACM2

Nu kan du for sjov også kigge efter flere detaljer med: udevadm test -a -p $(udevadm info -q path -n /dev/cc2531sniffer)

Understøttelse af flere forskellige enheder

Mens det måske nok er muligt at samle det hele i en enkelt fil, så kan jeg godt lide at splitte det op. Derfor har jeg i stedet for at lave et overordnet navn, lavet individuelle navne alt efter enheden. På den måde holder jeg styr på både en Z-Wave enhed, samt min C2531 grapper.

[email protected]:~$ ls /etc/udev/rules.d/99-usb-serial* -al
-rw-r--r-- 1 root root 94 Feb 14 18:27 /etc/udev/rules.d/99-usb-serial-c2531.rules
-rw-r--r-- 1 root root 86 Feb 14 18:27 /etc/udev/rules.d/99-usb-serial-zwave.rules

Rigtig god fornøjelse, og du er som altid velkommen til at stille spørgsmål nedenfor.

Credits til RolfBly på unix.stackexchange.com.