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.