Soubor jsou (zhruba) tři samostatné věci:
- "inode", struktura metadat, která sleduje, kdo vlastní soubor, oprávnění a seznam bloků na disku, které skutečně obsahují data.
- Jedna nebo více položek adresáře (názvů souborů), které ukazují na tento inode
- Samotné bloky dat
Když vytvoříte prázdný soubor, vytvoříte pouze inode a položku adresáře ukazující na tento inode. Totéž pro řídké soubory (dd if=/dev/null of=sparse_file bs=10M seek=1
).
Když vytvoříte pevné odkazy na existující soubor, vytvoříte pouze další položky adresáře, které ukazují na stejný inode.
Zde jsem věci zjednodušil, ale chápete.
touch
vytvoří inode a ls -i
nebo stat
zobrazí informace o inodu:
$ touch test
$ ls -i test
28971114 test
$ stat test
File: ‘test’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fc01h/64513d Inode: 28971114 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/1000) Gid: ( 1000/1000)
Access: 2017-03-28 17:38:07.221131925 +0200
Modify: 2017-03-28 17:38:07.221131925 +0200
Change: 2017-03-28 17:38:07.221131925 +0200
Birth: -
Všimněte si, že test
používá 0 bloků. K uložení zobrazených dat používá inode několik bajtů. Tyto bajty jsou uloženy v tabulce inodů. Podívejte se na stránku ext2, kde najdete příklad struktury inodů.
ls
(nebo dobře, stat(2)
systémové volání) vám sdělí velikost obsahu souboru. To, kolik místa souborový systém potřebuje pro vedení účetnictví, není součástí a jako detail implementace to není něco, co by programy obecně měly starat se nebo o tom dokonce vědět. Zviditelnění detailů implementace by snížilo užitečnost abstrakce souborového systému.