Jak na vlastní názvy zařízení pro udev 

S pokračujícím vývojem jádra se nejprve objevil udev, pak se devfs označil jako DEPRECATED a nakonec zbyl pouze udev. Můžeme s tím nesouhlasit, můžeme proti tomu bojovat, ale to je tak všechno, co proti tomu můžeme dělat :-).

O čem to vlastně mluvím? Přece o správcích dynamického adresáře dev, který obsahuje speciální soubory pro každé zařízení, co v počítači existuje. A když už mne kernel donutil nainstalovat udev, proč ho nepoužít na transparentní pojmenovávání externích zařízení, co k počítači připojuji. Ono totiž v oblasti disků platí v linuxu pravidlo, že všechno, co není IDE, je SCSI. Takže jméno sd[a-z] si rozdělují jak SATA disky, tak USB disky, tak opravdové SCSI disky. Jěště k tomu je rozdělovací klíč pouze podle toho, kdo dřív, což je dost nepraktické a může to vést k fatálním omylům (Například chci naformátovat flashdisk, co se jmenuje sda1, a on to ve skutečnosti bude můj nový SATA disk :-( )

Přitom udev nabízí mnoho úrovní rozlišování názvů, například podle sběrnice, nebo třeba podle konkrétního ID zařízení. O tom chci pravě mluvit. Připojím tedy zařízení, třeba svůj Mp3 přehrávač. Systém mu přidělí jméno sda. Pomocí programu udevinfo zjistím, podle čeho by se dal přehrávač najít:

# udevinfo -q env -n /dev/sda
ID_VENDOR=iriver
ID_MODEL=MassStorage_Disc
ID_REVISION=0001
ID_SERIAL=iriver_MassStorage_Disc
ID_TYPE=disk
ID_BUS=usb
ID_PATH=pci-0000:00:1d.0-usb-0:2:1.0-scsi-0:0:0:0

Je vidět, přehrávač se dá zjistit třeba pomocí ID_VENDOR. Takže do /etc/udev/rules.d/01-local.rules napíšu

BUS=="usb", KERNEL=="sd*", ENV{ID_VENDOR}=="iriver", NAME="iriver%n"
a čekám, že po novém připojení už se bude jmenovat /dev/iriver. Není tomu tak. Proč? Ono totiž ty proměnné prostředí, podle kterých se dá zjistit, co je to za zařízení, se načítaji jiným příkazem až v souboru /etc/udev/rules.d/50-udev.rules, takže v době, kdy se vyhodnocuje výše uvedené pravidlo ještě není prostředí nastaveno. Je potřeba teda před daný řádek s pravidlem okopírovat pravidlo pro načtení proměnných prostření z uvedeného souboru. Celý soubor /etc/udev/rules.d/01-local.rules musí tedy vypadat takto:

BUS=="usb", KERNEL=="sd*", ENV{ID_SERIAL}=="", IMPORT="usb_id -x"
BUS=="usb", KERNEL=="sd*[0-9]", IMPORT{parent}=="ID_*"
BUS=="usb", KERNEL=="sd*", ENV{ID_VENDOR}=="iriver", NAME="iriver%n"
EDIT> Zjistil jsem, že uvedená pravidla se načítají také v souboru 01-early.rules, takže stačí svůj lokální soubor s pravidly pouze správně pojmenovat 10-local.rules a funguje to taky.

Komentáře

Pro tento záznam nejsou komentáře povoleny.