udev ei rakenda buutimisel reeglit USB-serial adapterile
Postitatud: 20.04.2021, 11:42
Testarvuti (tavaline PC, Debian bullseye/testing) külge on riputatud paar vidinat mis kasutavad USB-serial adaptereid. Need ilmuvad välja seadmefailidena /dev/ttyUSB0, /dev/ttyUSB1, jne selles järjekorras kuidas kernel nad USB siini otsast leiab (ehk sisuliselt juhuslikult). Et leida selle laga seast üles konkreetne seade, kirjutasin udev reeglid mis tekitavad sümlingi tema seerianumbriga, mis viitab juba õigele /dev/ttyUSBx seadmefailile. Tekib umbes selline komplekt sümlinke, seerianumbrite alusel:
Toimiv udev reegel on selline:
Kõik on väga ilus, udev toimib perfektselt kui seadmeid USB pesasse torkan või udev-ile restarti teen.
Probleem: bootimisel symlinke ei teki. Ma pean peale igat buuti masinasse sisse logima ja käsitsi udev reegleid taaskäivitama või USB kola pesast välja tõmbama ja tagasi ühendama.
Kerneli logidele peale vaadates on näha, kuidas udev tõmmatakse käima enne kui kernel on jõudnud USB-serial draiveriteni:
Kood: Vali kõik
$ ls -lha /dev/ | egrep USB
lrwxrwxrwx 1 root root 7 apr 20 10:59 EDK-3a1bc4f14d -> ttyUSB0
lrwxrwxrwx 1 root root 7 apr 20 11:14 FT000 -> ttyUSB1
Kood: Vali kõik
$ cat /etc/udev/rules.d/70-ft232r.rules
SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{manufacturer}=="FTDI", ATTRS{product}=="FT232R USB UART", SYMLINK+="$attr{serial}", GROUP="dialout", MODE="0660"Probleem: bootimisel symlinke ei teki. Ma pean peale igat buuti masinasse sisse logima ja käsitsi udev reegleid taaskäivitama või USB kola pesast välja tõmbama ja tagasi ühendama.
Kerneli logidele peale vaadates on näha, kuidas udev tõmmatakse käima enne kui kernel on jõudnud USB-serial draiveriteni:
Mulle tundub see lugu tobe - udev reegel toimib siis, kui seade ilmub 2 minutit peale booti (st mina ta lahti-külge ühendan), aga mitte siis kui ta ilmub 100 ms peale udev käivitumist. Kas ma pean kuidagi udev-ile ütlema, et oodaku kuni USB-serial draiverid on käima tõmmatud? Või pole ta tegelikult selleks hetkeks minu custom reegleid sisse laadida jõudnud ja seal on race condition (kes jõuab enne valmis, udev või USB-serial draiver)?$ dmesg | egrep -i 'udev|ftdi|cp21'
[ 3.524752] systemd[1]: Listening on udev Control Socket.
[ 3.524810] systemd[1]: Listening on udev Kernel Socket.
[ 3.536359] systemd[1]: Starting Coldplug All udev Devices...
[ 3.601700] systemd[1]: Finished Coldplug All udev Devices.
...
[ 3.761368] usbcore: registered new interface driver cp210x
[ 3.761378] usbserial: USB Serial support registered for cp210x
[ 3.761404] cp210x 2-2.2:1.0: cp210x converter detected
[ 3.764586] usb 2-2.2: cp210x converter now attached to ttyUSB0
[ 3.791476] usbcore: registered new interface driver ftdi_sio
[ 3.791484] usbserial: USB Serial support registered for FTDI USB Serial Device
[ 3.791532] ftdi_sio 2-2.1.4:1.0: FTDI USB Serial Device converter detected
[ 3.792007] usb 2-2.1.4: FTDI USB Serial Device converter now attached to ttyUSB1