Téměř všechny soubory pod /dev
jsou soubory zařízení. Zatímco čtení a zápis do běžného souboru ukládá data na disk nebo jiný souborový systém, přístup k souboru zařízení komunikuje s ovladačem v jádře, který obecně zase komunikuje s částí hardwaru (hardwarové zařízení, odtud název).
Existují dva typy souborů zařízení:bloková zařízení (označeno b
jako první znak ve výstupu ls -l
) a znaková zařízení (označená c
). Rozdíl mezi blokovými a znakovými zařízeními není zcela univerzální. Bloková zařízení jsou věci jako disky, které se chovají jako velké soubory s pevnou velikostí:pokud zapíšete bajt s určitým posunem a později ze zařízení s tímto posunem načtete, dostanete tento bajt zpět. Znaková zařízení jsou téměř cokoli jiného, kde zápis bajtu má nějaký okamžitý účinek (např. je vysílán na sériové lince) a čtení bajtu má také nějaký okamžitý účinek (např. je čten ze sériového portu).
Význam souboru zařízení je určen jeho číslem, nikoli názvem (na názvu záleží na aplikacích, ale ne na jádře). Číslo jsou ve skutečnosti dvě čísla:hlavní číslo označuje, který řidič je za toto zařízení zodpovědný, a vedlejší číslo umožňuje řidiči řídit několik zařízení¹. Tato čísla se objeví v ls -l
výpis, kde byste normálně našli velikost souboru. Např. brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ toto zařízení je hlavní 8, vedlejší 0.
Některé soubory zařízení pod /dev
neodpovídají hardwarovým zařízením. Jeden, který existuje na každém unixovém systému, je /dev/null
; zápis do něj nemá žádný vliv a čtení z něj nikdy nevrací žádná data. Často se to hodí ve skriptech shellu, když chcete ignorovat výstup z příkazu (>/dev/null
) nebo spusťte příkaz bez vstupu (</dev/null
). Další běžné příklady jsou /dev/zero
(což vrací null bajty ad infinitum ) /dev/urandom
(což vrací náhodné bajty ad infinitum ).
Několik souborů zařízení má význam, který závisí na procesu, který k nim přistupuje. Například /dev/stdin
označuje standardní vstup aktuálního procesu; otevření z má přibližně stejný účinek jako otevření původního souboru, který byl otevřen jako standardní vstup procesu. Trochu podobně, /dev/tty
označuje terminál, ke kterému je proces připojen. Pod Linuxem je dnes /dev/stdin
a přátelé nejsou implementováni jako znaková zařízení, ale místo toho jako symbolické odkazy na obecnější mechanismus, který umožňuje odkazovat na každý deskriptor souboru (na rozdíl od pouze 0, 1 a 2 podle tradiční metody); například /dev/stdin
je symbolický odkaz na /proc/self/fd/0
. Viz Jak souvisí /dev/fd s /proc/self/fd/?.
Pod /dev
najdete řadu symbolických odkazů . K tomu může dojít z historických důvodů:soubor zařízení byl přesunut z jednoho názvu na druhý, ale některé aplikace stále používají starý název. Například /dev/scd0
je symbolický odkaz na /dev/sr0
pod Linuxem; oba označují první CD zařízení. Dalším důvodem pro symbolické odkazy je organizace:pod Linuxem najdete své pevné disky a oddíly na několika místech:/dev/sda
a /dev/sda1
a přátelé (každý disk označen libovolným písmenem a oddíly podle rozložení oddílů), /dev/disk/by-id/*
(disky označené jedinečným sériovým číslem), /dev/disk/by-label/*
(oddíly se souborovým systémem, označené štítkem zvoleným člověkem); a více. Symbolické odkazy se také používají, pokud by obecný název zařízení mohl být jedním z několika; například /dev/dvd
může být symbolický odkaz na /dev/sr0
, nebo to může být odkaz na /dev/sr1
pokud máte dvě čtečky CD a druhá má být výchozí čtečkou DVD.
Nakonec je zde několik dalších souborů, které můžete najít pod /dev
z tradičních důvodů. Na každém systému nenajdete to samé. Na většině UNIC, /dev/log
je soket, který programy používají k odesílání zpráv protokolu. /dev/MAKEDEV
je skript, který vytváří položky v /dev
. Na moderních systémech Linux položky v /dev/
jsou vytvářeny automaticky udev, zastaralé MAKEDEV
.
¹ V Linuxu to již ve skutečnosti neplatí, ale na tomto detailu záleží pouze autorům ovladačů zařízení.
- Ano – buď přímo, nebo jako symbolické odkazy – to je to, co
/dev/
je pro. - Pro různé účely:někdy kvůli kompatibilitě mezi schématy pojmenování, někdy je to nutné pro pracovní prostředí – jako v příkladu
/dev/stdin
. To není bod staticky na/dev/pts/2
nebo jakýkoli jiný - stačí přepnout na jiný terminál a uvidíš./dev/stdin
je standardní vstup vašeho aktuálního terminálová relace. To je také příklad, proč to musí být symbolický odkaz. - Viz
man mknod
ainfo coreutils 'mknod invocation'
. Obecněc
znamená typ zařízení se znakem.
Pro vaši první otázku to nejsou deskriptory souborů, jsou to soubory zařízení. (také znám jako „dev nodes“)
Tyto soubory jsou svázány s ovladačem, který obsluhuje zařízení pomocí hlavních a vedlejších čísel. (Například „136, 2“ ve vašem ls
výstup odkazuje na ovladač zařízení vázaný na hlavní číslo 136 a určuje zařízení č. 2 obsluhované tímto ovladačem.)
První písmeno výstupu ls -l
je typ zařízení v případě souborů zařízení. Pokud je 'c', jedná se o znakové zařízení, nebo pokud je 'b', jedná se o blokové zařízení.
Pro vaši druhou otázku viz výše uvedená odpověď od rozcietrzewiacz.