Udev szabályok írása

A Gentoo Linux Wiki wikiből

Ez a cikk még egy nyers fordítás. Ha van kedved/időd/tehetséged, akkor nézd át, javítgass benne, de ha lehet, tartsuk magunkat az eredeti forrás szövegéhez (vagy ehhez közelítsd az én ferdítésemet).


Hmmm, közben megváltozott az udev szabályok formátuma. Valószínűleg nem mindenben érvényesek az itt leírtak... XSAk 19:02, 4 Aug 2005 (GMT)


!! FIXME !!

Tartalomjegyzék

[szerkesztés] Udev szabályok írása

szerző: Daniel Drake (dsd)

Version 0.6

A dokumentum legfrissebb változata mindig megtalálható itt: http://www.reactivated.net/udevrules.php


[szerkesztés] A dokumentumról

Az udev célja, hogy felhasználói térben nyújtson megoldást a dinamikus /dev könyvtárszerkezet kezelésére, állandó eszköz elnevezésekkel. Az előző /dev megvalósítás, a devfs mára már nem javasolt, s az udev-et, mint utódját tekinthetjük. Az udev vagy devfs kényes téma a beszélgetésekben - olvasd el ezt a dokumentumot az összehasonlítások megtétele előtt.

Az udev egy jól kigondolt megoldás, de először nagyon össze voltam zavarodva, hogy miként is tudnám a rendszeremhez igazítani. Ez a dokumentum megpróbálja a szabályírás folyamatát kicsit tisztábbá tenni.

Nyitott vagyok minden visszajelzésre - kérlek vedd fel velem a kapcsolatot, ha bármilyen megjegyzésed, problémád, javaslatod van.

A dokumentum feltételezi, hogy az udev és a hotplug telepítve van és rendben fut az alapértelmezett beállításaival. Ha még nincs az udev telepítve vagy nem fut, akkor azt javasolnám, hogy kövesd Decibel udev Primer utasításait, hogy eljuthass erre a pontra (Tartalmaz néhány Gentoo Linux specifikus dolgot, de hasznos lehet más disztribúciónál is).

[szerkesztés] Előzmények

  • v0.6, 2005. május 9. - Különböző frissítések, ideértve az udevinfo-ról, csoportokról és jogosultságokról, naplózásról szóló információkat és az udevtest-et is.
  • v0.55, 2004. június 20. - Többszörös simbolikus linkekről információ hozzáadása, és egyéb apró módosítások, frissítések.
  • v0.54, 2004. április 26. - Némi Debian információ hozzáadása. Apróbb javítások. Újra beírt adatok arról, hogy hogyan hívjuk a szabály fájlt. Hálózati csatolók elnevezéséről új információk hozzáadása.
  • v0.53, 2004. április 15. - Apróbb korrekciók. Új információk a NAME{all_partitions}-ról. Új információk egyéb udevinfo trükkökről.
  • v0.52, 2004. április 14. - Visszatérés az "udev.rules" használatának javaslatára, amíg az udev alapértelmezései nem engednek más fájlokat. Apróbb munkák.
  • v0.51, 2004. április 6. - Azt javaslom most, hogy a felhasználók a "local.rules" fájl használják, mint a korábbi "udev.rules"-t.
  • v0.5, 2004. április 3. - Apróbb tisztítások és felkészülés az udev terjesztésébe való bekerülésre.
  • v0.4, 2004. március 20. - Általános javítások, tisztázások és törlések. További információk hozzáadása az usb-tárolók szabályainak megírásához.
  • v0.3, 2004. február 23. - Néhány rész átírva úgy, hogy hangsúlyozza a sysfs elnevezési módját, s az erre való rátalálást. A szabályírásos részek frissítése, hogy tükrözze az udev 018 verziójának új, SYSFS{fájlnév} elnevezési sémáját. Javított szakaszolás és további pontok tisztázása. További információk a KDE-ről.
  • v0.2, 2004. február 18. - Egy kis kihagyás pótlása az egyik példában. Frissítés a nagy tárolóeszközök felismerésénél. Frissített nvidia szakasz.
  • v0.1, 2004. február 15. - Eredeti, első publikálás.


[szerkesztés] Az íráskor használt szoftver verziók

  • Linux Kernel 2.6.11
  • udev 056


[szerkesztés] Terminológia: devfs, sysfs, nodes, stb...

Csak egy alalpfokú bemutatás, nem teljesen alapos.

A tipikus linux alalpú rendszeren a /dev könyvtárat használják a fájl-szerű eszköz node-ok tárolására, s ezek a node-ok hivatkoznak bizonyos eszközökre a rendszerben. Minden node a rendszer egy részére (egy eszközre) mutat, ami vagy létezik vagy nem. A felhasználói tér alkalmazásai ezeket az eszköz node-okat használhatják a rendszer hardverével való kapcsolattartásra. Például az XFree86 a /dev/input/mice fájlra "figyel", így tudja a felhasználó egérmozgásai szerint mozgatni az egérmutatót a monitoron.

A korábbi /dev könyvtárakban megtalálható volt az összes lehetséges eszköz, ami csak előfordulhatott a rendszerben. A /dev könyvtárak ezért nagyon nagyok voltak. Ekkor jött a devfs, hogy egy könnyebben kezelhető megközelítést nyújtson (lényegében ez csak azokat az eszközöket tartotta a fájlrendszerben, amik a be voltak dugva rendszerbe), más funkciók mellett, de a rendszernek olyan problémái voltak, amiket nem lehetett könnyen kijavítani.

Az udev egy "új" mód a /dev könyvtárak kezelésére. Úgy tervezték, hogy megoldjon olyan gondokat, amiket az előző /dev implementációnál jelen voltak, s egy rendes alapot nyújtson a továbbiakra. Ahhoz, hogy a rendszerben jelen lévő eszközökhöz tartozó /dev eszköz-node-ok létrejöhessenek és elnevezésük rendben legyen, az udev a sysfs-re és a vonatkozó, felhasználó által megadott szabályokra támaszkodik. Ez a dokumentum megpróbálja a szabályírás műveletét segíteni. Ez a művelet az, amit a felhasználónak kell (illetve lehet) megtennie.

A sysfs egy új fájlrendszer a 2.6-os kernelben. Ezt a kernel kezeli és alapvető információkat nyújt az aktuálisan a rendszerbe dugott eszközökről. Az udev fel tudja használni ezt az információt, hogy a hardverhez illő eszköz node-ot tudjon létrehozni. A sysfs a /sys alá van becsatolva (mount-olva) és böngészhető. Lehet, hogy célszerű megvizsgálni az itt található fájlok közül néhányat, mielőtt az udev-et megismernénk. E dokumentumban a /sys és a SYSFS fogalmakat felcserélhetőként kezelem.

[szerkesztés] Miért?

Ahogy fentebb is áll, az udev szabályok írása egy opcionális művelet. Alapértelmezetten, ha bedugunk egy eszközt a gépbe, a hozzá tartozó node (például a /dev/sda) az USB kulcsokhoz) megjelenik épp úgy, mint a korábbi udev megvalósításokban.

Ám az udev lehetővé teszi az eszköz node-ok elnevezését. Két okunk lehet, amiért ezt szeretnénk: kényelem és az állandó elnevezések.

Vegyük például amikor bedugod a gépbe a nyomtatódat, az megkapja a /dev/printer nevet és emellett a szokásos /dev/lp0 nevet is. Ez nem csak kényelmes (például olvasni, vagy beépíteni máshova), hanem ez egy megoldás lehet a nem állandó elnevezésekre is. Mondjuk van nekem két nyomtatóm: egy HP lézer nyomtató és egy Epson tintasugaras. Amikor mindkettő be van dugva, akkor létezik mind a /dev/lp0, mind a /dev/lp1.
Honnan fogom tudni, hogy melyik node melyik eszközt jelenti? Nincs erre egyszerű mód. Az először csatlakoztatott nyomtató kapja az "lp0"-t, a másodikként bedugott az "lp1"-et. A nyomtatókat fordított módon bedugva a nevek felcserélődnek, s az erre hivatkozó szkriptjeim (amik a HP lézernyomtatót mindig az "lp1"-en keresik) is összezavarodnak.

De ha a HP lézerem mindig lp_hp (és persze "lpX") néven, és a másik pedig mindig lp_epson (s persze "lpY") néven jelennének meg, a szkriptjeim ezekre a nevekre tudnának hivatkozni. Az udev mágiája tudja biztosítani az állandó neveket, melyek a kívánt eszközre mutatnak.

Külső tárolóeszközöknél (pl. USB tárolóknál) az állandó elnevezés nagyon hasznos abban, hogy a megfelelő eszköznevet fixen be lehessen illeszteni a /etc/fstab fájlba.

Fontos megérteni, hogy az udev szabályok írása jelenti az udev működésének szabályozását. A szabályok írása nem a probléma megkerülése, ha nincs egy bizonyos eszközünk. Ha nincs illeszkedő szabály, az udev ettől még létrehozza a node-ot a kernel által megadott néven.


[szerkesztés] A szabályírás alapjai

Amikor az udev beteríti a /dev-et, a szabályfájlok sorának beolvasása után eldönti, hogy milyen node-okat tegyen bele, s hogy miként nevezze őket.

Az alapértelmezett udev szabályokat a /etc/udev/50-udev.rules fájl tárolja. Érdekes lehet belenézni e fájlba. Néhány példát és alapértelmezett értéket tartalmaz a devfs stílusú /dev kiosztás szerint. Célszerű a saját szabályainkat nem ebbe a fájlba írni, hogy a frissítések telepítésekor elkerülhetők legyenek a problémák.

A /etc/udev/rules.d/ könyvtár fájljait betűrendben olvassa be. Az udev azonnal abbahagyja a szabályok feldolgozását, amint talál a felismert hardverhez egy illeszkedő szabályt a fájlokban. Fontos elérni, hogy a saját szabályainkat az alapértelmezettjei előtt dolgozza fel az udev, különben az elnevezési beállítások nem jutnak érvényre! Azt javaslom, hogy a saját szabályaidat pl. a etc/udev/rules.d/10-local.rules fájlban tárold (ez nem létezik kezdetben - hozd létre!). Minthogy a 10 az 50 előtt van, ez a szabályfájl előbb kerül beolvasásra. Fontos még, hogy a szabályfájlok .rules-ra végződjenek, különben nem használja az udev.

Minthogy immár a saját szabályaid érvénytelenítik az udev alapértelmezett szabályait, melyek az alap /dev kiosztást létrehoznák, érdemes a devfs stílusú neveket/szimbolikus linkeket is megadni a saját szabályainkhoz, s így létezni fog a helyes alapértelmezett és a saját néven is.

A szabály fájlban azok a sorok, melyek "#" jellel kezdődnek, megjegyzésnek minősülnek. Minden egyes nem-megjegyzés sor egy-egy szabályt jelent.

A szabályokat kulcsok alkotják. A kulcsokat vesszővel választjuk el egymástól. Némely kulcsokat olvasási és illeszkedési információkhoz használjuk, másokat információ hozzárendelésre és művelet végrehajtására.

  1. Legalább egy azonosító kulcsot kell megadni, ami a szabályt akármennyi a rendszerben lévő eszközhöz csatolja. Ezeket a későbbi Eszközök azonosítása alap kulcsokon keresztül pontban olvashatod.
  2. Legalább egy hozzárendelési kulcsot kell megadni, ami meghatározza, hogy az eredmény eszköz-node miként legyen létrehozva. Ide tartozik a NAME, SYMLINK, OWNER, GROUP és MODE kulcsok, mindezek leírása megtalálható e dokumentumban.

A közönséges szabályok !! FIXME !! alap azonosító kulcsot használnak az eszköz nevének megállapításakor ,és lennie kell egy NAME hozzárendelési kulcsnak az eszköz node-név meghatározásához. Az udev csak egy node-ot hoz létre egy eszközhöz, ezért ha azt szeretnénk, hogy több néven legyen elérhető, nekünk kell megadni a másik nevet egy SYMLINK hozzárendelési kulccsal.

Íme egy kicsit módosított udev példa szabály ennek illusztrálására:

BUS="usb", SYSFS{serial}="HXOLL0012202323480", NAME="lp_epson", SYMLINK="printers/epson_stylus"

Az azonosítási kulcsok itt a BUS és a SYSFS{serial}. A hozzárendelési kulcs a NAME és a SYMLINK. Az udev arra az eszközre illeszti a szabályt, amelyik az USB buszon csatlakozik és a szériaszáma "HXOLL0012202323480". Fontos, hogy mindegyik (s nem akármelyik) megadott kulcsnak egyeznie kell az értékkel ahhoz, hogy az udev használja a szabályt az eszköz elnevezéséhez.

Az udev ezt az eszközt lp_epson-nak fogja nevezni, és /dev/lp_epson-ként fog a fájlrendszerben szerepelni.
Az udev létre fog még hozni egy szimbolikus linket a /dev/lp_epson-ra, s ezt a /dev/printers/epson_stylus helyre teszi (a printers könyvtár automatikusan létrejön). Ezután nyomtathatunk az Epson nyomtatónkra úgy, hogy az adatokat küldhetjük mind a /dev/printers/epson_stylus, mind a /dev/lp_epson eszközre küldjük.

Bármilyen hozzáadott vagy módosított szabály nem jut érvényre mindaddig, amíg az udev-et nem értesítjük róla. Ne felejtsük a módosítások után futtatni a következőt:

# udevstart


[szerkesztés] További automatizált testreszabások a NAME és a SYMLINK paraméterekhez

A saját szabályaink NAME és a SYMLINK paramétereiben használhatunk egyszerű operátorokat, hogy az eszközök elnevezését segítsük. A hacker-ek (!! FIXME !! jó csákányosok :-) ezt úgy is ismerik, mint printf-szerű szöveg behelyettesítés. Létezik jónéhány olyan operátor, amelyik össze tud állítani egy pár vagy az összes NAME/SYMLINK paramétereket. Ezek az adatok az eszközhöz kapcsolódó kernel-adatokra vonatkoznak. Nézzük ezt a példát:

BUS="usb", SYSFS{vendor}="FUJIFILM", SYSFS{model}="M100", NAME="camera%n"

A %n operátor be lesz helyettesítve a fényképező eszköz "kernel-számával", hogy egy olyan NAME jöjjön létre, mint pl. a camera0, camera1, stb.

A másik gyakran használt operátor a %k. Ez a kernel által adott nevet jelenti, pl. "hda1". Gyakran láthatunk olyan szabályokat, amiben a NAME="%k" szerepel, hogy a hardver alapértelmezett neve létezzen. Ezekben a szabályokban a tesrtreszabás szimbolikus linkeken (SYMLINK paraméter) át történik.

Az operátorok teljes listája magyarázatokkal megtalálható az udev man oldalán.

[szerkesztés] Shell-típusú mintailleszkedés a kulcsokban

Használhatjuk a shell-típusú mintákat arra, hogy még rugalmasabb kulcsokat lehessen megadni.Példaként itt egy alapértelmezett szabály:

KERNEL="ts*", NAME="input/%k"

Az itt használt * operátor tulajdonképpen bármire illeszkedhet - üres string, egy vagy több bármilyen karakter. A szabály ezt mondja:

Illeszkedjen bármilyen "ts" betűkkel kezdődő eszközre, s ezt nevezzük el a KERNEL nevével (%k) a beviteli (!! FIXME !! input) könyvtár alatt.

A "?" operátor hasonlóan bármilyen egyetlen karakterre illeszkedik (de nem az üres karakterre).

Használhatjuk a szögletes zárójeleket [ ], hogy bármilyen egyes karakterre illeszkedést jelöljünk. Pontos idézet az udev man oldaláról:

Például a "tts[SR]" szöveg illeszkedni fog a "ttyS"-re és a "ttyR"-re is egyaránt

Ugyancsak megadhatunk tartományokat, amire illeszkedést lehet keresni, például a "[0-9]" bármilyen egyetlen számra illeszkedik. Példának álljon itt egy alapértelmezett udev szabály:

KERNEL="fd[0-9]*", NAME="floppy/%n"

A szabály ezt mondja:

Azon eszközökre vonatkozzon a szabály, aminek a KERNEL neve "fd"-vel kezdődik, s egy szám áll mögötte, ami után még (nem kötelezően) állhat még bármi. Az eszköz neve legyen az eszköz kernel által adott száma (%n) a floppy könyvtár alatt.

Ezeket a jokereket és mintákat használhatjuk egyszerű kulcsokban és sysfs-alapú azonosítókban (lásd ezen kulcstípusok magyarázatát lentebb).

Direkt hagytam ki néhány információt e témában (különösen a [ ] operátorok használatának rugalmasságát illetően), mert ezek túlmutatnak egy alapszintű szabály-író dokumentum keretein. További információ található az udev man oldalán.


[szerkesztés] Kulcsírás alapjai

Az udev ad számunkra néhány egyszerű kulcs-illeszkedési módot, és még hozzá egy elég rugalmas illeszkedési információt a SYSFS-ben. Egy tipikus szabály mind a normális kulcsokra (pl. BUS és KERNEL), mind a SYSFS kulcsokra illeszkedik azért, hogy különbséget tudjon tenni az ugyanabba a csatlakozóba dugott különböző hardverelemek között.

Jogosan kérdezheted, hogy miként fogom megtalálni pl. a nyomtatóm sorozatszámát, vagy hogy mi a fényképezőm típusa? A szabályírás egyébként nem olyan nehéz, mint amilyennek elsőre hangzik. A trükkös rész az eszköz megtalálása a /sys-ben, és meghatározni, hogy innen melyik információt használjuk.


[szerkesztés] Eszközök azonosítása egyszerű kulcsokkal

Lásd az udev man oldalát e kulcsokról bővebben.

Érvényes kulcsok:

  • BUS - az eszköz busztípusára illeszkedik.
  • KERNEL - a kernel eszköznevére illeszkedik.
  • DRIVER - a kernel eszközmeghajtó nevére illeszkedik.
  • SUBSYSTEM - a kernel alrendszer (subsystem) nevére illeszkedik.
  • ID - A buszon az eszköz számára illeszkedik (pl. a PCI busz ID-je).
  • PLACE - A bedugott eszköz fizikai pozíciójára illeszkedik (pl. melyik USB aljzatba lett csatlakoztatva az eszköz).

Az ID és PLACE kulcsoknak megvan a saját használati módjuk, de nem használják őket gyakran a szabályokban. Ez a dokumentum a BUS és a KERNEL kulcsok és a SYSFS{...} kulcsok használatára koncentrál. Néhány példán keresztül mutatom ezeket be.

Még további rugalmasság miatt az udev megengedi, hogy a kulcsok külső szkripteket hívjanak meg és azok eredményét és a környezeti változókat feldolgozzák. Ez megint nem tartozik e cikk kereteibe. A részleteket az udev man oldala mutatja.


[szerkesztés] Eszközök felismerése SYSFS fájlokon keresztül

Háttérinformáció: A SYSFS sok apró fájl tárol egy könyvtárfában, amelyek információkat nyújtanak a hardverről. Egy fájl általában csak egy "adatelemet" tartalmaz, pl. egy eszköznevet, gyártót vagy termékazonosítót...

Jegyezd meg, hogy a SYSFS{...}' kulcsokat össze lehet kombinálni az előző szakaszokban leírt kulcsokkal.

A kulcsokat a SYSFS{fájlnév} formában lehet használni, ahol a fájlnév egy bizonyos információra mutat a SYSFS-ben. Ezzel megkapjuk a fájlban tárolt információt. Például, amikor a fényképezőm csatlakoztatva van a számítógéphez, létezik egy olyan /sys/block/sda/device/model fájl, ami a "USB 2.0M DSC" szöveget tartalmazza. Erre való illeszkedést a SYSFS{model} = "USB 2.0M DSC" szabállyal érhetjük el.

Figyelem! Ilyen módon bármelyik fájlt el lehet érni a SYSFS-ben, de ha több fájl is illeszkedik (többszörös kulcsokon keresztül), akkor csak azokat a fájloknak szabad illeszkedniük, amelyek ugyanabban a könyvtárban vannak !! FIXME !!. Általában több könyvtár ad információt egy eszközről. Nem lehet keverni és illeszteni (ahogy a példa mutatja lentebb). !! FIXME !!

Szerencsére a szabályírással nem jár együtt a SYSFS kismillió fájljának végignyálazása, az udevinfo program megteszi ezt nekünk. A programot az udev csomagja tartalmazza.

Az első dolog, amit tenni kell, hogy találjunk egy könyvtárat a /sysalatt, ami a kívánt hardverre mutat, s tartalmaz egy dev nevű fájl, mert az udevinfo csak ilyen könyvtárakkal tud dolgozni. Ezeket a könyvtárakat vagy a /sys/block vagy a /sys/class alatt találjuk - nincs értelme máshol keresni. Ennek ellenére az udevinfo végigköveti a linkeket ebben a könyvtárban, s információkat olvas a SYSFS más szakaszaiból is.

Miután találtunk egy ilyen típusú könyvtárat, a következő parancs segíthet az udev szabályok kulcsainak elkészítéséhez:

# udevinfo -a -p /sys/path/to/hardware/info

Talán az udevinfo futtatásához egy megfelelő könyvtár találása nem is olyan egyértelmű. Van esély arra, hogy a csatlakoztatott eszköz már csinált egy eszköz-node-ot (pl. a /dev/sda-t), s ebben az esetben az udevinfo hasznos lehet. A /dev/sda eszköz példájánál maradva, a következő parancs futtatása a SYSFS megfelelő pontjához vezethet:

# udevinfo -q path -n /dev/sda

/block/sda

A fenti parancs kiemente az mondja nekünk, hogy a SYSFS útvonal, ahonnan indulni érdemes, a /sys/block/sda. Ezután én a udevinfo -a -p /sys/block/sda parancsot futtatnám. Ezt a két parancsot egymás után is fűzhetjük például így:

# udevinfo -a -p $(udevinfo -q path -n /dev/sda)

Megjegyzés: Talán észrevetted, hogy az előbb az udevinfo részére megadott útvonalak (/sys/some/path) teljes útvonalak voltak, de most a SYSFS-hez képest relatív útvonal került az összefűzött parancsba. Ez igazán nem számít, mindkét típusú útvonal elfogadható.

Nos, továbblépve a szabályírásra, van itt néhány kivágott részlet az én udevinfo -a -p /sys/block/sda parancsom eredményéből.

 follow the class device's "device"
   looking at the device chain at '/sys/devices/pci0000:00/0000:00:02.1/usb3/3-3/3-3:1.0/host0/0:0:0:0':
     BUS="scsi"
     ID="0:0:0:0"
     SYSFS{detach_state}="0"
     SYSFS{type}="0"
     SYSFS{max_sectors}="240"
     SYSFS{device_blocked}="0"
     SYSFS{queue_depth}="1"
     SYSFS{scsi_level}="3"
     SYSFS{vendor}="        "
     SYSFS{model}="USB 2.0M DSC    "
     SYSFS{rev}="1.00"
     SYSFS{online}="1"
   looking at the device chain at '/sys/devices/pci0000:00/0000:00:02.1/usb3/3-3':
     BUS="usb"
     ID="3-3"
     SYSFS{detach_state}="0"
     SYSFS{bNumInterfaces}=" 1"
     SYSFS{bConfigurationValue}="1"
     SYSFS{bmAttributes}="c0"
     SYSFS{bMaxPower}="  0mA"
     SYSFS{idVendor}="052b"
     SYSFS{idProduct}="1514"
     SYSFS{bcdDevice}="0100"
     SYSFS{bDeviceClass}="00"
     SYSFS{bDeviceSubClass}="00"
     SYSFS{bDeviceProtocol}="00"
     SYSFS{bNumConfigurations}="1"
     SYSFS{speed}="12"
     SYSFS{manufacturer}="Tekom Technologies, Inc"
     SYSFS{product}="USB 2.0M DSC"

Az udevinfo eszközünk sok hasznos információt nyújt, amit egyszerűen csak kimásolhatunk és beilleszthetünk az udev szabályaink közé. Ami miatt külön színnel jelöltem a kimenet bizonyos részeit, az az, hogy megmutassam, hogy általában nem lehet az egyes részeket összekeverni egymással. A fenti kimenetben a két különböző színű szakasz információit nem szabad összekombinálni. Ennek az az oka, hogy az egyes részek a SYSFS különböző könyvtáraira vonatkoznak. Például a következő szabály nem működne:

BUS="scsi", SYSFS{manufacturer}="Tekom Technologies, Inc", NAME="%k"

Ez a szabály azért nem működik, mert összeraktam a kezdőrészben lévő BUS="scsi" információit a csak a kék részben megtalálható adattal. A szabály csak akkor működne, ha a BUS="usb" -t használtam volna, azaz megmaradok csak a kék szakasznál.

Bizonyára észrevetted már, hogy az egyszerű szabályok írásánál sok információ nem igazán fontos (túl sok info van), általában elég, ha csak olyan információkat keresünk, amiket ismerünk és nem fognak változni (pl. model név).

Ne felejtsük, hogy ha egy olyan saját szabályt írsz, ami egy eszközt azonosít, az alapértelmezett devfs stílusú szabály nem jut érvényre! Általában célszerű a NAME=%k használata, és a saját extra neveket egy SYMLINK paraméterrel megadni, mert így nem vesznek el az alapértelmezett nevek.

Most megmutatok három példát az udevinfo kimenetére alapuló szabályírásra. Ezután felsorolok néhány eszközfüggő tippet és trükköt a helyes információ megtalálására.

Egy olvasó írta le nekem azt, hogy ő úgy találta, hogy a KDE control centere hasznos lehet a szabályírásnál. Kétségtelenül, a KDE Control centre "Info Centre" szakaszában információkat szerezhetünk pl. az USB eszközökről, s a többiről. Ez a felület olyan adatokat szolgáltat, mint sorozatszámok, szállítói azonosítók, stb. Ha a grafikus felületű megközelítést szereted, nézd meg ezt.

A gnome-volume-manager legutóbbi kiadásai képtelenek a symlink node-okat valódi eszközökként kezelni. A fentebbi leírással ellentétben talán az is lehet célszerű, ha a saját neveinket adjuk meg a NAME paraméterben, s a %k-t a SYMLINK paraméterben.

Az a működési mód, hogy a saját szabályok, melyek az alapértelmezett szabályokat felülírják, felülbírálható többszörös SYMLINK-stílusú szabályok használatával.


[szerkesztés] Többszörös SYMLINK stílusú szabályok használata

Egy másik újabb lehetőség, a NAME megadása nélküli szabályok írása, ahol egyszerűen csak SYMLINK kulcsok vannak. Ez elkerülhetővé teszi azt a szituációt, hogy a saját szabályaink felülírják az udev alapértelmezéseit.

Vegyük ezt a szabályt:

KERNEL="hdc", SYMLINK="dvd"

Amikor az udev eljut e szabályig, megjegyzi magának. Amint talál egy másik, ugyanerre az eszközre illeszkedő szabályt, melyben van NAME paraméter, az udev létrehozza az eszközt a NAME által megadott néven, s létrejön a SYMLINK-ben megadott szimbolikus link is.

Konkrétan ez itt azt jelenti, hogy amikor az udev elnevezi az én kis "hdc" eszközömet, a blokkeszközökre vonatkozó alapértelmezett szabályt alkalmazza, plusz létrhozza nekem a különbejáratú "dvd" szimbolikus linkemet.

Hasonlóan a normál szabályokra, az ilyenek sem jutnak érvényre, ha az udev ezt nem előbb találja meg, mint a NAME paramétert tartalmazó szabályt.


[szerkesztés] Tulajdonos és jogosultság felügyelete

Mint ahogy beállítható a létrejövő eszközök elnevezése, ugyancsak változtatható a node-ok tulajdonosa és jogosultsági jellemzője.

A GROUP kulcsszó megadja, melyik unix csoport tulajdonolja az eszköz node-ot. Itt egy példa az udev alapértelmezettjei közül, amelyik a framebuffer (fb) eszközöket a "video" csoport kezébe adja:

KERNEL="fb[0-9]*", NAME="fb/%n", SYMLINK="%k", GROUP="video"

Az OWNER kulcs, noha kevésbé hasznos, de lehetővé teszi megadni, hogy melyik unix felhasználó tualjdonában legyen az eszköz node. Azt a fura helyzetet véve, ha a "jani" nevű felhasználó tulajdonába kívánjuk adni a floppy meghajtót, ezt írhatjuk:

KERNEL="fd[0-9]*", OWNER="jani"

Vegyük észre, hogy a fenti szabályban egyáltalán nem adtunk meg NAME vagy SYMLINK kulcsokat! Ez nagyon hasonlít a többszörös szimbolikus link stílusra, ahol is az udev megjegyzi, hogy mi jani-t akarjuk a floppy meghajtók tulajdonosának, s akkor jut érvényre, ha talál egy NAME kulcsot tartalmazó szabályt is a floppy-k eszköz node-jára.

Ennél a stílusnál maradva még ragyogóbb dolgokat is művelhetünk. Az udev alapértelmezettjei között van a következő szabály, ami meghatározza, hogy a hangeszközök eszköz node-jai legyenek az "audio" csoport tulajdonában:

SUBSYSTEM="sound", GROUP="audio"

Ezzel elejét vehetjük annak, hogy minden egyes hangeszközhöz tartozó szabályhoz meg kelljen adni a GROUP="audio" kulcsot.

Az udev alapértelmezett unix jogosultsága a 0660 (írási/olvasási jog a tulajdonosnak és a csoportnak) az eszköz node-ok készítésénél, s ezt a /etc/udev/udev.conf fájlban tudjuk átállítani (default_mode paraméter). Lehetnek esetek, amikor nem lehet vagy nem akarjuk az alapértelmezett jogokat használni egy bizonyos eszközre. Szerencsére könnyen felülbírálhatjuk az előző értéket egy MODE hozzárendelési kulccsal. Például a következő szabály az "inotify" node-ot mindenkinek írhatóvá és olvashatóvá teszi:

KERNEL="inotify", NAME="misc/%k", SYMLINK="%k", MODE="0666"


[szerkesztés] Példa: Szabály írása az USB nyomtatómhoz

Miután a nyomtatómat csatlakoztattam a géphez, elkezdtem körülnézni a /sys könyvtáraiban, egy jó kiindulópontot keresve. Nem jutottam semerre, de azt észrevettem, hogy a nyomtatóm a /dev/lp0 eszköz node-ot kapta. Az udevinfo hasznos útat mutatott:

# udevinfo -q path -n /dev/lp0
/class/usb/lp0

Ezután futtatva az "udevinfo -a -p /sys/class/usb/lp0" parancsot, kapok egy csomó információt. A vonatkozó részeket felhasználom az egyedi eszköz azonosítóhoz:

looking at the device chain at '/sys/devices/pci0000:00/0000:00:02.1/usb3/3-3':
BUS="usb"
SYSFS{manufacturer}="EPSON"
SYSFS{product}="USB Printer"
SYSFS{serial}="L72010011070626380"

Ezután az udev szabályom ez lesz:

BUS="usb", SYSFS{serial}="L72010011070626380", NAME="%k", SYMLINK="epson_680"

Ezután a nyomtató eszköz node-jai a /dev/lp0 alatt (vagy a /dev/lp0 alatt, ha előtte már volt egy nyomtató csatlakoztatva), és a /dev/epson_680 mindig az adott nyomtatóhoz tartozó eszközre mutat.


[szerkesztés] Példa: Szabály írása az USB-tárolóként működő digitális fényképezőgéphez

Gyors bevezetés: Az én fényképezőm külső SCSI merevlemezként azonosítja önmagát (az usb-storage drivert használja, ugyanazt, mint az USB merevlemezek és a flash-kártyaolvasók). Ezután csatolni tudom a lemezen lévő parítciót, s másolhatom a rajta lévő fájlokat. Nem minden fényképező működik ily módon - nagyon soknak programra (pl. gphoto2) van szüksége a képek eléréséhez.

Ez a rész egy kicsit trükkös. Jópár node létrejön alapból, amikor csatlakoztatom a fényképezőmet: /dev/sda és /dev/sda1, s még a /dev/sg1. Ez egy példa arra, hogy a pontosság fontos - Ha a szabály nem elég specifikus, a fenti három node bármelyikére illeszkedhet.

Az sda1 az az eszköz, amit /dev/camera-ként szeretnék látni, minthogy ezt fogom becsatolni a fájlrendszerembe. Az udevinfo nem mutat semmilyen használható különbséget az sda, sda1 és az sg1 között. Úgy döntöttem, hogy a legmegbízhatóbb mód a különbségtételre a KERNEL-nevek megvizsgálása.

Egy KERNEL="sd?" kulcs olyan kernel beli nevekre illeszkedik, mint az "sda1", "sdb1, "sdc1", s ugyanilyen fontos, hogy nem illeszkedik az "sda", "sdb" vagy "sg1" nevekre. E kulcs célja, hogy kihagyja a /dev/sda és a /dev/sg1 node-okat. Az eszköz egy digitális fényképezőgép - nem fogom partícionálni vagy hasonló, ezért ez a két node teljesen haszontalan számomra. A kulcs a /dev/sda1 node-ot próbálja meg megragadni, s ez felcsatolható, s ezért fontos nekünk.

Miután e node-ot (sda1) blokk-eszközként kezeljük, a /sys/block alatt keresgélés jó kezdőpontnak tűnik.

Az én /sys/block könyvtáram alatt van egy sda nevű alkönyvtár. A /sys/block/sda könyvtáram alatt van egy sda1 nevű alkönyvtár. Mindkét könyvtárban van dev fájl, ezért jó , ha erre futtatjuk az udevinfo-t. A következő parancs futtatása sok információt ad a fényképezőmről és az USB portról, amihez csatlakoztatva van.

# udevinfo -a -p /sys/block/sda/sda1

Az udevinfo kimenetéből észrevehetjük ezt az érthető és hasznos információt:

SYSFS{product}="USB 2.0M DSC"

Ez megadja a szabályt is. A teljesség kedvéért beleteszem a BUS kulcsot is (ami szintén benne van az udevinfo kimenetében).

BUS="usb", SYSFS{product}="USB 2.0M DSC", KERNEL="sd?1", NAME="%k", SYMLINK="camera"

Mostantól, ha a fényképező csatlakoztatva van, a neve /dev/sda1 lesz (vagy ha az sda1 nem elérhető, akkor /dev/sdb1), és mindig lesz egy link a /dev/camera névre. A /dev/sda(vagy sdb) node mindig a megszokottként jelenik meg, de a lényeg az, hogy a "camera" szimbolikus link mindig a felcsatolható partícióra mutat.


[szerkesztés] További megjegyzések az USB tárolók szabályainak írásához

Carl Streeter, akinek van egy nagy USB merevlemeze, azt írta nekem, hogy a digitális fényképezős példám ellenére a /dev/sda node hasznos a számára. Rámutatott, hogy néha mégis szükséges az fdisk vagy a hdparm eszközök alkalmazása ezen node-okon.

Carl szabálya ez:

BUS="usb", KERNEL="sd*", SYSFS{product}="USB 2.0 Storage Device", NAME="%k", SYMLINK="usbhd%n"

Ez a szabály szimbolikus linkeket hoz létre imígyen:

  • /dev/usbhd - Az fdisk-elhető node
  • /dev/usbhd1 - Az első partíció (csatolható)
  • /dev/usbhd2 - A második partíció (csatolható)

Megegyeztünk abban, hogy a helyzettől és a kérdéses eszköztől függően lehet indok a felcsatolható és a nem felcsatolható /dev/sda node-okra is. Használd azt, ami a legcélszerűbb.

Egy másik nehéz szituáció lehet, ha egy több-csatlakozós USB-tároló kártyaolvasónk van. Ezek az eszközök általában nem tudatják a gazdagéppel, ha új kártyát helyeznek beléjük vagy húznak ki, ezért ha az olvasó be van dugva a gépbe, akkor egy kártya kivétele vagy betétele nem hoz létre új felcsatolható eszközt.

Ez a probléma szintén áll más USB lemezekre is, pl. ha egy új partíciót hozunk létre, az nem jelenik meg mindaddig, míg újra nem csatlakoztatjuk az eszközt.

Az udev kínál egy megoldást erre - képes az összes partícióhoz blokk-eszközt létrehozni. Minden megadott szabályhoz az összes 16 partíciós blokk device node létre fog jönni. Ennek eléréséhez egyszerűen módosítani kell a NAME kulcsot, mint itt, alább:

BUS="usb", SYSFS{product}="USB 2.0 Storage Device", NAME{all_partitions}="usbhd"

Ennek hatására létrejön az összes node: usbhd, usbhd1, usbhd2, usbhd3, ..., usbhd15.


[szerkesztés] Példa: Kényelmi szabályok a CD meghajtókhoz

Két CD meghajtóm van - egy DVD olvasó és egy CD újraíró. A DVD-m a hdc és a CDRW a hdd. Ezt nem akarom megváltoztatni, hacsak át nem káblezem a rendszeremet.

Vannak olyan emberek (jómagam is), akik szeretik, ha olyan eszközneveik vannak, mint /dev/dvd és /dev/cdrw a kényelem miatt. Miután ismerjük a "hdX" értékeketm a szabály megírása egyszerű. A lenti példa mindent elmond:

BUS="ide", KERNEL="hdc", NAME="%k", SYMLINK="dvd cdroms/cdrom%n"
BUS="ide", KERNEL="hdd", NAME="%k", SYMLINK="cdrw cdroms/cdrom%n"


Talán feltűnt már, hogy az alapértelmezett 50-udev.rulesfile tartalmaz egy olyan szabályt, ami meghív egy szkriptet, s ez adja a neveket az eszközökhöz. Ez ne zavarjon össze senkit - most is, mint mindig ezek a szabályok egy olyan fájlban vannak, melyeket az udev az alapértelmezett szabályok előtt dolgoz fel, ezért azokat nem is alkalmazza.


[szerkesztés] Példa Szabály írása az USB Visor Palm Pilot-hoz

Ezek az eszközök USB-soros eszközként működnek, ezért alapértelmezetten csak a ttyUSB1 node jön létre. A felhasználói Palm programok a /dev/pilot eszközt keresik, ezért szükséges ennek létrehozását beállítani. A következő szabály megteszi ezt nekünk:

BUS="usb", SYSFS{product}="Palm Handheld", KERNEL="ttyUSB*", SYMLINK="pilot"

Ezt a trükköt Carsten Clasohm blogjából vettem, s ez részletesen leírja a helyzetet. Esetleg szükséges lehet még a szabályhoz tartozó tulajdonost és jogosultságot beállítani a megfelelő kulcsokkal.


[szerkesztés] Példa: Szabály írása hálózati csatolóhoz

Egy érdekes, új lehetőség az újabb udev verziókban a hálózati csatolók átnevezése, mint ahogy a nameif kis program teszi. A hálózati csatolók nem jelennek meg a /dev-ben, de névvel hivatkozunk rájuk (pl. az ifconfig-gal). A különbségek ellenére a szabályok megírásának folyamata majdnem ugyanaz.

Szokásos módon az udevinfo lesz segítségünkre a szabályírásban. A példánkban az "eth0" hálózati csatolót fogjuk átnevezni (a következő csak egy részlet):

# udevinfo -a -p /sys/class/net/eth0/
  looking at class device '/sys/class/net/eth0':
    SYSFS{address}="00:52:8b:d5:04:48"

Minden hálózati csatolónak megvan a maga egyedi MAC-címe, ezért ezt használom a szabályomhoz. Ez nem változik egészen addig, amíg nem cserélünk hálózati kártyát. Egy dologra kell figyelni: Győződjünk meg róla, hogy az udevinfo által adott (fenti) információt használod, mert ez kis-/nagybetű érzékeny. Légy óvatos az olyan eszközökkel, mint az ifconfig, mert az nagybetűkkel jeleníti meg a betűket.

Álljon itt egy példa szabály:

KERNEL="eth*", SYSFS{address}="00:52:8b:d5:04:48", NAME="lan"

Ennek érvényre juttatásához újra kell tölteni a hálózati drivert. Vagy kitöltés és betöltés kell a kernelmodulra, vagy újra kell indítani a rendszert. Szintén újra kell konfigurálni a rendszert, hogy a "lan" eszközt használja az "eth0" helyett. Nekem gondom volt ennek beállításával (a csatoló nem lett átnevezve) mindaddig, amíg minden hivatkozást ki nem töröltem az "eth0"-ra.

Ezután már a "lan"-t lehet használni az "eth0" helyett pl. az ifconfig eszközzel.


[szerkesztés] Tippek a SYSFS-ben a megfelelő helyek megtalálásához

Keresek ide még néhány eszköz-specifikus tippet. Kérlek vedd fel velem a kapcsolatot, ha ilyet tudsz mutatni.

  • Ha a szabályíráshoz keresett eszköz létrehozott egy eszköz node-ot a /dev alatt, akkor az szerencse! A következő parancs egy megfelelő /sys útvonalat fog adni: udevinfo -q útvonal -n /dev/eszközöd
  • Mindig használd az udevinfo-t a szabályírás elősegítésére! Mindig használd az udevinfo-t a /sys/block és /sys/class könyvtárakban való keresésre (nem fog más láncban keresni).
  • Ha teljesen elakadsz, a következő parancs az összes "dev" fájlt megkeresi a /sys alatt. (az udevinfo olyan könyvtárakkal dolgozik, ahol van ilyen fájl): find /sys -name dev
  • Ha az eszköz egy flash-kártyaolvasó, usb flash-meghajtó vagy egy digitális fényképezőgép, ami usb-tárolóként viselkedik, ami /dev/sdX-ként jön létre, akkor a /sys/block/sdX alatt keress!
  • Ha lehet, az előző szituácóban mindig tégy különbséget az sdX és sdX1 eszközök között. Ezt el lehet érni úgy, hogy a KERNEL="sd?1" illeszkedjen az sdX1-re, s a KERNEL="sd?" illeszkedjen az sdX-re.
  • A /dev/lpX-ként létrehozott USB nyomtatókat a /sys/class/usb/lpX alatt célszerű keresni.
  • Az usb lapolvasók drivere mostanában lett eltávolítva a kernelből, s a felhasználói térben lett újra megvalósítva (a SANE csomag részeként).Ezért ne írj (, mert úgysem tudsz) szabályokat írni az ilyen harverekhez, ugyanis az nem támaszkodik a kernel meghajtókra.
  • Ne felejtsük, hogy sajnálatos módon a kernel nem minden eszközről ad információt a SYSFS-nek, ezért egyszerűen vannak olyan eszközök, melyekre nem lehet szabályokat írni jelenleg (2004.02.20). Az udev írója azt állítja, hogy még 162 olyan meghajtó van, melyeket SYSFS-re kell konvertálni.


[szerkesztés] Hibakeresés a szabályokban

Ha megírtad a szabályaidat, s az udevstart futtatásáról sem feledkeztél meg, de mégsem tűnik úgy, hogy azok érvényre jutottak, van néhány mód arra, hogy utána nézzünk a dolognak.

A /etc/udev/udev.conf fájl tartalmaz egy udev_log opciót. Ha ezt yes-re állítjuk, akkor az udev naplózni fogja a rendszernaplóba, hogy milyen node-on milyen szabályok jutottak érvényre. A legtöbb felhasználó ezt a naplót a /var/log/messages fájlban találja.

Továbbá, amennyiben a létrehozandó node SYSFS-beli útvonalát ismerjük, használhatjuk az udevtest parancsot, ami megmutatja, hogy mit tenne az udev a node-dal. Például:

# udevtest /sys/class/sound/dsp/
version 056
looking at '/class/sound/dsp/'
opened class_dev->name='dsp'
configured rule in '/etc/udev/rules.d/50-udev.rules[132]' applied, added symlink '%k'
configured rule in '/etc/udev/rules.d/50-udev.rules[132]' applied, 'dsp' becomes 'sound/%k'
creating device node '/dev/sound/dsp', major = '14', minor = '3', mode = '0660', uid = '0', gid = '18'

Az udevtest csak egy tesztelő/debugoló eszköz - mégha azt is mondja, valójában nem csinálja meg az eszköz node-ot!


[szerkesztés] A szerzőről, Források

A cikk szerzője Daniel Drake <dan@reactivated.net>

Ne habozz visszajelzést küldeni!

Copyright (C) 2003-2005 Daniel Drake


Erre a dokumentumra a GNU General Public License, Version 2. licensz vonatkozik.

Személyes eszközök