Btrfs, lepší systém souborů – teorie

Btrfs je souborový systém nové generace, u jehož zrodu stojí především společnost Oracle. Je to takové ZFS pro Linux, ačkoliv se od sebe tyto souborové systémy dosti odlišují. V první části dvoudílného článku se podíváme na obecné vlastnosti Btrfs. Článek původně vyšel na ABCLinuxu.cz.

Základní velikosti

  • Maximální velikost svazku: 16 EiB.
  • Maximální velikost souboru: 16 EiB.
  • Maximální počet souborů: 2^64.

Vlastnosti

  • Kopírování při zápisu.
  • Postavený téměř výhradně na b+stromech (b-stromy kompatibilní s technikou COW).
  • Vestavěná podpora pro více zařízení.
  • Vestavěná podpora pro redundanci dat i metadat (ekvivalent raid1, raid10, raid5 je ve vývoji).
  • Kontrolní součty každého bloku.
  • Systém práv: POSIX, ACL.
  • Rozšířené atributy souboru.
  • Transparentní komprese.
  • Transparentní šifrování (ve vývoji).
  • Deduplikace bloků (ve vývoji).
  • Zapisovatelné snímky.

Bezpečnost

V souborovém systému Btrfs má každý blok (blok data i metadat) přiřazen kontrolní součet, který se kontroluje při každém jeho čtení. Pokud kontrolní součet nesouhlasí s přečtenými daty, jsou data přečtena z jiného zařízení (pokud je k disposici). Pokud je kontrolní součet na druhém zařízení v pořádku, jsou data opravena i na zařízení prvním.

Btrfs má tak schopnost detekce poškozených bloků a také automatickou opravu všech jeho kopií. Je to posun jak oproti běžných systémům souborů, které kontrolní součty nemají (případně mají kontroly pouze vlastních metadat), tak i oproti systémům raid, které také při běžných operacích nekontrolují, zda kopie (či parita u raid5,6) souhlasí. U Btrfs by tak mělo méně často docházet k tzv. tichému poškození dat (silent data corruption) způsobeným selhávajícím hardware. Zatím ale neexistuje příkaz, jak vynutit kontrolu celého systému souborů, lze ale snadno napsat skript, který přečte všechny soubory a tím také dojde ke kontrole součtů všech datových bloků.

Podpora více zařízení

Běžné systémy souborů lze vytvořit pouze nad jedním blokovým zařízením. Tedy typicky nad jedním diskovým oddílem. Pokud je potřeba zvýšené ochrany dat, nastupují řadiče (případně software v jádře) raid, které ale opět exportují pouze jedno blokové zařízení. Nad tímto zařízením se vytvoří systém souborů. Ve starém pojetí byl tedy potřeba nějaký device manager, který se staral o redundantní spojení více úložišť. Nad ním byla (nepovinná) vrstva rozdělení tohoto jednoho úložiště na více oddílů (klasické diskové oddíly nebo LVM).

Btrfs tento třívrstvý koncept zcela ruší (přičemž samozřejmě je možné jej vytvořit nad běžným oddílem či raid svazkem, ale je to zbytečné a nic navíc to nepřináší) a slučuje do jedné vrstvy. Souborový systém samotný se stará o redundantní uložení dat na více zařízení i o rozložení zátěže při jejich čtení. Toto spojení má své výhody v možnosti snadné manipulace se zařízeními, ta je možné odpojovat (dostupné volné místo se tak sníží) a nebo připojovat nové zařízení a zvětšit tak dostupné místo. Btrfs také, na rozdíl od raid řadičů a softwarových řešení, nevyžaduje (například pro zrcadlení) stejně velké disky, zrcadlený systém souborů lze vytvořit i na lichém počtu zařízení. Btrfs se postará o uložení jednotlivých bloků na dvě různá zařízení. V současné době je podpora pro ekvivalent raid0, raid1 a raid10, ve vývoji je podpora ekvivalentu raid5 a raid6.

Kopírování při zápisu

Současné systémy souborů (například: ext3, xfs) při zápisu (v tomto případě při změně obsahu souboru) modifikují bloky dat na disku. Pokud se při havárii (výpadku napájení) nestihne zapsat celý měněný blok na disk, data souboru jsou poškozena. A zatímco proti poškození metadat se systémy souborů brání pomocí žurnálu (a jinými technikami), kam se zapisují aktuální operace a jejich stav, tak proti poškození dat samotných mnoho obrany neexistuje (jen ext3 a ext4 umožňují také žurnálování dat, čímž ale efektivně snižují rychlost zápisu na systém souborů na polovinu — data jsou zapsána nejprve do žurnálu a až po té do bloků daného souboru).

Btrfs pracuje jinak. Při modifikaci souboru se nikdy nemodifikuje blok s aktuálními daty, ale je zapsán blok nový a až po té jsou atomicky změněny adresy v datových strukturách právě na tento nový blok. Tato technika se jmenuje kopírování při zápisu (copy on write — cow). Při havárii systému (výpadek napájení) tak mohou nastat dva konzistentní stavy systému souborů:

  • Nový blok se stihl zapsat a potvrdit, data v souboru jsou tedy nová a v pořádku.
  • Nebo se blok nestihl zapsat a potvrdit na disk, v takovém případě jsou data v souboru v konzistentním stavu jako před zápisem a výpadkem.

Z předchozího je patrné, že systém souborů atomicky přechází z jednoho konzistentního stavu do druhého a to platí nejen pro strukturu systému souborů samotného (metadata), ale také pro data samotná. Tento postup (zápisu nového bloku místo modifikace původního) má však i své stinné stránky, zejména fragmentaci bloků jednoho souboru. Btrfs tak, jako první čistě linuxový systém souborů, přichází s nástrojem na defragmentaci.

Vlastnost kopírování bloků při zápisu není jen nějakou teoretickou zajímavostí, naopak nabízí spoustu nových a užitečných vlastností použitelných uživateli. Asi nejméně zajímavou (v porovnaní s dalšími vlastnostmi), přesto však okamžitě použitelnou vlastností Btrfs je možnost rychle a úsporně vytvářet klony (referenční linky) souborů. 20. srpna 2009 přibyl ve standardním nástroji cp parametr --reflink, který atomicky vytvoří kopii souboru pomocí cow. Použití je nasnadě, pokud pracujete s velkými soubory (například obrazy disků), můžete si takto efektivně vytvářet jejich kopie a nezávisle je modifikovat (na rozdíl od pevných či symbolických linků se zde jedná o dva různé soubory, které na počátku pouze sdílejí stejné bloky na disku). Místo na disku zabírají pouze změněné bloky, lze tak efektivně pracovat se soubory, které mají souhrnnou velikost větší, než je dostupné místo na disku.

btrfs.fsck

Btrfs má dvě prvenství. Je to první Linuxový systém souborů s nástrojem na defragmentaci a také jediným systémem souborů bez nástroje na kontrolu. Zatímco fragmentace je přímým důsledkem alokace nových bloků místo změny původních (COW) a defragmentační nástroj je tedy nezbytně nutný pro zachování optimální rychlosti systému souborů, tak nástroj na offline kontrolu není podle návrhu nutný vůbec.

Realita je bohužel tvrdá a i Btrfs se může poškodit při výpadku napájení, například na diskových zařízeních, které lžou o provedení příkazu FLUSH (vynucení zapsání dat z cache na disk). Tato zařízení vrátí odpověď o provedení příkazu dříve, než jej skutečně provedou (což znamená, že se data na některá zařízení zapíší a na jiné ne, pokud v této chvíli dojde k výpadku napájení, dojde také k těžké nekonzistenci dat mezi různými zařízeními). I proto se offline kontrola Btrfs hodí, v současné době se již na tomto nástroji pracuje.

Pododdíly a jejich snímky

Další vlastností, kterou nenalezneme v žádném současném systému souborů jsou pododdíly (subvolume). Na pododdíly můžeme nahlížet buď jako na ekvivalent diskových oddílů nebo jako lepší adresáře (pododdíly je možné vytvářet v prakticky neomezeném množství a kdekoliv v adresářové hierarchii systému souborů).

V prvním náhledu můžeme pododdíly chápat jako diskové oddíly s tím rozdílem, že volné místo diskových zařízení je sdílené všemi takto vytvořenými oddíly. Přidání dalšího diskového zařízení do Btrfs automaticky znamená navýšení místa pro všechny pododdíly. Čímž se odstraňuje jedna z nevýhod statických diskových oddílů, kterou je distribuce volného místa. Pododdíl lze připojovat s různými parametry, například transparentní komprese; ve vývoji jsou kvóty a šifrování.

Ve druhém náhledu, tedy lepších adresářů, nabízí Btrfs možnost vytvářet klony pododdílu (snapshoty, snímky). Snímek je atomicky vytvořený obraz pododdílu, který je dále nezávislý na původním pododdílu. Je dobré si připomenout, že snímek je také pododdíl, který jen vznikl jako klon jiného pododdílu, ale je nadále nezávislý. Z toho plyne, že jej, stejně jako ostatní pododdíly lze libovolně mazat, připojovat s různými parametry a také dále atomicky klonovat.

Volné místo

Zjistit volné a také i zabrané místo na oddílu s Btrfs je obtížnější, než se na první pohled může znát. Zatímco na běžném systému souborů je mezi bloky a soubory na disku jednoznačné mapování (jeden blok může být součástí nejvýše jednoho souboru), tak u BTRFS je tomu jinak. Jeden blok může být součástí mnoha souborů a to jak v případě referenčních linků, tak zejména klonů pododdílů.V Btrfs tak existuje několik více či méně přesných způsobů zjištění místa na disku.

V dalším díle se podíváme na praktické nasazení a práci s BTRFS. 

Příspěvek byl publikován v rubrice BTRFS, Linux, Systémy souborů. Můžete si uložit jeho odkaz mezi své oblíbené záložky.