Dokumentáció/SL9.3/Rendszer/Dinamikus eszközcsomópontok és az udev

Icon-dinamic.png A 2.6-os Linux-kernel egy új, felhasználói területen működő megoldást vezet be a /dev dinamikus eszközkönyvtárra, állandó eszközmegjelölésekkel: ez pedig az udev. Ez csak a ténylegesen jelen lévő eszközök számára biztosítja a fájlokat. Létrehozza és törli a jellemzően a /dev könyvtárban található eszközcsomópont-fájlokat és átnevezi a hálózati csatolókat. A /dev korábbi, a devfs-re épülő megvalósítása már nem működik, felváltotta 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.

Icon-info.png Ötlet:

Számos eszköz és program támaszkodik arra a tényre, hogy a /dev/sda egy SCSI-merevlemez, a /dev/hda pedig egy IDE-merevlemez. Ha nem ez a helyzet, akkor ezek a programok nem működnek. Mivel a YaST is ezekre az eszközökre támaszkodik, ezért csak a kernel szabályos elnevezéseivel működik együtt.