Je to vlastně docela jednoduché, alespoň pokud nepotřebujete detaily implementace.
Za prvé, na Linuxu jsou všechny souborové systémy (ext2, ext3, btrfs, reiserfs, tmpfs, zfs, ...) implementovány v jádře. Některé mohou přesunout práci do uživatelského kódu pomocí FUSE a některé přicházejí pouze ve formě modulu jádra (nativní ZFS je pozoruhodným příkladem druhého z důvodu licenčních omezení), ale v každém případě zůstává komponenta jádra. Toto je důležitý základ.
Když chce program číst ze souboru, vydá různá volání systémových knihoven, která nakonec skončí v jádře ve formě open()
, read()
, close()
sekvence (možná s seek()
vhozený pro dobrou míru). Jádro převezme zadanou cestu a název souboru a prostřednictvím I/O vrstvy systému souborů a zařízení je převede na fyzické požadavky na čtení (a v mnoha případech také požadavky na zápis – například aktualizace atime) do nějakého základního úložiště.
Nemusí však tyto požadavky překládat konkrétně na fyzické, trvalé úložiště . Smlouva jádra je taková, že vydání této konkrétní sady systémových volání poskytne obsah příslušného souboru . Kde přesně v naší fyzické říši "soubor" existuje, je vedlejší.
Na /proc
je obvykle připojen, což je známé jako procfs
. Jedná se o speciální typ souborového systému, ale jelikož se jedná o souborový systém, ve skutečnosti se neliší od např. ext3
někde připojený souborový systém. Požadavek je tedy předán kódu ovladače souborového systému procfs, který ví o všech těchto souborech a adresářích a vrací konkrétní informace z datových struktur jádra .
"Úložnou vrstvou" jsou v tomto případě datové struktury jádra a procfs
poskytuje čisté a pohodlné rozhraní pro přístup k nim. Mějte na paměti, že montáž procfs na /proc
je prostě konvence; stejně snadno jej můžete namontovat jinam. Ve skutečnosti se to někdy dělá, například v chroot jailech, když tam běžící proces potřebuje z nějakého důvodu přístup k /proc.
Funguje to stejně, pokud zapíšete hodnotu do nějakého souboru; na úrovni jádra to znamená řadu open()
, seek()
, write()
, close()
volání, která jsou opět předána ovladači souborového systému; opět v tomto konkrétním případě kód procfs.
Konkrétní důvod, proč vidíte file
vrací empty
je, že mnoho souborů vystavených pomocí procfs je vystaveno velikosti 0 bajtů. Velikost 0 bajtů je pravděpodobně optimalizací na straně jádra (mnoho souborů v /proc je dynamických a může se snadno lišit v délce, možná i od jednoho čtení k druhému, a výpočet délky každého souboru v každém načteném adresáři by může být velmi drahé). V komentářích k této odpovědi, kterou můžete ověřit na svém vlastním systému spuštěním strace nebo podobného nástroje, file
nejprve vydá stat()
volání pro detekci jakýchkoli speciálních souborů a poté využije příležitosti k tomu, pokud je velikost souboru hlášena jako 0, přerušit a nahlásit soubor jako prázdný.
Toto chování je skutečně zdokumentováno a lze jej přepsat zadáním -s
nebo --special-files
na file
vyvolání, i když jak je uvedeno v manuálové stránce, může to mít vedlejší účinky. Níže uvedená citace pochází z manuálové stránky souboru BSD 5.11 ze dne 17. října 2011.
Normálně se soubor pouze pokouší číst a určit typ souborů argumentů, které stat(2) hlásí jako běžné soubory. Tím se zabrání problémům, protože čtení speciálních souborů může mít zvláštní důsledky. Zadání
-s
volba způsobí, že soubor bude číst také soubory argumentů, což jsou blokové nebo znakové speciální soubory. To je užitečné pro určení typů souborových systémů dat v nezpracovaných diskových oddílech, což jsou speciální blokové soubory. Tato možnost také způsobí, že soubor nebude brát ohled na velikost souboru, kterou uvádí stat(2) protože na některých systémech hlásí nulovou velikost nezpracovaných diskových oddílů.
V tomto adresáři můžete ovládat, jak jádro zobrazuje zařízení, upravovat nastavení jádra, přidávat zařízení do jádra a znovu je odebírat. V tomto adresáři můžete přímo zobrazit využití paměti a statistiky I/O.
Můžete vidět, které disky jsou připojeny a jaké systémy souborů se používají. Stručně řečeno, každý jednotlivý aspekt vašeho systému Linux lze prozkoumat z tohoto adresáře, pokud víte, co hledat.
/proc
adresář není normální adresář. Pokud byste zavedli systém ze spouštěcího CD a podívali se na tento adresář na pevném disku, viděli byste jej jako prázdný. Když se na to podíváte pod svým normálním běžícím systémem, může být docela velký. Zdá se však, že nevyužívá žádné místo na pevném disku. Je to proto, že se jedná o virtuální souborový systém.
Od /proc
souborový systém je virtuální souborový systém a je umístěn v paměti, nový /proc
souborový systém se vytvoří pokaždé, když se váš počítač se systémem Linux restartuje.
Jinými slovy, je to jen prostředek, jak snadno nakouknout do vnitřností linuxového systému prostřednictvím rozhraní typu souborů a adresářů. Když se podíváte na soubor v /proc
adresář, díváte se přímo na rozsah paměti v jádře Linuxu a vidíte, co může vidět.
Vrstvy v systému souborů
Příklady:
- Uvnitř
/proc
, existuje adresář pro každý běžící proces pojmenovaný jeho ID procesu. Tyto adresáře obsahují soubory, které obsahují užitečné informace o procesech, jako například:exe
:což je symbolický odkaz na soubor na disku, ze kterého byl proces spuštěn.cwd
:což je symbolický odkaz na pracovní adresář procesu.wchan
:který po přečtení vrátí čekající kanál, na kterém je proces zapnutý.maps
:který při čtení vrací paměťové mapy procesu.
/proc/uptime
vrátí dobu provozuschopnosti jako dvě desetinné hodnoty v sekundách oddělené mezerou:- množství času od spuštění jádra.
- dobu, po kterou bylo jádro nečinné.
/proc/interrupts
:Informace týkající se přerušení./proc/modules
:Seznam modulů.
Pro podrobnější informace navštivte man proc nebo kernel.org.
Máte pravdu, nejsou to skutečné soubory.
Zjednodušeně řečeno, je to způsob, jak mluvit s jádrem pomocí normálních metod čtení a zápisu souborů, namísto přímého volání jádra. Je to v souladu s filozofií Unixu „všechno je soubor“.
Soubory v /proc
fyzicky nikde neexistují, ale jádro reaguje na soubory, které tam čtete a zapisujete, a místo zápisu do úložiště hlásí informace nebo něco dělá.
Podobně soubory v /dev
nejsou ve skutečnosti soubory v tradičním slova smyslu (ačkoli na některých systémech jsou soubory v /dev
mohou skutečně existovat na disku, nebudou toho mít moc kromě toho, na jaké zařízení odkazují) - umožňují vám mluvit se zařízením pomocí normálního unixového souboru I/O API - nebo čehokoli, co jej používá, jako shell