udev ei rakenda buutimisel reeglit USB-serial adapterile

Linuxi ja raudvaraga seotud küsimused

Moderaator: Moderaatorid

Vasta
Kasutaja avatar
DaStoned
Pingviini aktivist
Pingviini aktivist
Postitusi: 395
Liitunud: 11.01.2007, 16:23

udev ei rakenda buutimisel reeglit USB-serial adapterile

Postitus Postitas DaStoned »

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:

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
Toimiv udev reegel on selline:

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"
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:
$ 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
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)?
When the shit hits the fan, keep your mouth shut!
Kasutaja avatar
spott
Admin
Admin
Postitusi: 8870
Liitunud: 04.06.2005, 03:00

Postitus Postitas spott »

kiire googeldamisega leidsin, et sellega on ka enne häda olnud, kui udev läheb käima enne, kui teised vajalikud asjad taha on tulnud. Mingit lihtsalt lahendust vist polegi, et kuidas öelda udev-ile buutimisel, et jää nüüd ootele ja käivitu hiljem. Võibolla lihtsam kirjutada mingi skript, mis mingi 2min peale buuti lihtsalt vajalikud teenuse restardid uuesti teeb.
Tellige endale sünnipäevaks, sõbrapäevaks või muuks tähtpäevaks kingitus: Kingitused internetist - NetiKink.eu
Kasutaja avatar
DaStoned
Pingviini aktivist
Pingviini aktivist
Postitusi: 395
Liitunud: 11.01.2007, 16:23

Postitus Postitas DaStoned »

Ma ka leidsin sarnased teemad, aga see udev käivitamisega viivitamine tundub mulle täiesti ebaloogiline. udev tegelebki nende seadmetega, mis endast ette teatamata välja kargavad. Miks ta saab sellega hakkama hiljem, aga mitte boodi vältel? Arusaamatu.

Eks ma võin mingi liba-service tekitada mis peale udev käivitamist "sleep 5 && systemctl reload udev" teeb, aga kurb on selliseid asju kirjutada ;)
When the shit hits the fan, keep your mouth shut!
643
Vana Pingviin
Vana Pingviin
Postitusi: 415
Liitunud: 08.07.2019, 20:40

Postitus Postitas 643 »

systemd udev käivitus ju olemas. Miks ei mõelda oma peaga. Kõik ju peaks toimima ise.

https://share.riseup.net/#G6sgeAIdNJoPxwdbGRkRKg
Mul on ammu debian busteris mugav käivitus olemas..

samas mõni hotspot ei suuda wifit tuvastada kui kernelil ei ole vastavat draiverit. (mul endal selle lahendamiseks väline usb wifi ja wicd kaudu panen usb wifi device aadressi sisse 1x =)

Ja udev tõõtamine on kaunis keeruline:
https://www.tecmint.com/udev-for-device ... -in-linux/
Kasutaja avatar
DaStoned
Pingviini aktivist
Pingviini aktivist
Postitusi: 395
Liitunud: 11.01.2007, 16:23

Postitus Postitas DaStoned »

Hmm, mingid vastikud ajastuse probleemid tunduvad olevat. udev ei taha üldse hakkama saada ei buutimise ajal ega pärast. Ainuke mis aitab on reeglite reload ja mõlema USB siinil asuva seadme reset. Täielik overkill, aga mul pole rohkem aega kukalt kratsida.

Ajutise lahendusena toimib selline systemd teenus.

Kood: Vali kõik

$ cat /etc/systemd/system/udev-reloader.service 
[Unit]
Description=Reload udev rules
Wants=systemd-udevd.service
After=systemd-udevd.service

[Service]
Type=simple
ExecStartPre=sleep 2
ExecStart=bash -c 'udevadm control --reload-rules; sleep 1; usbreset 10c4:ea60; sleep 1; usbreset 0403:6001'

[Install]
WantedBy=multi-user.target
When the shit hits the fan, keep your mouth shut!
Vasta