Kérdezném a nálam tapasztaltabb Linux felhasználóktól (akik már udev szabályokat is buheráltak), hogy hogyan lehetne megmondani az udev-nek, hogy ennek a pcmcia eszköznek:
Socket 0:
product info: "Option International", "GSM/GPRS GlobeTrotter", "001", "A"
manfid: 0x0013, 0x0000
function: 2 (serial)
az első soros interfészéhez hozzon lére egy symlinket /dev/modem néven?
- 1478 megtekintés
Hozzászólások
Esetleg itt kihámozni valamit?
https://help.ubuntu.com/community/UsbDriveDoSomethingHowto
A script-ed meg létrehozná mknod-dal.
- A hozzászóláshoz be kell jelentkezni
Derítsd ki, melyik device fájlt hozza létre a kernel, és akkor valami ilyesmi kell az /etc/udev/rules.d/10-custom.rules fileba:
KERNEL=="eredeti fajlnev", SYMLINK+="modem"
Esetleg találhatsz más, jobb eszköz azonosítást, de a modul szerinti szerintem ebben az esetben jó.
Ha megvan az új rule, akkor így kell újraolvasni a szabályokat:
udevcontrol reload_rules
Aztán elvice ha csatlakoztatod az eszközt, akkor mennie kellene.
- A hozzászóláshoz be kell jelentkezni
Hát, "sajnos" a gprs modemet a serial_cs hajtja meg, úgyhogy csak egy mezei ttyS[N]-et hoz létre, amit ha megadok, akkor az más eszközre is létrehozza a symlinket.
Valami olyasmire gondoltam, ami figyeli a pcmcia eszköz manufacturer és product id-ját, és kihámozza, hogy melyik ttyS-ek tartoznak ehhez az eszközhöz, és az elsőre hozza létre a symlinket, csak ez az elvárás eléggé megnehezíti a dolgot.
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
Ha jól értem, akkor egy GPRS modemet dugsz a pcmcia portba? Akkor ezt szerintem valahol a pcmcia tájékán kellene piszkálni és nem az udev tájékán. Addig amíg nem dugod be a cuccot, addig nincs mire linkelni, lekérdezni stb.
* Én egy indián vagyok. Minden indián hazudik.
- A hozzászóláshoz be kell jelentkezni
A következő paranccsal tudod lekérdezni a modemed udev infóját, amikor be van dugva:
udevadm info -a -p $(udevadm info -q path -n /dev/a_modem_device_fájlja)
Ott vannak az ATTR sorok, azokat használhatod a rule megírására. Valami ilyesmi lesz:
KERNEL=="ttyS",ATTRS{idVendor}=="0013", SYMLINK+="modem"
Bővebben itt.
- A hozzászóláshoz be kell jelentkezni
első körben valami ilyesmire gondoltam:
KERNEL=="ttyS[0-9]*", DRIVERS=="serial_cs", ATTRS{prod_id1}=="Option International", ATTRS{prod_id2}=="GSM/GPRS GlobeTrotter", ACTION=="add", ENV{gprs_modem_already_done}!="yes", ENV{gprs_modem_already_done}="true", SYMLINK+="modem"
KERNEL=="ttyS[0-9]*", DRIVERS=="serial_cs", ATTRS{prod_id1}=="Option International", ATTRS{prod_id2}=="GSM/GPRS GlobeTrotter", ACTION=="remove", ENV{gprs_modem_already_done}="false"
szerk: sajnos a szabályok nem egészen űgy működnek, ahogy azt szeretném, űgyhogy még javítanom kell rajtuk. Valószínűleg az lehet a gond, hogy a környezeti változók nem maradnak meg/vivődnek át az udev szabályok ttyS0 és ttyS1-re való parzolása között.
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
A bajom elsősorban az, hogy igazából ugyanaz a kártya adja mindkét soros eszközt, és nagyon nem tudom megkülönböztetni a két eszközt egymástól, mert csak a minor számukban különböznek.
Először megpróbáltam beállítani egy környezeti változót az első, az eszközhöz tartozó soros port hozzáadásánál, aminek hatására a következő soros porthoz tartozó soros portnál nem jön létre a symlink. Eltávolításnál pedig törlöm ezt a változót.
De egyelőre úgy tűnik nekem, hogy az egyes eszközök hozzáadásakor az udev környezéteben nem jelennek meg a korábbi eszközök hozzáadásakor a környezethez hozzáadott változók. Persze lehet, hogy én tévedek.
Esetleg ha ez a környezeti vátozós játék nem megy, akkor megpróbálok a link_priority értékekkel játszani, hogy a második ttyS-hez létrehozandó symlink prioritása alacsonyabb legyen mint az elsőé, és így ne írja felül az először létrehozott symlinket.
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
Kezd elegem lenni ebből a trágyából.
Próbáltam debuggolási céllal pár környezeti változót fájlba iratni, de a drága-csodás udev magasról tesz a szabályaimra, hiába mondom neki mindig, hogy olvassa be újra a szabályokat.
Az előfeltételeket pedig már olyan minimálisra redukáltam, amennyire csak lehetett, úgyhogy az nem lehet a gond.
szóval a kis drága a következőket sem képes/hajlandó végrehajtani:
DRIVERS=="serial_cs", RUN+="/bin/sh /usr/bin/echo gprs_modem_already_done: %k @ %E{ACTION} - %E{gprs_modem_already_done} &>> /tmp/janos"
DRIVERS=="serial_cs", RUN+="/bin/sh /usr/bin/echo gprs_done: %k @ %E{ACTION} - %E{gprs_done} &>> /tmp/janos"
A fentieket a 95-udev-late.rules fájlba tettem, de sajnos nem segítettek semmit.
Egy másik megközelítéssel is próbálkoztam:
KERNEL=="ttyS[0-9]*", ATTRS{prod_id2}=="GSM/GPRS GlobeTrotter", ACTION=="add", PROGRAM="/bin/sh -c '/usr/bin/echo $$((0-((%n*10)-100)))'", OPTIONS="link_priority=%c{1}"
KERNEL=="ttyS[0-9]*", ATTRS{prod_id2}=="GSM/GPRS GlobeTrotter", ACTION=="add", SYMLINK+="modem"
Sajnos mindhiába. Az udevtest hiába írja ki, hogy a prioritás számolása rendesen megtörtént, az udevtest során sajnos kiderül, hogy a link_priority sajnos mégsem kerül beállításra valamilyen érthetetlen oknál fogva... :S
SZERK: Úgy tűnik valamiért nem tudom elérni a PROGRAM kimenetét. Nem egészen világos az ok, de a az alábbi bizonyítja:
KERNEL=="ttyS[0-9]*", ATTRS{prod_id2}=="GSM/GPRS GlobeTrotter", ACTION=="add", PROGRAM="/bin/sh -c '/usr/bin/echo $$((0-(($number*10)-100)))'", OPTIONS="link_priority=2$result0", SYMLINK+="modem"
root@janos_mobile:/etc/udev/rules.d# udevtest --action=add /class/tty/ttyS0
...
udev_rules_get_name: rule applied, 'ttyS0' becomes 'tts/0'
run_program: '/bin/sh -c '/usr/bin/echo $((0-((0*10)-100)))''
run_program: '/bin/sh' (stdout) '100'
run_program: '/bin/sh' returned with status 0
udev_rules_get_name: link_priority=2
udev_rules_get_name: add symlink 'modem'
...
udev_node_update_symlinks: update symlink 'modem' of '/class/tty/ttyS0'
udev_db_get_devices_by_name: found index directory '/dev/.udev/names/modem'
update_link: found 2 devices with name 'modem'
update_link: found '/class/tty/ttyS1' for 'modem'
update_link: compare priority of '/class/tty/ttyS1' 2 > 0
update_link: found '/class/tty/ttyS0' for 'modem'
update_link: compare (our own) priority of '/class/tty/ttyS0' 2 >= 2
update_link: 'modem' with target 'tts/0' has the highest priority 2, create it
Persze a ttyS1 esetén is arra jut, hogy az ő priorítása nagyobb, így a végén a link a ttyS1-re mutat... :S
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
Nekem is volt olyan, hogy a saját szabályaimat felülbírálta valami a későbbi szabályok közül. Erre a megoldás nálam az volt, hogy a szabályopm végére ment ez:
, OPTIONS+="last_rule"
Ezzel elértem, hogy az adott meghatározás szerinti eszközre nem alkalmazta a későbbi, esetleg tágabb szabályozás szerint illeszkedő szabályokat. De ez csak egy tipp....
- A hozzászóláshoz be kell jelentkezni
Itt főleg az volt a bajom, hogy ebből
OPTIONS="link_priority=2$result0"
csak annyi marad a szabály végrehajtása után, hogy link_priority=2, tehát valamiért a %c-t helyettesíti be OPTIONS-nál.
A másik szívfájdalmam pedig az, hogy az udev környezeti változói nem maradnak meg globálisan, csak egy-egy adott eszközre történő szabályvégrehajtáskor érhetőek el, utána pedig törlődnek. :(
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
No, végül sikerült megoldani! Szépnek nem szép, ellenben jobban működik, mint korábbiakban leírt elgondolások. Nem is szaporítom a szót:
KERNEL=="ttyS[0-9]*", DRIVERS=="serial_cs", ATTRS{prod_id1}=="Option International", ATTRS{prod_id2}=="GSM/GPRS GlobeTrotter", ACTION=="add", PROGRAM="/bin/sh -c '/usr/bin/echo $$((0-((%n*10)-100)))'", ENV{MODEM_PRI}="%c{1}"
KERNEL=="ttyS[0-9]*", ENV{MODEM_PRI}=="0", OPTIONS="link_priority=0", SYMLINK+="modem"
KERNEL=="ttyS[0-9]*", ENV{MODEM_PRI}=="10", OPTIONS="link_priority=10", SYMLINK+="modem"
KERNEL=="ttyS[0-9]*", ENV{MODEM_PRI}=="20", OPTIONS="link_priority=20", SYMLINK+="modem"
KERNEL=="ttyS[0-9]*", ENV{MODEM_PRI}=="30", OPTIONS="link_priority=30", SYMLINK+="modem"
KERNEL=="ttyS[0-9]*", ENV{MODEM_PRI}=="40", OPTIONS="link_priority=40", SYMLINK+="modem"
KERNEL=="ttyS[0-9]*", ENV{MODEM_PRI}=="50", OPTIONS="link_priority=50", SYMLINK+="modem"
KERNEL=="ttyS[0-9]*", ENV{MODEM_PRI}=="60", OPTIONS="link_priority=60", SYMLINK+="modem"
KERNEL=="ttyS[0-9]*", ENV{MODEM_PRI}=="70", OPTIONS="link_priority=70", SYMLINK+="modem"
KERNEL=="ttyS[0-9]*", ENV{MODEM_PRI}=="80", OPTIONS="link_priority=80", SYMLINK+="modem"
KERNEL=="ttyS[0-9]*", ENV{MODEM_PRI}=="90", OPTIONS="link_priority=90", SYMLINK+="modem"
KERNEL=="ttyS[0-9]*", ENV{MODEM_PRI}=="100", OPTIONS="link_priority=100", SYMLINK+="modem"
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
Azt figyeltem meg, hogy amint eltávolítom a rendszerből a kártyát, a csatlakoztatáskor létrejövő soros portok megmaradnak az eltávolítás után is, szellemként.
Ezt a jelenséget hogyan lehetne megszüntetni?
Erre külön szabályt írni, hogy eltávolítsa az eszközfájlt, eléggé nem elegáns.
Miért lehet, hogy az eszköz nem tűnik el magától, miközben ez lenne az elvárt működés? Mi lehet a gond?
A rendszernaplókban nem panaszkodik az udev, úgyhogy szerinte nem történt hiba.
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
A jelenség még mindig fennáll, a symlinkek és az eszközfájlok is megmaradnak.
Hogyan tudnám az udev-vel mégis eltakaríttatni őket?
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
Most fedeztem fel, hogy a pccardctl-nek van eject parancsa is, ami általában segít a kártyák eltávolításában.
Az a baj, hogy a kártya tényleg eltávolításra kerül, azonban a device fájlok így is megmaradnak a symlinkekkel együtt, és ezen a pccardctl eject sem segít.
__________________________________________________________
Az életben csak egy dolog a szép, de az épp nem jut eszembe.
Slackware Linux 12.1 | 2.6.26.7-janos
- A hozzászóláshoz be kell jelentkezni
Sziasztok.
Nekem is tanácsra lenne szükségem. Hogyan mondhatom meg az udev-nek (vagy hal, vagy mi csinálja), hogy a hp simplesave usb-s külső hdd csatolásakor ne csatolja a cd-rom meghajtót is (van vmi beépített virtuális cd meghajtója, amin win alatt rajtavannak a software-k stb).
Dmesg-ben ennyi van róla:
scsi 3:0:0:1: CD-ROM HP Virtual CD 4507 1024 PQ: 0 ANSI: 4
mount:
/dev/sr1 on /media/HPLAUNCHER type iso9660 (ro,nosuid,nodev,uhelper=hal,uid=1000,utf8)
lsusb:
Bus 001 Device 002: ID 03f0:4507 Hewlett-Packard
még milyen adatokat adjak meg?
köszönöm
<= Powered By Ubuntu & Gentoo Linux =>
'Software is like sex: It's better when it's free!'
By Linus Torvalds
- A hozzászóláshoz be kell jelentkezni