|
Autor |
Sõnum |
DaStoned
Pingviini aktivist
Vanus: 43
Liitunud: 11.01.2007
Postitused: 392
Asukoht: Tallinn
Distributsioon: Debian
|
|
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: | $ 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: | $ 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:
Tsitaat: | $ 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!
|
|
|
|
spott
Admin
Vanus: 43
Liitunud: 04.06.2005
Postitused: 8857
Distributsioon: Ubuntu
|
|
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
|
|
|
|
DaStoned
Pingviini aktivist
Vanus: 43
Liitunud: 11.01.2007
Postitused: 392
Asukoht: Tallinn
Distributsioon: Debian
|
|
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
Pingviini aktivist
Liitunud: 08.07.2019
Postitused: 386
Distributsioon: GNU/Linux (64bit/32bit)
|
|
|
|
DaStoned
Pingviini aktivist
Vanus: 43
Liitunud: 11.01.2007
Postitused: 392
Asukoht: Tallinn
Distributsioon: Debian
|
|
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: | $ 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!
|
|
|
|
|
|
Powered by phpBB2 Plus based on phpBB © 2001/7 phpBB Group
|
|