Portaal Portaal Pingviini veeb foorumi pealeht
  Viki  |  IRC  |  Otsing  |  Küsimused ja vastused  |  Profiil  |  Privaatsõnumite vaatamiseks logi sisse  | Logi sisse või Registreeru
<empty>
Vaata järgmist teemat
Vaata eelmist teemat

Postita uus teemaVasta teemale
Autor Sõnum
DaStoned
Pingviini aktivist
Pingviini aktivist


Vanus: 43
Liitunud: 11.01.2007
Postitused: 392
Asukoht: Tallinn
Distributsioon: Debian
estonia.gif
postituspostitatud: 20.04.2021, 10:42  postituse pealkiri:  udev ei rakenda buutimisel reeglit USB-serial adapterile  

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
Admin


Vanus: 43
Liitunud: 04.06.2005
Postitused: 8857

Distributsioon: Ubuntu
estonia.gif
postituspostitatud: 20.04.2021, 15:36  postituse pealkiri:  (teema puudub)  

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
Pingviini aktivist


Vanus: 43
Liitunud: 11.01.2007
Postitused: 392
Asukoht: Tallinn
Distributsioon: Debian
estonia.gif
postituspostitatud: 20.04.2021, 15:49  postituse pealkiri:  (teema puudub)  

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 Wink

_________________
When the shit hits the fan, keep your mouth shut!

643
Pingviini aktivist
Pingviini aktivist



Liitunud: 08.07.2019
Postitused: 386

Distributsioon: GNU/Linux (64bit/32bit)
blank.gif
postituspostitatud: 21.04.2021, 11:55  postituse pealkiri:  (teema puudub)  

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-detection-management-in-linux/

_________________
getbitcoin.org

DaStoned
Pingviini aktivist
Pingviini aktivist


Vanus: 43
Liitunud: 11.01.2007
Postitused: 392
Asukoht: Tallinn
Distributsioon: Debian
estonia.gif
postituspostitatud: 23.04.2021, 16:39  postituse pealkiri:  (teema puudub)  

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!

Näita (aja järgi):      
Postita uus teemaVasta teemale


Vaata järgmist teemat
Vaata eelmist teemat
Powered by phpBB2 Plus based on phpBB © 2001/7 phpBB Group