Ulrich Dangel velmi dobře vysvětluje rozdíl mezi devtmpfs a udev.
A co sysfs?
Chápu, že jádro používá sysfs k exportu uzlů zařízení do uživatelského prostoru, který má používat udev. Takže devtmpfs a sysfs jsou stejné? Pokud ano, proč používají různá jména? Pokud ne, jaký je skutečný rozdíl mezi sysfs a devtmpfs?
Přijatá odpověď:
jádro používá sysfs k exportu uzlů zařízení do uživatelského prostoru, který bude používat udev
Ne. Sysfs neobsahuje uzly zařízení. Sysfs obsahuje hlavně soubory, které poskytují informace o zařízeních, a také některé soubory, které umožňují procesům řídit, jak zařízení fungují. Zařízení však většinou nelze používat prostřednictvím toho, co poskytuje sysfs.
Vezměme si například pevný disk. Někde pod /sys/devices
je pro to adresář , s cestou, která závisí na tom, jak je připojen k počítači (např. /sys/devices/pci0000:00/…
pro disk připojený k řadiči, který je připojen k primární sběrnici PCI počítače). V tomto adresáři můžete najít různé informace, jako je jeho velikost, zda je vyjímatelný, stav napájení atd. Existují také podadresáře pro oddíly. Ale není tam nic, co by umožňovalo přístup k obsahu disku. Jinde v /sys
, jsou zde symbolické odkazy na adresář odpovídající danému disku:v /sys/block
, v /sys/class/block
, atd. Ale stále nic pro přístup k obsahu disku.
V /dev
, záznam pro disk je speciální soubor – blokové zařízení. Tento soubor umožňuje procesům číst a zapisovat obsah disku. (Ačkoli u disku k tomu obvykle nedochází; místo toho je připojen obsah disku – nebo oddílu –, takže jádro přistupuje k zařízení, procesy nikoli.)
Soubory zařízení umožňují provádět některé operace jiné než čtení a zápis obsahu prostřednictvím ioctl. Bylo by možné poskytnout všechny informace a ovládací rozhraní, která poskytuje sysfs prostřednictvím ioctl v souboru zařízení. To by však bylo méně výhodné z několika důvodů:
- Se samostatnými soubory v
/sys
, oprávnění lze nastavit na jemnozrnném základě. S jedním souborem na zařízení v/dev
, je to všechno nebo nic. - Aplikace mohou snadno číst a zapisovat samostatné soubory. Stačí použít
cat
neboecho
. S ioctl je to mnohem těžší:neexistuje žádné rozhraní shellu, často žádné rozhraní v jiných vyšších jazycích. - U ioctl musí být příkaz zakódován do čísla, nikoli do názvu, a formát argumentů musí být definován na binární úrovni. Použití názvů a jednoduchých textových formátů usnadňuje psaní softwaru.
V opačném směru by bylo možné poskytnout přístup k obsahu zařízení prostřednictvím souboru v sysfs. To by ale vyžadovalo další práci v jádře:sysfs je navržen primárně pro obsluhu malých souborů a symbolických odkazů a bez ioctl
podporu, kterou stávající aplikace očekávají. Nemyslím si, že by rozšíření sysfs tak, aby podporovalo stávající typy zařízení, mělo významný přínos, a proto by soubory zařízení nadále existovaly.
Sysfs je automaticky naplněn jádrem, což odráží aktuálně dostupná zařízení v reálném čase. Význam souboru v sysfs vychází z jeho cesty, kterou volí ovladač, který daný soubor poskytuje. /dev
funguje jinak:význam souboru vychází z typu souboru zařízení (blok nebo znak) a jeho hlavních a vedlejších čísel (to je to, co ls -l
seznamy místo velikosti souboru pro zařízení). Tradičně /dev
byl statický, se soubory zařízení vytvořenými během instalace systému; ale to nefunguje tak dobře, když lze zařízení připojit za provozu, proto je potřeba dynamický /dev
který odráží připojená zařízení v reálném čase.
Linux prošel několika iteracemi dynamického /dev
. Linux 2.4 má devfs, kde jádro automaticky vytvořilo položky, které odrážejí připojená zařízení. Ale to nebylo tak hezké, protože to do jádra pevně zakódovalo zásady pro pojmenování zařízení a povolení, takže to bylo nahrazeno uživatelským programem udev pro správu zásad a /dev
na jednoduchém souborovém systému tmpfs (systém souborů v paměti bez zvláštního významu pro jádro). A pak se devfs částečně vrátilo s devtmpfs, což je instance tmpfs, kde položky pro dostupná zařízení automaticky vytváří jádro, ale udev navíc dělá veškerou správu, kterou chce.