TakéFilesystem, FS, Systém souborůPokročilý

Definice

Souborový systém je způsob organizace dat na úložišti, který převádí očíslované bloky disku na pojmenované soubory a adresáře. Určuje, jak se ukládá obsah, metadata (velikost, práva, časy) i volné místo, a jak se stav udrží konzistentní při výpadku napájení. Příkladem jsou ext4, NTFS, APFS, XFS nebo ZFS.

Kategorie: Počítačová architekturaAktualizováno

Než se na to spolehnete: Wikidata Q174989 pro „file system“ jsem uvedl z paměti, doporučuji ověřit; ostatní odkazy jsou kanonické kořeny dokumentace.

<h2>Od bloků k jménům</h2> <p>Disk ani SSD nezná pojem „soubor“. Nabízí jen pole očíslovaných bloků, typicky po 512 nebo 4096 bajtech, které umí přečíst a přepsat. Souborový systém je vrstva, která nad tímto polem postaví stromovou strukturu adresářů a jmen, eviduje, které bloky patří kterému souboru, a které jsou volné. Bez ní by aplikace musela znát fyzické adresy svých dat, což by znemožnilo, aby na jednom disku koexistovalo víc programů.</p> <h2>Co všechno souborový systém eviduje</h2> <p>Kromě obsahu drží souborový systém metadata. V unixových systémech je nese struktura zvaná inode: velikost, vlastník, skupina, přístupová práva, časová razítka a seznam datových bloků. Jméno souboru přitom v inode není, jméno je záznam v adresáři, který na inode odkazuje. Právě proto může jeden soubor mít víc jmen (pevné odkazy) a proto smazání jména neznamená okamžité smazání dat: obsah zmizí, až klesne počet odkazů na nulu a soubor nemá otevřený žádný proces.</p> <h2>Proč je pád napájení tvrdý test</h2> <p>Zápis souboru není jedna operace, ale několik: alokace bloků, zápis dat, aktualizace inode, změna adresáře. Když počítač spadne mezi nimi, vznikne nekonzistence, například blok označený za obsazený, který nikomu nepatří. Moderní souborové systémy to řeší žurnálem: zamýšlenou změnu nejdřív popíší do vyhrazené oblasti a teprve pak ji provedou. Po restartu stačí žurnál přehrát místo hodinové kontroly celého svazku. Jiná rodina, například ZFS nebo Btrfs, používá copy-on-write: nová data se zapíší jinam a atomicky se přepne ukazatel, což zároveň umožňuje levné snímky (snapshoty).</p> <p>Pozor na jeden důsledek: žurnál obvykle chrání metadata, ne nutně obsah vašich dat. Aplikace, které si na trvanlivosti zakládají (databáze, <a href="/slovnik/git">Git</a>), proto explicitně volají <code>fsync()</code> a vynutí si vyprázdnění cache.</p> <h2>Čím se konkrétní souborové systémy liší</h2> <ul> <li><strong>ext4</strong>: výchozí volba na Linuxu, žurnálovaný, konzervativní a rychlý.</li> <li><strong>XFS</strong>: dobře škáluje na velké soubory a paralelní zápis, běžný na serverech.</li> <li><strong>NTFS</strong>: standard Windows, ACL práva, alternativní datové proudy.</li> <li><strong>APFS</strong>: systém Applu optimalizovaný pro SSD, klony souborů a šifrování.</li> <li><strong>ZFS, Btrfs</strong>: kontrolní součty dat, snímky, správa svazků v jedné vrstvě.</li> <li><strong>FAT32, exFAT</strong>: jednoduché a všude čitelné, bez žurnálu a bez práv.</li> </ul> <h2>Kde se s tím potká vývojář</h2> <p>Volba souborového systému není jen otázka administrátora. Rozlišování velkých a malých písmen se liší (macOS bývá case-insensitive, Linux ne), a projekt, který se buildí na notebooku, tak může na CI spadnout kvůli <code>import './Button'</code> versus <code>button.tsx</code>. Vrstvený souborový systém v <a href="/slovnik/docker">Dockeru</a> zase mění chování zápisů uvnitř <a href="/slovnik/kontejner">kontejneru</a>. A limit počtu inode dokáže zaplnit disk i ve chvíli, kdy je volných gigabajtů dost, stačí milion drobných souborů v cache.</p>

Příklady z praxe

  1. Disk je plný, i když místo zbývá

    Server s cache tisíců drobných souborů začne hlásit „No space left on device“, přestože df ukazuje volných 40 GB. Příčinou je vyčerpání inode: každý soubor spotřebuje jeden bez ohledu na velikost. Počet inode se u ext4 určuje při formátování a později se nedá zvětšit, řešením je smazání drobných souborů nebo nové formátování s hustším poměrem.

    $ df -h /var
    Filesystem  Size  Used Avail Use% Mounted on
    /dev/sda2   100G   58G   40G  60% /var
    
    $ df -i /var
    Filesystem  Inodes  IUsed IFree IUse% Mounted on
    /dev/sda2   6553600 6553600     0  100% /var
  2. Rozdílná citlivost na velikost písmen mezi macOS a CI

    Vývojář na macOS s APFS importuje komponentu jako './components/Button', ačkoli soubor se jmenuje button.tsx. Lokálně build projde, protože výchozí svazek nerozlišuje velikost písmen. Na Linuxovém běhounu v CI, kde je ext4, stejný build spadne s chybou „Module not found“. Kontrola jmen souborů v lintu takové chyby odhalí dřív než pipeline.

Časté omyly

MýtusSmazaný soubor je pryč, přepsat disk už netřeba.
Ve skutečnostiSmazání typicky odstraní jen odkaz v adresáři a označí bloky jako volné, obsah zůstává na médiu, dokud ho něco nepřepíše. Pro skutečné odstranění dat slouží šifrování celého svazku nebo hardwarové vymazání (secure erase) u SSD.
MýtusFormátování a rozdělení disku na oddíly je totéž.
Ve skutečnostiRozdělení na oddíly jen rozkrájí médium na části a zapíše tabulku oddílů (MBR nebo GPT). Souborový systém vzniká až formátováním konkrétního oddílu, takže na jednom disku může být několik oddílů s různými souborovými systémy.
MýtusŽurnál zaručí, že po pádu neztratím žádná data.
Ve skutečnostiŽurnál ve výchozím režimu chrání hlavně konzistenci metadat, aby po restartu nebyl svazek poškozený. Data zapsaná do cache stránek, která ještě nedosedla na disk, se ztratit mohou, pokud si aplikace nevyžádá fsync.

Časté dotazy

Jaký souborový systém zvolit pro Linuxový server?
Souborový systém pro běžný Linuxový server bývá ext4: je léta odladěný, žurnálovaný a nepřekvapí. XFS dává smysl tam, kde jde o velké soubory a hodně souběžných zápisů, proto ho volí některé serverové distribuce jako výchozí. ZFS nebo Btrfs zvažte, když potřebujete kontrolní součty dat, snímky a správu diskových polí v jedné vrstvě, počítejte ale s vyšší spotřebou paměti a složitější správou. Pro přenosný disk sdílený mezi Windows a macOS zůstává praktickou volbou exFAT.
Co je to připojení (mount) souborového systému?
Připojení souborového systému znamená napojení konkrétního svazku do stromu adresářů operačního systému, například oddílu /dev/sdb1 do adresáře /mnt/data. Unixové systémy nemají písmena disků: všechny svazky tvoří jediný strom začínající kořenem. Při připojení se volí i parametry, jako je jen pro čtení, chování časových razítek nebo režim žurnálu. Trvalá připojení se na Linuxu popisují v souboru /etc/fstab, moderní systémy je často identifikují přes UUID svazku, protože pořadí zařízení se mezi starty může měnit.
Jak souvisí souborový systém s výkonem databáze?
Souborový systém ovlivňuje výkon databáze hlavně tím, jak zachází s vyrovnávací pamětí zápisů a s fragmentací. Databáze si trvanlivost vynucují voláním fsync po zápisu transakčního logu, a rychlost této operace závisí na souborovém systému, nastavení žurnálu a na tom, zda má řadič zálohovanou cache. Copy-on-write systémy jako ZFS nebo Btrfs mohou u datových souborů způsobovat fragmentaci, proto se pro ně často vypíná copy-on-write nad adresářem databáze. Doporučení konkrétního vydání databáze má vždy přednost před obecným pravidlem.
Proč se liší velikost souboru a místo, které zabírá na disku?
Souborový systém alokuje místo po blocích, obvykle po 4 kB. Soubor o velikosti 200 bajtů proto reálně zabere celý blok a zbytek se nevyužije, čemuž se říká vnitřní fragmentace. Naopak takzvané řídké soubory (sparse files) mohou hlásit velikost větší, než kolik skutečně zabírají, protože nulové úseky nemají přidělené žádné bloky. Rozdíl ukáže příkaz du oproti ls: du počítá přidělené bloky, ls hlásí logickou velikost obsahu.

Zdroje

  1. Filesystems in the Linux kernel(otevře se v novém okně)The Linux Kernel Organization
  2. File system(otevře se v novém okně)Wikipedia
  3. How To Corrupt An SQLite Database File(otevře se v novém okně)SQLite

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.