Gentoo Logo

Upozornění : Tento dokument již neplatí a není udržován.


Průvodce devfs

Obsah:

1.  Co je devfs?

Staré (dobré?) časy

Varování: devfs je překonaný a byl ze stabilní větve 2.6 ve verzi 2.6.13 odstraněn. Uživatelům používajícím jádra 2.6 je tímto doporučeno, aby přešli na udev. Pro další informace o udev si prosím přečtěte Gentoo průvodce udev.

Tradiční implementace Linuxu poskytují svým uživatelům abstraktní adresář zařízení nazývaný /dev. Uvnitř tohoto adresáře může uživatel nalézt soubory zařízení (device nodes), speciální soubory, které reprezentují různá zařízení uvnitř systému, například /dev/hda představující první IDE zařízení. Tento přístup umožňuje uživatelům vytvářet programy, které pracují s hardwarem tak, jako by to byl běžný soubor, místo aby museli využívat speciální API.

Soubory zařízení jsou rozděleny do dvou skupin, na znaková a bloková. První skupinu tvoří zařízení, na nichž nejsou čtení ani zápis bufferovány, kde se nepoužívá vyrovnávací paměť. Druhá skupina je přirozeně tvořena hardwarem, jehož čtení a zápis bufferovány jsou. Z obou typů zařízení může čtení probíhat po znacích nebo blocích. Označení může tedy znít zmateně a, popravdě řečeno, je nesprávné.

Podíváte-li se na určitý soubor zařízení, můžete vidět něco takového:

Výpis kódu 1.1: Zobrazení informací o souboru zařízení

# ls -l /dev/hda
brw-rw----    1 root     disk       3,   0 Jul  5  2000 /dev/hda

V předchozím příkladu jsme viděli, že /dev/hda je blokové zařízení. Důležitější však je, že má přiřazena dvě čísla: 3, 0. Tento pár čísel je nazýván major-minor pár, hlavní a vedlejší číslo. Je využíván kernelem k mapování souboru zařízení na skutečný hardware. Major odpovídá určitému zařízení, minor jeho části nebo dílčímu celku. Vypadá to nejasně? Není.

Jako příklad můžeme uvést /dev/hda4 nebo /dev/tty5. První soubor zařízení odpovídá čtvrtému oddílu na prvním IDE zařízení. Jeho major-minor pár je 3, 4. Jinými slovy, minor odpovídá oddílu, zatímco major odpovídá zařízení. Druhý příklad má major-minor pár 4, 5. V tomto případě major odpovídá ovladači terminálu a minor číslu terminálu (zde pátého).

Problémy

Pokud si takový /dev zběžně prohlédnete, zjistíte, že v něm nejsou uvedena pouze vaše zařízení, nýbrž všechna možná, která si lze představit. Jinak řečeno, máte soubory i pro zařízení, která nemáte. Správa takovéto skupiny zařízení je přinejmenším nešikovná. Představte si například, že potřebujete změnit přístupová práva u všech souborů, ke kterým existuje ve vašem systému odpovídající zařízení, a ostatní ponechat beze změny.

Když do svého systému přidáte nový hardware, pro který dosud nemáte soubor zařízení, budete si takový soubor muset vytvořit. Zkušení uživatelé vědí, že je to možné provést pomocí ./MAKEDEV uvnitř stromu /dev, ale víte okamžitě, jaký soubor zařízení přesně vytvořit?

Máte-li programy pracující s hardwarem přes soubory zařízení, nemůžete mít root oddíl připojený pouze pro čtení, přestože není žádný jiný důvod mít jej připojený i pro zápis. Zároveň nelze mít /dev umístěný na samostatném oddílu, protože mount potřebuje /dev k připojování oddílů.

Řešení

Jak si dovedete představit, "kerneloví" hackeři vymysleli nejedno řešení těchto problémů. Mnoho z nich má však jiné trhliny, jak je uvedeno v http://www.atnf.csiro.au/people/rgooch/linux/docs/devfs.html#faq-why. My zde nebudeme hovořit o všech těchto implementacích, ale zaměříme se na jednu, která pronikla do oficiálních zdrojových kódů jádra: devfs.

devfs jako absolutní vítěz?

devfs řeší všechny zmíněné problémy. Poskytuje uživateli pouze existující zařízení, přidává soubory, jakmile jsou nová zařízení nalezena a umožňuje připojit kořenový souborový systém jen pro čtení. Řeší i mnoho dalších problémů, které zde nejsou uvedeny, protože jsou pro uživatele méně zajímavé.

Například se s devfs nemusíte trápit s major-minor páry. Jsou sice stále podporovány kvůli zpětné kompatibilitě, ale nejsou zapotřebí. To Linuxu umožňuje podporovat ještě více zařízení, jelikož teď už neexistují žádné limity (čísla mají vždy své meze :).

Jenže devfs přichází se svými vlastními problémy, které sice nejsou pro koncové uživatele příliš viditelné, ale pro vývojáře kernelu jsou natolik závažné, aby devfs označili za obsolete (zastaralý a překonaný) podporou udev, který Gentoo podporuje a používá jako výchozí na většině architektur od verze 2005.0 s jádrem řady 2.6.

Více o tom, proč je devfs označen jako obsolete, se dozvíte v udev FAQ a udev versus devfs.

2.  Orientace ve stromu zařízení

Adresáře

Jedna z prvních věcí, kterých si můžete všimnout, je, že devfs používá k seskupování zařízení adresáře, což zlepšuje čitelnost.

Například všechna zařízení související s IDE naleznete v adresáři /dev/ide/ a SCSI zařízení v /dev/scsi/. SCSI a IDE disky jsou zobrazeny stejným způsobem, tedy obojí mají stejnou strukturu podadresářů.

IDE a SCSI disky jsou řízeny adaptérem (integrovaným nebo samostatnou kartou), nazývaným host. Každý adaptér má několik kanálů. Kanálu se říká bus (sběrnice). Na každém kanálu můžete být několik ID. Takové ID identifikuje disk a říká se mu target (cíl). Některá SCSI zařízení mají více tzv. LUN (Logical Unit Numbers), například zařízení obsluhující najednou několik médií (rychlé hi-end páskové jednotky). Většina zařízení má většinou jeden LUN, lun0/.

Takže, tam kde byl předtím /dev/hda4, máme nyní /dev/ide/host0/bus0/target0/lun0/part4. To je mnohem jednodušší... ne, nehádejte se se mnou... to je jednodušší... a basta! :)

Poznámka: Můžete také použít unixovatější označení souborů zařízení, jako třeba c0b0t0u0p2. Tyto jsou k nalezení v /dev/ide/hd, /dev/scsi/hd atd.

Pro představu, toto je výpis adresářů z mého notebooku:

Výpis kódu 2.1: Adresáře uvnitř /dev

cdroms/     cpu/        discs/          floppy/
ide/        input/      loop/           misc/
netlink/    printers/   pts/            pty/
scsi/       sg/         shm/            sound/
sr/         usb/        vc/             vcc/

Zpětná kompatibilita při používání devfs

Používání tohoto nového způsobu značení zní pěkně, ale některé nástroje a programy používají předchozí, starý způsob. Pro zajištění funkčnosti systému je k dispozici devfsd. Tento démon vytváří symbolické linky se starými názvy ukazující na nové soubory zařízení.

Výpis kódu 2.2: Vytvořené symbolické odkazy

$ ls -l /dev/hda4
lr-xr-xr-x    1 root     root           33 Aug 25 12:08 /dev/hda4 -> ide/host0/bus0/target0/lun0/part4

devfsd můžete také nastavit přístupová práva, vytvářet nové soubory zařízení, definovat akce a podobně. To vše je popsáno v následující kapitole.

3.  Správa stromu zařízení

Restart devfsd

Pokud změníte soubor /etc/devfsd.conf a chcete, aby se změny ihned promítly do systému, nemusíte restartovat. V závislosti na tom, co chcete, můžete použít následující signály:

SIGHUP přiměje devfsd znovu načíst konfigurační soubor, načíst sdílené objekty a vygenerovat události REGISTER pro každý listový uzel stromu zařízení.

SIGUSR1 udělá totéž, avšak bez generování událostí REGISTER.

K zaslání signálu použijte kill nebo killall:

Výpis kódu 3.1: Zaslání signálu SIGHUP devfsd

# kill -s SIGHUP `pidof devfsd`
nebo
# killall -s SIGHUP devfsd

Odstranění zpětně kompatibilních symbolických linků

Varování: V současné době Gentoo nemůže bez těchto linků fungovat.

Jestliže chcete zpětně kompatibilní linky znečisťující /dev odstranit ze svého Gentoo (Gentoo je implicitně aktivuje), otevřete soubor /etc/devfsd.conf a odstraňte z něj následující řádky:

Výpis kódu 3.2: /etc/devfsd.conf pro zpětnou kompatibilitu

# Zakomentujte následující dva řádky pro odstranění symbolických odkazů
REGISTER        .*  MKOLDCOMPAT
UNREGISTER      .*  RMOLDCOMPAT

Aby se změny projevily, musíte restartovat (počítač :-) ).

Zakázání funkce autoload

Jestliže zavedete modul, devfs automaticky vytvoří soubory zařízení. Pokud Vám toto chování nevyhovuje, odstraňte následující řádek z /etc/devfsd.conf:

Výpis kódu 3.3: /etc/devfsd.conf, funkce autoload

LOOKUP      .*  MODLOAD

4.  Položky vztahující se k přístupovým právům

Nastavení/změna přístupových práv pomocí devfsd

Poznámka: Tyto instrukce platí, pokud je v souboru /etc/pam.d/system-auth zakázána pam_console. Pokud ji povolíte, má poslední slovo ve věcech přístupových práv PAM.

Chcete-li nastavit přístupová práva pomocí /etc/devfsd.conf, použijte syntaxi z následujícího příkladu:

Výpis kódu 4.1: Přístupová práva v /etc/devfsd.conf

REGISTER    ^cdroms/.*  PERMISSIONS root.cdrom 0660

Druhé pole je skupina zařízení, začínající z /dev. Jde o regulární výraz, takže můžete jedním pravidlem vybrat několik souborů zařízení.

Čtvrté pole určuje vlastnictví souboru a páté obsahuje přístupová práva.

Jak manuálně nastavit přístupová práva a nechat je devfsd uložit

Výchozí chování Gentoo je toto: provedete-li chown (změnu vlastníka) nebo chmod (změnu práv) u některého ze souborů zařízení, devfsd tyto změny uloží, takže zůstanou platné i po restartu. To díky tomu, že soubor /etc/devfsd.conf obsahuje následující řádky:

Výpis kódu 4.2: /etc/devfsd.conf pro ukládání přístupových práv

REGISTER        ^pt[sy]/.*   IGNORE
CHANGE          ^pt[sy]/.*   IGNORE
CREATE          ^pt[sy]/.*   IGNORE
DELETE          ^pt[sy]      IGNORE
REGISTER        ^log         IGNORE
CHANGE          ^log         IGNORE
CREATE          ^log         IGNORE
DELETE          ^log         IGNORE
REGISTER        .*           COPY    /lib/dev-state/$devname $devpath
CHANGE          .*           COPY    $devpath /lib/dev-state/$devname
CREATE          .*           COPY    $devpath /lib/dev-state/$devname
DELETE          .*           CFUNCTION GLOBAL unlink
/lib/dev-state/$devname
RESTORE         /lib/dev-state

Jinak řečeno, změněné soubory zařízení jsou, jakmile ke změně dojde, překopírovány do /lib/dev-state odkud jsou při každém restartu kopírovány zpět do /dev.

Jinou možností je připojit /lib/dev-state do /dev při startu systému. Aby to bylo možné, musíte se ujistit, že devfs není připojován automaticky (to znamená, že budete možná muset přeložit jádro) a že existuje /dev/console. Potom někam na začátek startovacích skriptů vložte následující:

Výpis kódu 4.3: Připojení /lib/dev-state do /dev

mount --bind /dev /lib/dev-state
mount -t devfs none /dev
devfsd /dev

5.  Další zdroje

Chcete-li se o devfs dozvědět více, prohlédněte si následující zdroje.

Manuálová stránka devfsd.conf vysvětluje syntaxi souboru /etc/devfsd.conf. Pro její zobrazení spusťte příkaz man devfsd.conf.

devfs často kladené otázky vysvětlí "všechno", co se týká devfs. Obsahuje také popis vnitřní struktury devfs a způsobů, jak podporovat devfs v ovladačích.

Na LinuxJournal je zajímavý článek o devfs pro řízení a správu.

Daniel Robbins napsal soubor článků pro IBM's DeveloperWorks o vyspělých souborových systémech. Tři z nich jsou o devfs:



Tisk

Aktualizace: 21. červenec 2005

Původní verze tohoto dokumentu již není udržována

Shrnutí: V tomto dokumentu naleznete informace o tom, co je vlastně devfs a jak s ním pracovat.

Sven Vermeulen
Autor

Seemant Kulleen
Korektor

Václav Kocián
Překladatel

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.