udev, tty, symink: sorsza'moza's

Fórumok

Sziasztok!

Meg lehet-e csinalni udev szaba'lyokkal, hogy adott /dev/node-ra mutato symlink sorsza'mozott legyen, amennyiben a node megjelene'sekor egy adott felte'telnek eleget tesz?

Pelda: egy FTDI alapu /dev/ttyUSB* vezerlo" legyen mondjuk /dev/ttyFTDI0, /dev/ttyFTDI1, ... symlink ne'ven _is_ ele'rheto"? Ha egy szem FTDI kontrolleres usb-soros konverter van fent maximum garantaltan, akkor a

SUBSYSTEM=="tty", ATTRS{product}=="*FTDI*", SYMLINK+="ttyFTDI"

egy teljesen jol mukodo alternativa, azonban ha egy masik eszko"z is csatlakozik, akkor mar az /dev/ttyFTDI_ ne'ven lesz elerheto". Stb-stb... az rtfm alapja'n nem egyertelmu" a dolog - a %n az meg latszolag nem rossz, csak ugye a sorsza'm az nem inkrementalis lesz. Azaz ekkor ha van mondjuk USB0, USB1, USB2 (ami nem FTDI), akkor a 4ikke'nt csatlakoztatott FTDI endpoint ma'r /dev/ttyFTDI3 ne'ven jonne fel (FTDI0) helyett, ha a fenti szabalyban SYMLINK+="ttyFTDI%n"-t irunk.

Ko"szi, A

Hozzászólások

Hat, vegul egy ilyet herkentettem o"ssze kolle'ga javaslata'ra:


SUBSYSTEM=="tty", ACTION=="add", ATTRS{product}=="*STK500*", RUN+="/bin/bash -c 'for (( i=0; i<16; i++)); do if ! test -L /dev/ttyAVR${i}; then ln -s %k /dev/ttyAVR${i}; break; fi; done'"
SUBSYSTEM=="tty", ACTION=="remove", ATTRS{product}=="*STK500*", RUN+="/bin/bash -c 'for (( i=0; i<16; i++)); do test -c /dev/ttyAVR${i} || rm -f /dev/ttyAVR${i}; done'"

Mukodik, latszolag. Azert ha barmi kulturaltabb megoldas van, szoljatok ;)

A

Én inkább a /dev/serial alatt lévő symlinkeket használnám...
Vagy ha azok nem jók valamiért, akkor is úgy csinálnám, hogy lehetőleg nem automata számozást várnék el (ez sose fog megbízhatóan működni), hanem valami más azonosítót is beleraknék a névbe. Erre a legjobb valami (usb) serial lenne, ha az nincs, akkor valami usb path vagy ilyesmi, de a lényeg hogy egyedi azonosító, legalább egy booton belül.

Ez nem rossz ötlet, akár lehet egy vendorId+productId páros is, bár az teljesen azonos hardverek esetén lehet, hogy ugyanaz, és akkor összeakadás esete forog fenn. A hosszú usb path helyett esetleg lehetne sha1($usbPath), és akkor az egyedi, bár nehezen azonosítható be, hogy hova mutat.