Portál AbcLinuxu, 9. května 2025 23:45
Zdravím, jak jednoduše upravit udev pravidla spouštějící akci na socketu na systému stojícím na systemd verze cca 180 a novější?
Na Archlinuxu chci rozchodit rozchodit zákaznickou aplikaci komunikující s USB zařízením, která vyžaduje přidání několika udev pravidel typu:ATTRS{idVendor}=="abcd", ATTRS{idProduct}=="1234", SYMLINK+="xyz_%k", MODE="0666", OPTIONS+="last_rule", RUN+="socket:@/my/abstract/socket"
Bohužel po slepém přidání pravidel a připojení zařízení jej aplikace nevidí a v logu je:Feb 7 08:48:38 komp kernel: [57215.176660] usb 1-1.3: unable to get BOS descriptor
Feb 7 08:48:38 komp systemd-udevd[29344]: failed to execute '/usr/lib/udev/socket:@/my/abstract/socket' 'socket:@/my/abstract/socket': No such file or directory
Dočetl jsem se o zrušení podpory toho typu pravidel a doporučení úpravy aplikace, aby provedla nějakou registraci pomocí libudev... To v mém případě není možné, já nemám zdrojáky a zákazník ji určitě upravovat nebude (mimo jiné i proto, že nepoužívám jím doporučovanou distribuci)
Zkusil jsem pravidlo upravit na:ATTRS{idVendor}=="abcd", ATTRS{idProduct}=="1234", SYMLINK+="xyz_%k", MODE="0666", OPTIONS+="last_rule", RUN+="/usr/bin/socat - ABSTRACT-SENDTO:/my/abstract/socket"
ale nepomohlo to. Zkusil jsem taky cvičně nahradit RUN za:RUN+="/usr/bin/socat - GOPEN:/tmp/added_1234_abcd.log"
log soubor se opravdu vytvořil, ale je prázdný, takže můj předpoklad, že jádro předá data přes stdin, je asi špatný...
Máte někdo nápad na řešení problému jinak než změnou distra?
RUN+="/usr/bin/socket:@/my/abstract/socket"
). Jinak to hledá v /usr/lib/udev jak ti ostatně píše log.
Tak jednoduché to bohužel není, "příkaz" socket je interně handlovaný udevem, tzn. není viditelný v souborovém stromu. Cesta z logu je výchozí pro příkazy bez absolutní cesty, které ale nejsou interní... celkem zamotané, že? To asi byl i jeden z důvodů jeho odstranění.
Nějaké další nápady?
Od verze 178 se vypisuje varování, že to přestane být podporované a od verze 183 to už nepodporuje. Doporučované řešení je úprava aplikací tak, aby místo procedury udev_monitor_new_from_socket
používaly udev_monitor_new_from_netlink
. Ale jak už jsem psal, zdrojáky aplikace nemám a zákazník ji jen kvůli mě neupraví
Víš něco bližšího "nějakém souboru pro systemd"? Jeho možnosti jsem nedávno celkem důkladně procházel (kvůli multiseat konfiguraci), ale na nic vhodného jsem nenarazil...
BTW, procedura udev_monitor_new_from_netlink
už je v udev dlouho (i ve verzi 151 v mně doporučovaném Ubuntu 10.04), takže nechápu, proč se používá ta druhá...
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.