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

Opret et tilpasset USB-enhedsnavn, så du kan bruge f.eks. /dev/magiskenhed, fremfor /dev/ttyACM1.Rent teknisk kalder vi det, at lave et symlink til enheden.

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.

Ved at følge denne guide, kan du sikre, at dine enheder får et valgfrit navn under /dev . I denne guide arbejder vi på, at få enheden til, altid at blive genkendt som cc2531sniffer , så den fremover kan benyttes som /dev/cc2531sniffer.

Dennne guide er lavet til Debian, men kan med al sandsynelighed benyttes på andre enheder.

dmesg

dmesg kan bruges til at se mange forskellige aktiviteter hvad angår bl.a. 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

OBS Bemærk at der måske er flere linjer med f.eks. ttyACM0 ogttyACM1. Hver gang du kobler en enhed fra, og til igen, kan du opleve, at de har fået tildelt et nyt dynamisk navn. Der er derfor, at vi gerne vil oprette et tilpasset navn (symlink) til vores enhed. Du skal derfor sikre dig, at du bruger det sidste nye ttyACM eller ttyUSB-navn, i outputtet fra dmesg. Lad dig ikke forvirre af, at den samme enhed måske tidligere, har fået navnet ttyACM0, men nu ttyACM1.

udevadm

Nu skal vi finde nogle unikke værdier som vi kan bruge til at matche op med USB-enheden en anden gang. I mit dmesg-resultet, kan jeg finde en del enheder, men den nyeste er ttyACM1 . Nedenfor er et eksempel af, hvordan denne linje ser ud: [142237.601540] cdc_acm 2-2.2:1.0: ttyACM1: USB ACM device Nu kan vi altså benytte udevadm, til at få flere oplysninger om denne enhed: udevadm info --name=/dev/ttyACM1 --attribute-walk.

Bemærk ttyACM1 skal udskiftes, alt efter hvad din enhed har fået tildelt af navn.

Nedenfor kan du se et udklip af resultatet. Bemærk at der vil være flere enheder, som "forældre-enhed" til din USB-enhed. Her bliver du nødt til at benytte din mavefornemmelse, og dernæst benytte dig af beskrivelsen af enheden. Der findes muligvis en bedre metode hvad dette angør, men det kommer jeg ikke til at afdække i denne guide.

> udevadm info --name=/dev/ttyACM1 --attribute-walk
...
looking at parent device '/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-2/2-2.2':
KERNELS=="2-2.2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{devpath}=="2.2"
ATTRS{idVendor}=="0451"
ATTRS{speed}=="12"
ATTRS{bNumInterfaces}==" 2"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="32"
ATTRS{busnum}=="2"
ATTRS{devnum}=="5"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="50mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="0"
ATTRS{bcdDevice}=="0009"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{serial}=="__0X00124B0018ED38F8"
ATTRS{version}==" 2.00"
ATTRS{urbnum}=="199202"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="Texas Instruments"
ATTRS{removable}=="unknown"
ATTRS{idProduct}=="16a8"
ATTRS{bDeviceClass}=="02"
ATTRS{product}=="TI CC2531 USB CDC"
...

Med et output som overstående, skal vi nu vælge to-tre ting, som gør denne enhed unik. Selv har jeg valgt idVendor og idProductværdierne:

  • 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 nu vores regel, som indeholder både idVendor og idProduct.

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

Jeg har valgt at kalde min enhede for cc2531sniffer , hvorfor denne er angivet som SYMLINK+="cc2531sniffer" . Du kan naturligvis kalde din enhed noget andet, men jeg vil anbefale at du undgår specialtegn.

Gem nu filen (med Ctrl+X > Yi Nano), og indlæs nu din nye regel med: sudo udevadm trigger

Tjek herefter om det har virket tilstrækkeligt med følgende kommando: ls -l /dev/ | grep 'cc2531' Med denne ls-kommando, får du listet alle enheder under /dev/, og dernæst bruger du grep kommandoen til kun at finde linjer hvor "cc2531" fremgår, hvilket var en del af mit tilpassede enhedsnavn. Du skal altså søge efter noget andet, hvis du vælger et andet navn til din enhed. Du kan alternativt blot fjerne filteret, ved blot at fjerne alt fra og med | , såfremt du ikke ønsker dette.

Som det ses nedenfor, er min enhed nu blevet oprettet med et symlink til cc2531sniffer. Fremover vil enheden altså altid kunne blive genkendt som /dev/cc2531sniffer.

> ls -l /dev/ | grep 'cc2531'
lrwxrwxrwx 1 root root 7 Feb 14 18:18 cc2531sniffer -> ttyACM2

Du kan, såfremt du tænker at det er nødvendigt, benytte udevadm igen, til at se, om dit symlink virker efter hensigten - og dernæst, kan du indhente endnu flere oplysninger fra enheden - hvor vi samtidig tager det nye symlink i brug: udevadm test -a -p $(udevadm info -q path -n /dev/cc2531sniffer)

Laver du rod i noget, så prøv at køre sudo udevadm control --reload-rules efterfulgt af sudo udevadm trigger , og hvis det intet hjælper, så genstart din maskine.

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 holde denne form for regler opdelt.

Derfor har jeg oprettet regler, til hver enkelt USB-enhed, hvor jeg har et behov for altid at kende navnet. Med mine tilpassede enhedsnavne, har jeg nu altid styr på enhederne. Mine symlinks gør nemlig, at jeg altid ved, hvad min Z-Wave enhed, samt min C2531 grapper, har fået af navn. Dette er særligt nyttigt, hvis man genstarter ens maskine. Systemet kan nemlig finde på at give min Z-Wave enhed ttyACM0, og C2531 grapperen ttyACM01, og efter en kold genstart, kan det være byttet om.

Nedenfor fremgår det, at jeg har oprettet en regel, til hver enkelt enhed.

> 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. Har du eventuelle spørgsmål, så se mere på "Velkommen" siden.

Oprindeligt blev jeg inspireret af et indlæg af RolfBly på unix.stackexchange.com.