Dokumentáció/SL9.3/Rendszer/Dinamikus eszközcsomópontok és az udev
Bevezetés
Linux-rendszereken az eszközcsomópontok hagyományosan a /dev könyvtárban tárolódtak. Minden egyes lehetséges eszköztípushoz létezett egy csomópont, függetlenül attól, hogy valóban létezett-e a rendszerben. Emiatt viszont ez a könyvtár meglehetősen sok helyet foglalt. A devfs parancs lényeges előrelépést jelentett, mivel csak a ténylegesen létező eszközök kaptak eszközcsomópontot a /dev könyvtárban.
Az udev az eszközcsomópontok létrehozásának egy új módját kínálja. Összehasonlítja a sysfs által biztosított információt a felhasználó által, szabályok formájában megadott adatokkal. A sysfs a 2.6-os kernel egy új fájlrendszere. Alapszintű információt biztosít a rendszerhez csatlakozó eszközökről. A sysfs a /sys könyvtár alá kerül felcsatolásra.
A felhasználónak nem kötelező szabályokat készítenie. Ha egy eszköz csatlakozik, akkor létrejön a megfelelő eszközcsomópont. A szabályok azonban lehetővé teszik a csomópontok neveinek megváltoztatását. Ez azt is jelenti, hogy a bonyolult eszköznevek lecserélhetők például egyszerűbben megjegyezhetőkre, illetve állandó eszköznevek használhatók akkor is, ha két ugyanolyan típusú eszköz csatlakozik.
Ha másképp nincs megadva, két nyomtató a /dev/lp0 és /dev/lp1 megjelölést kapja. Az, hogy melyik eszköz melyik eszközcsomópontot kapja, attól függ, hogy milyen sorrendben kapcsolják be őket. Egy másik példa a külső tárolóeszközök, például USB-lemezek használata. Az udev parancs lehetővé teszi a pontos eszköz elérési utak megadását az /etc/fstab fájlban.
Szabályok létrehozása
Mielőtt az udev nekiállna eszközcsomópontokat létrehozni a /dev könyvtár alatt, előbb beolvassa az /etc/udev/rules.d könyvtár összes .rules kiterjesztésű fájlját, ábécésorrendben. Az eszközökre illeszkedő első szabály kerül alkalmazásra, még akkor is, ha egyébként létezik több. A megjegyzéseket kettőskereszt (#) karakter után kell írni. A szabályokat az alábbi formátumban kell megadni:kulcs, [kulcs,...] NÉV [, SZIMBOLIKUS LÁNC]
Legalább egy kulcsot meg kell adni, mert a szabályok ezen kulcsok alapján rendelődnek az eszközökhöz. Szintén kötelező megadni egy nevet. A /dev könyvtár alatt létrehozott eszköz ezt a nevet fogja viselni. Az elhagyható symlink paraméter lehetővé teszi a csomópontok más helyen történő létrehozását. Egy nyomtató szabálya például így nézhet ki:
BUS="usb", SYSFS{serial}="12345", NAME="lp_hp", SYMLINK="printers/hp"
Ebben a példában két kulcs van, a BUS és a SYSFS{serial}. Az udev összehasonlítja a sorozatszámot az USB-buszra csatlakozó eszköz sorozatszámával. Ahhoz, hogy a /dev könyvtárban az lp_hp nevet kapja az eszköz, az összes kulcsnak meg kell egyeznie. Ezenfelül létrejön a /dev/printers/hp könyvtárban egy, az eszközcsomópontra hivatkozó szimbolikus lánc is. Végül ezzel egyidőben automatikusan létrejön a printers könyvtár. A nyomtatási feladatok ezután küldhetők akár a /dev/printers/hp, akár a /dev/lp_hp eszközre.
Automatizálás a NAME és a SYMLINK segítségével
A NAME és SYMLINK paraméterek lehetővé teszik operátorok használatát az automatikus hozzárendelésekben. Ezek az operátorok az érintett eszköz kerneladataira hivatkoznak. Egy egyszerű példán mutatjuk be az eljárást:BUS="usb", SYSFS{vendor}="abc", SYSFS{model}="xyz", NAME="camera%n"
A névben található %n operátor a kameraeszköz számára cserélődik ki, például camera0 vagy camera1. Szintén hasznos operátor a %k, amely a kernel normál eszköznevére cserélődik ki (például hda1). Meghívható egy külső program is az udev szabályokban, amely használhatja a NAME és SYMLINK értékekben visszaadott karaktersorozatokat. Az összes operátor listája az udev kézikönyvoldalán olvasható.
Reguláris kifejezések a kulcsokban
Az udev-szabályok kulcsaiban használható a parancsértelmezőben megszokott mintaillesztés, más néven a helyettesítő karakterek. Például a * tetszés szerinti számú karaktert helyettesíthet, míg a ? karakter pontosan egyet.KERNEL="ts*", NAME="input/%k"
Ez a szabály a normál kernelnevet adja a normál könyvtárban azon eszközöknek, amelyek azonosítója a "ts" betűkkel kezdődik. Az udev-szabályokban alkalmazható reguláris kifejezések használatával kapcsolatban részletes információ a man udev kézikönyvoldalon olvasható.
Kulcsválasztás
A működő udev-szabályok alapja a jó kulcs kiválasztása. Néhány példa a standard kulcsokra:- BUS
- eszközbusz típus
- KERNEL
- a kernel által használt eszköznév
- ID
- az eszköz száma a buszon (például a PCI-buszon az azonosító)
- PLACE
- fizikai pont, ahová az eszköz csatlakozik (mint USB-n)
- SYSFS{...}
- sysfs eszközattribútumok, például címke, gyártó, sorozatszám stb.Az ID és PLACE kulcsok is hasznosak lehetnek, de általában a BUS, KERNEL és SYSFS{...} kulcsok használatosak. Az udev beállításai olyan kulcsokat is tartalmazhatnak, amelyek külső parancsfájlokat hívnak meg és kiértékelik az eredményeiket. Ezzel kapcsolatban részletek a man udev oldalakon találhatók.A sysfs fájlrendszer a hardverinformációt kisméretű fájlokként, egy könyvtárstruktúrában tárolja. Minden fájl általában csak egyetlen információs elemet tartalmaz, például az eszköz nevét, a gyártót, vagy a sorozatszámot. E fájlok mindegyike használható egy kulcs értékeként. Több SYSFS-kulcs egy szabályban azonban csak úgy használható, ha ugyanazon könyvtárban található fájlokat használ kulcsértékekként. Az udevinfo eszköz segít a hasznos kulcsértékek kikeresésében.Keresse ki az érintett eszközre vonatkozó, a /sys könyvtár alatti alkönyvtárat, amely egy dev fájlt tartalmaz. Ezek a könyvtárak mind a /sys/block vagy /sys/class alatt találhatók. Ha az eszközhöz már létezik egy eszközcsomópont, akkor az udevinfo segít a megfelelő alkönyvtár kikeresésében. Az udevinfo -q path -n /dev/sda parancs kimenete a /block/sda. Ez azt jelenti, hogy a keresett könyvtár a /sys/block/sda. Most hívja meg az udevinfo programot az udevinfo -a -p /sys/block/sda paranccsal. A két parancs egyesíthető is, például: udevinfo -a -p `udevinfo -q path -n /dev/sda`. Alább a kimenet egy része látható:
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"
A kimenetben keresse meg a megfelelő, nem változó kulcsokat. Ne feledje, hogy nem használhat kulcsokat különböző könyvtárakból.
Állandó nevek tárolóeszközökhöz
A SUSE LINUX tartalmaz olyan parancsfájlokat, amelyekkel mindig ugyanazok az elnevezések rendelhetők a merevlemezekhez és más tárolóeszközökhöz, függetlenül attól, hogy milyen sorrendben kerültek inicializálásra. Az /sbin/udev.get_persistent_device_name.sh egy összefogó (shell) parancsfájl. Először meghívja az /sbin/udev.get_unique_hardware_path.sh parancsfájlt, amelyik kikeresi egy adott eszköz hardver elérési útját. Az /sbin/udev.get_unique_drive_id.sh lekéri a sorozatszámot. Ezután mindkét kimenet átkerül az udev-hez, amelyik létrehoz egy szimbolikus láncot az eszközcsomópontra a /dev könyvtár alatt. A shell közvetlenül felhasználható az udev-szabályokban.Az alábbi példa egy olyan SCSI-re, amely természetesen USB- és IDE-eszközökre is átírható (egy sorba kell írni az egészet):
BUS="scsi", PROGRAM="/sbin/udev.get_persistent_device_name.sh", NAME="%k", SYMLINK="%c{1+}"
Amint a tárolóeszköz illesztőprogramja betöltődik, bejegyzi az összes rendelkezésre álló merevlemezt a kernelben. Ezek mindegyike elindít egy hotplug blokkeseményt, amely meghívja az udev programot. Ezután az udev kiolvassa a szabályokat, hogy kell-e létrehozni szimbolikus láncot.
Ha az illesztőprogram az initrd-n keresztül töltődött be, akkor a hotplug-esemény elvész. Az összes információ azonban tárolásra kerül a sysfs fájlrendszerben. Az udevstart segédprogram kikeresi az összes eszközfájlt a /sys/block és a /sys/class alatt, majd elindítja az udev programot.Létezik egy boot.udev nevű indító parancsfájl is, amelyik újra létrehozza az összes eszközcsomópontot a rendszerindítási folyamat közben. Az indító parancsfájlt azonban a YaST futásiszint-szerkesztőjével vagy az insserv boot.udev paranccsal aktiválni kell.