Btrfs v praktických ukázkách

22. 2. 2013
Doba čtení: 9 minut

Sdílet

S každou verzí jádra dostává Btrfs nové a nové vlastnosti. Už se najdou i lidé, kteří ho používají pro běžnou práci, a pokud o něm také přemýšlíte, měli byste vědět, jak ho používat a co od něj čekat. Btrfs má stále své slabiny, ale když o nich víte, může se stát už teď dobrým souborovým systémem pro vaše data.

Už je to nějaký čas, co jsme naposled psali o Btrfs. Bylo to v roce 2008 a v té době bylo Btrfs silně ve vývoji a oddíl vytvořený pomocí nástrojů jedné distribuce nemusel fungovat v jiné distribuci. Pro Btrfs divoká puberta, pro uživatele spíše hračka na testování než na seriózní práci. Od roku 2008 se Btrfs hodně změnilo, vyzrálo, dá se používat a i když je v jádře ještě stále označeno za experimentální vlastnost, Oracle a SUSE ho nasadily ve svých enterprise distribucích.

Je na vás, zda už Btrfs svěříte svá data, ale kdy už, měli byste vědět něco o tom, co všechno umí a jak se používá. Pak možná zjistíte, že potřeba některé z funkcí vyváží pravděpodobnost, že by se něco mohlo stát vašim datům.

Jak na Btrfs

Btrfs není stejný jako jeho předchůdci. Ext4/3/2 dělal jednu věc, ukládal data a byl v tom dobrý a spolehlivý. Vývojáři Btrfs vzali tento problém trochu ze široka a přidali k němu pár zajímavých vlastností:

  • Copy-On-Write
  • Dynamická tabulka inodů
  • Efektivní ukládání malých souborů
  • Snapshoty
  • Subvolume
  • Kontrolní součty
  • RAID 0/1/10
  • Defragmentace
  • Quoty
  • Podpora SSD

Většina z těchto vlastností byla popsána už ve zmíněném článku. Dnešní článek bych chtěl věnovat praktickým ukázkám s aktuálními nástroji. Ty se během vývoje změnily a postupy uvedené ve starším článku už nefungují.

Volby připojení

Btrfs disponuje řadou parametrů, které se vám mohou hodit při připojování jeho oddílů. Je jich opravdu hodně a úplný seznam a popis najdete na btrfs.wiki.kernel.org. Tady je výběr těch nejdůležitějších.

degraded

V případě, že používáte Btrfs přes několik fyzických svazků a tím pádem používáte funkci RAID1 nebo RAID5, může se stát, že jeden ze svazků přestane reagovat, například kvůli hardwarové chybě. V takovém případě použijte parametr degraded, který umožní připojit souborový systém i bez chybějícího blokového zařízení.

nodatacow

Btrfs pracuje tak, že ne vždy může podávat maximální výkony. Jak je vysvětleno níže, úpravy souborů vedou k jejich fragmentaci a pokud používáte obrazy systémů nebo databáze na pevných točících se discích, začnete po čase vnímat zpomalení. Tomu zabráníte vypnutím CopyOnWrite způsobu zápisu nových dat pomocí parametru nodatacow a nebo častou defragmentací.

# btrfs filesystem defragment

subvolid

Jak je řečeno níže, souborový systém Btrfs může být rozdělen na několik pododdílů, resp. subvolumes. Jeden z nich funguje jako kořen a nese id 0, ale můžete vybrat i jiný subvolume, který bude připojen jako kořen. Stačí jeho id uvést v parametru subvolid a místo nefunkčního kořenového subvolume můžete připojit třeba jeho funkční snapshot.

compress,compress-force

Transparentní komprese je jednou z vlastností, která mě přesvědčila Btrfs alespoň zkusit na něco jiného než pokusy. Funguje tak, že když připojíte Btrfs s parametrem compress, všechny nové bloky budou zkomprimovány. Btrfs má mechanizmy k tomu, aby poznalo, která data zkomprimovat lze a která ne. Soubor s filmem například kompresi nepotřebuje, ale adresář s e-maily by po kompresi určitě ušetřil značné množství prostoru na fyzickém zařízení. Pokud této schopnosti nevěříte, můžete použít parametr compress-force. Pak bude Btrfs komprimovat vše, bez ohledu na „komprimovatelnost“ dat. Kromě toho můžete zvolit také kompresní technologii. Na výběr je ze zlib a lzo, kde první jmenovaný přináší lepší kompresní poměr a druhý zatěžuje méně procesor. Pokud připojíte již existující souborový systém s jedním z těchto parametrů, nebude to mít vliv na již zapsaná data.

compress=zlib
compress=lzo 

ssd

Btrfs dokáže optimalizovat práci s daty na SSD discích. Sám pozná, že běží na SSD a při připojování doplní tento parametr sám.

discard

Tímto parametrem zapnete funkci TRIM pro SSD disky. O té se můžete dočíst na blogu Petra Krčmáře. Jejím zavoláním řeknete disku, které bloky může označit za nepoužívané a ten s nimi pak naloží, jak uzná za vhodné. TRIM je možné zavolat manuálně pomocí:

# fstrim / 

Kde místo / uvedete vlastní připojený souborový systém. Manuální spouštění chvilku trvá, ale jde o jednorázovou akci, zatímco když připojíte Btrfs (nebo i jiný souborový systém) s parametrem discard, bude se TRIM volat pro aktuálně uvolněné místo, což razantně zpomaluje mazání dat z disku.

recovery

Poslední parametr se vám může hodit v případě, že selže připojení oddílu s Btrfs. Když při připojování uvedete v parametrech recovery, podívá se Btrfs i po dalších kopiích metadat.

Subvolume

Btrfs se nechová jako konvenční souborový systém. Kromě adresářů a souborů je možné ho rozdělit i na oddíly, resp. subvolumes. Subvolume se uživateli tváří jako samostatný oddíl, který může být připojen s jinými parametry, ale pod pokličkou jde stále o jeden souborový systém. Mezi oddíly tak můžete sdílet prostor, ale zároveň využít kompresi jen na část dat, vypnout COW v úložišti obrazů virtuálních strojů a zároveň máte možnost vytvářet snapshoty jen vybraných subvolumes.

Například když nainstalujete systém na Btrfs tak, aby root a home měl vlastní subvolume, můžete před aktualizaci systému vytvořit snapshot rootu a v případě problémů obnovit původní systém z tohoto snapshotu. Data uložena v subvolume home zůstanou bez snapshotu, a to v rámci jednoho souborového systému na jednom diskovém oddílu.

Pojďme si zkusit práci se subvolumes. Vytvoříme si testovací obraz a někam ho připojíme:

# dd if=/dev/zero of=btrfs-1.img bs=32M count=40
# losetup /dev/loop0 btrfs-1.img
# mkfs.btrfs /dev/loop0
# mount /dev/loop0 /mnt/test 

V /mnt/test najdeme připravené Btrfs. Všimněte si, že vytvoření souborového systému je otázkou sekund a nezmění se ani při použití mnohem většího oddílu. Na rozdíl od Ext4 má Btrfs dynamicky alokovanou tabulku inodů, podobně jako JFS nebo XFS, a při formátování se nemusí zdržovat jejím vytvářením.

# cd /mnt/test
# btrfs subvolume create subvolume1
# btrfs subvolume create subvolume2
# btrfs subvolume create subvolume3
# ls
subvolume1  subvolume2  subvolume3
# btrfs subvolume list /mnt/test
ID 257 top level 5 path subvolume1
ID 258 top level 5 path subvolume2
ID 259 top level 5 path subvolume3 

Vyrobili jsme tři oddíly s id 257, 258, 259. Všimněte si, že se chovají jako běžné adresáře, které ale můžeme přemountovat někam jinam. K tomu použijeme:

# mount -o noatime,compress=lzo,subvolid=257 /dev/loop0 /mnt/test/home 

Tímto jsme do /mnt/test/home připojili subvolume s id 257. Šlo by identifikovat také pomocí:

subvol=subvolume1 

Kromě toho jsme zapnuli kompresi a vypnuli zápis času přístupu k souborům. Když bychom subvolume1 připojili jako root, nebudeme z něj mít přístup k subvolume2 a subvolume3, protože mají své přístupové body v kořenovém subvolume. Můžeme je ale připojit stejným způsobem jako subvolume1.

Speciální subvolume jsou snapshoty. Pokud chcete nad svými daty provést nějakou nebezpečnou operaci, s Btrfs můžete udělat „zálohu“ svých dat pomocí snapshotu a v případě problémů data překopírovat zpátky. Snapshot totiž vytvoří nový subvolume, který obsahuje přesně ta data, která máte v originálním subvolume. Pokud se v něm pak něco změní, ať už ve snapshotu nebo v původním subvolume, navzájem se změny neprojeví. Snapshot může být také readonly, takže budete mít jistotu, že jeho obsah se nezmění.

# btrfs subvolume snapshot -r /mnt/test/subvolume1 /mnt/test/snapshot_subvolume1
# btrfs subvolume list /mnt/test
ID 257 top level 5 path subvolume1
ID 258 top level 5 path subvolume2
ID 259 top level 5 path subvolume3
ID 260 top level 5 path snapshot_subvolume1 

Vytvořili jsme snapshotu subvolume1 a když teď provedeme změnu v subvolume1, neprojeví se ve snapshot_subvolume1 a obráceně.

# touch /mnt/test/subvolume1/test
# ls /mnt/test/snapshot_subvolume1/ | wc -l
0 

Snapshot, stejně jako každý jiný subvolume, můžeme smazat pomocí:

# btrfs subvolume delete /mnt/test/snapshot_subvolume1/ 

Pokud se rozhodneme, že když připojujeme oddíl, tak kořenový subvolume má být jiný než ten s id 0, můžeme ho nastavit pomocí:

# btrfs subvolume set-default 267 /mnt/test/ 

V případě, že dojde k problémům a potřebujete obnovit data ze snapshotu, stačí použít utilitku rsync. Btrfs si už přebere bloky tak, aby se neopakovaly.

# rsync --progress -aHAX --inplace /mnt/test/snapshot_subvolume1/ /mnt/test/subvolume1/ 

Když potřebujete změnit velikost Btrfs, použijete:

# btrfs filesystem resize max /mnt/test 

Kde je možné místo max uvést ± konkrétní číslo, například 10g, čímž dojde ke zvětšení o 10 GB.

Raid

Btrfs dokáže rozdělit data mezi více fyzických zařízení. V současné době podporuje RAID0 a RAID1. V případě RAID0 dokáže stripovat data napříč všemi disky. Na každém je uložený kousek data a rychlost čtení roste počtem disků. U RAID1 se bloky klasicky kopírují a rychlost čtení také roste s počtem disků. Nejdříve si vytvoříme druhý testovací „disk“.

# dd if=/dev/zero of=btrfs-2.img bs=32M count=40
# losetup /dev/loop1 btrfs-2.img 

A můžeme začít kombinovat. Výchozí chování je RAID0 pro data a RAID1 pro metadata. Když vypadne jeden z disků, měl by jít souborový systém připojit, i když data z jednoho disku budou ztracena. Oba následující zápisy jsou ekvivalentní.

# mkfs.btrfs /dev/loop0 /dev/loop1
# mkfs.btrfs -m raid1 /dev/loop0 /dev/loop1 

Metadata můžeme taktéž ukládat do RAID0.

# mkfs.btrfs -m raid0 /dev/loop0 /dev/loop1 

V případě, že chceme data i metadata na obou discích, zvolíme následující možnost:

# mkfs.btrfs -d raid1 /dev/loop0 /dev/loop1
# mkfs.btrfs -m raid1 -d raid1 /dev/loop0 /dev/loop1 

Oba zápisy jsou opět ekvivalentní. Takto vytvoření RAID je možné připojit s kterýmkoli zařízením:

# mount /dev/loop0 /mnt/test 

A bude fungovat i toto:

# mount /dev/loop1 /mnt/test 

Na co si dát pozor

Btrfs je komplikovaný soubory systém a je třeba vědět, kde má slabá místa.

Komprese a SSD disky

Některé SSD disky transparentně komprimují data, která se na ně ukládají. Uživatelem viditelné obsazené místo se nezmění, ale disk může využít méně fyzického prostoru, což zvyšuje jeho životnost. Ukládáním komprimovaných souborů se tento mechanizmus oslabuje, protože již jednou zkomprimovaná data nemůže disk zmenšit tak, jak by chtěl. Podobně dopadne při ukládání filmů, hudby nebo obrázků, ale disk obsahuje i další data, včetně samotného systému.

Například při mém pokusu s instalací Arch Linuxu na komprimovaný a nekomprimovaný Btrfs disk byl rozdíl v obsazeném prostoru 30 %. Když v Btrfs zapnete kompresi, tak v případě většího zaplnění disku nebudete moci na disku těchto 30 % použít.

Ne všechny disky se takto chovají a reálný dopad nemusí mít vůbec váhu v porovnání s morálním zastaráním dnešních SSD disků. Těch dat se totiž uloží tak jako tak méně, jen vy můžete využít většího prostoru.

Velké soubory

Možná jste postřehli diskuse a různá měření, kde se Btrfs ukázalo jako nevýkonné při práci s určitými typy souborů. Často se mluví o velkých souborech s mnoha náhodnými zápisy, ale v praxi nemusí jít o obraz virtuálního stroje, abyste na něco takového narazili. Btrfs ve výchozím stavu používá COW, tedy že zapisuje nová data do nevyužitého místa a pak pouze změní ukazatel ze starých dat na nová.

bitcoin_skoleni

U souborů, kde probíhá mnoho náhodných zápisů, pak dojde k velké fragmentaci, což na konvenčních discích ovlivňuje výkon. Takto jsou postiženy právě obrazy disků, ale také soubory s databázemi což zahrnuje MySQL, PostgreSQL, ale také databázi s profily Google Chromu, Firefoxu, Thunderbirdu a mnoho dalších. Na desktopu postačí častější defragmentace, u serveru je pak dobré vypnout COW pomocí „nodatacow“ ve fstab. Vypnutím COW přijdete kromě snapshotů také o kompresi.

Shrnutí

Btrfs toho nabízí hrozně moc a v tomto článku byla popsána pouze část jeho možností. Podívejte se také na odkazy níže, kde jsou popsány další postupy. Některé se vám mohou hodit, jiné vám třeba pomohou pracovat s vašimi daty efektivněji.

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.