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

Po teoretickém úvodu z minulého dílu se dnes dostáváme k nasazení BTRFS v praxi. Článek původně vyšel na ABCLinuxu.cz.

Vytvoření systému souborů nad několika pevnými disky

Po teoretickém úvodu se dnes dostáváme k praxi. V současném stavu vývoje Btrfs je možné vytvořit systém souborů nad několika disky (obecně jakýmkoliv blokovým zařízením) a to v režimech single, raid0, raid1 a raid10. V režimech single a raid0 je minimální počet diskových zařízení jeden, v raid1 dva a v raid10 potom 4. Lze použít disková zařízení různých velikostí, což je další posun oproti systémům raid. Režimy single a raid0 lze použít například pro souborový systém nad hardwarovým či softwarovým raidem, kde je již o ochranu dat postaráno.

Vytvoření systému souborů nad dvěma disky v režimu raid1:

# mkfs.btrfs -d raid1 -m raid1 /dev/vdb /dev/vdc

WARNING! - Btrfs Btrfs v0.19 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

adding device /dev/vdc id 2
fs created label (null) on /dev/vdb
        nodesize 4096 leafsize 4096 sectorsize 4096 size 2.00TB
Btrfs Btrfs v0.19

V distribucích, které nemají dobrou podporu Btrfs je před samotným připojením nutné vykonat příkaz

# btrfs device scan

, který vyhledá všechny Btrfs souborové systémy.

Takto vytvořený systém souborů lze potom připojit pomocí příkazu:

# mount /dev/vdb /mnt

, kde jako připojované zařízení lze uvést libovolné diskové zařízení, na kterém je systém souborů vytvořen, nebo jeho UUID. Případně (pokud, například při startu systému bez initrd, není možné spustit příkaz btrfs device scan, je možné vyjmenovat všechna disková zařízení pro daný systém souborů):

# mount /dev/vdb /mnt -o device=/dev/vdb,device=/dev/vdc

Řádek do /etc/fstab potom bude vypadat následovně:

# /dev/vdb /mnt btrfs device=/dev/vdb,device=/dev/vdc 0 0

Pro zjištění informací o systémech souborů btrfs na celém serveru slouží příkaz

# btrfs filesystem show
Label: none  uuid: b851caba-dccd-4801-9db9-8f1477170063
        Total devices 2 FS bytes used 28.00KB
        devid    1 size 1.00TB used 2.03GB path /dev/vdb
        devid    2 size 1.00TB used 2.01GB path /dev/vdc

Zde je tedy systém souborů jeden a nad diskovými zařízeními /dev/vdb a vdc.

Vytvoření souborového systému Btrfs je jediná operace, která se (už ze své podstaty) vykonává při odpojeném systému souborů. Všechny další operace se provádějí online, při připojeném Btrfs.

Přidání dalšího diskového zařízení

Další diskové zařízení lze přidat pouze k připojenému souborovému systému a sestává se ze dvou kroků. Příkazem btrfs device add <zařízení> <přípojný bod> se přidá další zařízení do souborového systému:

# btrfs device add /dev/vdd /mnt

Po té je vhodné (nikoliv nutné) příkazem btrfs filesystem balance <přípojný bod> přeuspořádat data na všech zařízeních pro rovnoměrné rozložení dat.

# btrfs filesystem balance /mnt

Odebrání diskového zařízení

Odebrání diskového zařízení se opět provádí nad připojeným souborovým systémem a má svá omezení. V souborovém systému musí být alespoň tolik volného místa, jaká je velikost odebíraného zařízení. Dále zařízení není možné odebrat, pokud by se snížil počet zbývajících zařízení pod minimum, které je dané použitým režimem (raid1 dvě a raid10 čtyři disková zařízení). Pro odebrání slouží příkaz btrfs device delete <zařízení> <přípojný bod>

# btrfs device delete /dev/vdd /mnt

Odebrání, na rozdíl od přidání, trvá delší čas, jelikož je nutné datové bloky přesunout na jiné disky.

Náhrada vadného disku

Tato operace se opět a zde poněkud překvapivě vykonává nad připojeným systémem souborů. Někdy může být nutné připojit souborový systém v degradovaném režimu, pomocí volby „degraded“:

mount -t btrfs -o degraded /dev/vdb /mnt

, to v případě, že je počet zařízení nižší, než je nutný počet. Například, pokud systém souborů vytvořený s parametry mkfs.btrfs -d raid0 -m raid1 /dev/vdb /dev/vdc, tedy zrcadlení pouze metadat, přijde o jeden z disků, tak jsou data sice „v háji“, ale stále lze získat alespoň názvy souborů (metadata) a výpis adresářové struktury.

Potom lze vadné zařízení odebrat příkazem:

# btrfs device delete missing /mnt

Poznámka: Stejně jako u odebírání „zdravých“ disků v předchozím bodě i zde je nutné, opět poněkud překvapivě, dodržet minimální počet zařízení. Tedy, před odebrání „missing“ disku z raid1 je nejprve nutné připojit další diskové zařízení a až poté odebrat vadný disk. Lze předpokládat, že toto chování bude předmětem dalších změn.

Zjištění volného místa na systému souborů

Operační systém postavený na Linuxu poskytuje dva základní nástroje pro zjištění volného a obsazeného místa na systému souborů. Jsou to příkazy du (disk utilization) a df (disk free). Oba tyto nástroje v současné době poskytují nesprávné informace o zabraném a volné místu na systému souborů Btrfs.

df v současné době jednak nerespektuje metadata a případnou kompresi bloků, ale zejména způsob uložení datových bloků (raid1, raid10). Například na používaném souborovém systému vytvořeném jako raid1 nad dvěma 1TB disky ukazuje df:

# df -h /home
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             1.9T  407G  1.5T  22% /home

22% zabraného místa, přičemž reálně je zabraných přibližně 44% zrcadlených bloků.

du při zjišťování zabraného místa na disku nerespektuje referenční (cow) kopie souborů, ani snímky pododdílů. Zjištěné zabrané místo na celém systému souborů tak snadno může mnohokrát překročit jeho velikost. Příklad je opět ze 1TB souborového systému nad dvěma disky v raid1.

# du -sh /home
4.7T    /home

Takto výrazný rozdíl mezi skutečně použitým místem (407GB) a spočteným (4.7TB) je dán užitím snímků (několik desítek) pododdílů.

Btrfs poskytuje vlastní nástroje pro zjišťování informací o zabraném místu, btrfs filesystem df <přípojný bod>:

# btrfs filesystem df /home
Metadata, RAID1: total=7.62GB, used=1.12GB
Data, RAID1: total=914.62GB, used=404.94GB
System, RAID1: total=8.00MB, used=144.00KB
System: total=4.00MB, used=0.00

Na tomto systému je tedy zabráno celkem (data + metadata + režijní data) 405GB, 510GB je tedy volných (srovnejte si tyto údaje s výpisy du a df). Výpis btrfs filesystem df zatím neobsahuje jednoduchý údaj o celkovém dostupné a celkovém zabraném místu, je tedy nutno počítat.

Co se týče zjištění zabraného místa snímky pododdílů, zde je situace ještě složitější. V současné době neexistuje a ani se neplánuje jednoduchý nástroj, který by poskytl odpověď na otázku „Kolik místa se uvolní odstraněním tohoto pododdílu?“.

Vytvoření a připojení pododdílu

Dostáváme se k operaci, kterou budeme v praxi dělat přece jen častěji. Jak již bylo řečeno, pododdíl je něco jako lepší adresář, který lze samostatně připojit jako samostatný souborový systém s nějakými parametry. Počet pododdílů je prakticky neomezený.

Pododdíl se vytvoří příkazem btrfs subvolume create <cesta>.

Pokud bychom chtěli využít například transparentní kompresi pro textová data (například emaily), lze vytvořit pododdíl a ten připojit například do /var/spool/mail. Btrfs root je v tomto případně připojen do /btrfs_spool.

# btrfs subvolume create /btrfs_spool/mail
# mount /dev/sda3 /var/lib/mail -o defaults,subvol=mail,compress

Jistě se najde spousta využití pododdílů a jejich připojování s různými parametry, nápady lze nalézt na btrfs wiki.

Rušení pododdílů

Rušení pododdílu je z hlediska userspace velmi rychlé, mnohonásobně rychlejší než by bylo rekurzivní smazání. Datové bloky se uvolňují na pozadí příslušných jaderným procesem. Ovšem pozor, přestože je smazání zdánlivě okamžité, souborový systém nelze odpojit, dokud tato činnost nebude dokončena. Tato vlastnost ve většině případů nebude vadit, narazil jsem však na případ, kdy jsem po zrušení velkého pododdílu (s velkým počtem souborů) potřebovat daný server vypnout a musel jsem čekat několik minut na odpojení souborových systémů.

Rušení pododdílu

# btrfs subvolume delete /home/adam

Snímky pododdílů

Snímek pododdílu je atomická kopie zdrojového pododdílu v daném čase. Je důležité si uvědomit, že takto vytvořená kopie je také pododdíl se vším, co k tomu patří, tedy je zapisovatelný, lze jej připojit s nějakými parametry, rušit a vytvářet další snímku.

Snímek pododdílu se vytvoří příkazem btrfs subvolume snapshot <zdroj> <cíl>.

Vytvoření snímku je levná operace (jak časově, tak díky COW i prostorově), snímky lze vytvářet v prakticky neomezeném množství.

Praktické ukázky

Btrfs používám na svém domácím (neprodukčním) serveru několik měsíců k maximální spokojenosti. Rád bych se podělil o způsoby jeho využití.

Domácí adresáře jako pododdíly

Používám Btrfs na /home a jednotlivé domácí adresáře mám vytvořené jako pododdíly:

# btrfs subvolume create /home/<username>

S tím, že se automaticky (pomocí skriptu v cronu) vytváří snímky všech těchto domácích pododdílů. Uživatelé tak mají přístup ke starším verzím svých souborů, které si mohou snadno sami obnovit. Další výhoda je v rychlém mazání příslušného domácího adresáře (což pro adresář „živého uživatele“ nenastává tak často, ale pro adresáře služeb „na vyzkoušení“ je to přece jen častější operace).

Inkrementální zálohování pomocí snímků a rsync

Přenášení dat pomocí rsync po síti je úsporné a tedy rychlé, stejně tak rychlé je i vytváření snímků. Spojením těchto dvou vlastností vzniklo zálohovací řešení stylem:

  1. Přenes data pomocí rsync.
  2. Vytvoř na zálohovací lokalitě snímek.

Triviální, jednoduché, ke všem souborům je otevřený přístup, na disku jsou uloženy úsporně (pouze změněné bloky) a hlavně, lze smazat libovolnou zálohu prostým smazáním daného pododdílu (což mnohé inkrementální zálohovadla neumožňují a nebo to trvá neakceptovatelně dlouho). Tomuto řešení chybí možnosti zjištění, kolik místa se uvolní smazáním daného snímku. To Btrfs neumí.

Práce s velkými adresáři

Nejednodušší a zároveň asi nejužitečnější využití snímků je při práci s velkými soubory, na které se nehodí klasické systémy správy verzí. Při práci s adresáři, které obsahují stovky gigabajtů souborů se hodí si tento pracovní adresář (pododdíl) „verzovat“ pomocí snímků a mít tak možnost se kdykoliv vrátit o krok zpět, případně zkoušet různé postupy zpracování daných souborů. V praxi jsem potřeboval upravit adresářovou strukturu se stovkami tisíci souborů (soubory samotné jsem nemodifikoval) a možnost vytvoření snímků mi poskytlo možnost porovnat více adresářových struktur vedle sebe.

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.

5 komentářů: Btrfs, lepší systém souborů – praxe

  1. lzap napsal:

    Pěkné. Když s btrfs nakopíruju z nějakého externího média stejný soubor dvakrát, tak to asi btrfs „nepozná“ a budou tam dvě kopie, že? Pokud ano, tak by mě zajímalo, jeslti existuje nástroj, který projde všechny bloky a u všech které nesou stejný obsah odstraní duplicity.

    Například dost často se v Linuxu na filesystému vyskytuje stejný soubor (např. LICENSE obsahující GNU GPL), zajímalo by mě jestli se takhle dá ušetřit. Chápu že když se soubor nakopíruje na jednom fs (btfrs), tak to systém udělá automaticky (copy-on-write), ale například distribuce se instaluje kopírováním (resp. rozbalováním) balíků…

    • lzap napsal:

      …kopírováním z jiného oddílu (cdromu např.) – abych to upřesnil.

    • Heron napsal:

      Automatická deduplikace ani bloků ani celých souborů tam zatím není (ale je ve vývoji, počítá se s tím).

      Pokud tam máš stejné soubory a jsi je schopný identifikovat (což jsi), tak je potom lze pomocí cp –reflink nakopírovat. Vznikou tak COW kopie, které na disku zabírají jeden prostor. Na rozdíl od hardlinků (které se na tohle pro readonly data dají použít také) lze ty reflinkové kopie nezávisle editovat.

      Jinak, když se soubor nakopíruje (skutečně nakopíruje, data se tam znovu zapíší), tak to btrfs samozřejmě také nepozná. Je třeba místo kopírování používat reflink. Někde je cp nastavené na auto, to znamená, že pokud FS umí COW, tak je cp použije.

      Kolik tak lze ušetřit si můžeš sám zjistit (fdupes, hardlink). Na běžně používaném FS to mnoho nebude.

      Tohle se spíše hodí na případy, kdy o tom člověk ví. Například na image disků virtuálek. Mám-li stejné virtuálky, můžu je pomocí reflinků kopírovat a místo potom zabírají jen změněná data. Problém je, že se potom velmi těžko zjišťuje, kolik co zabírá místa.

  2. Pingback: BTRFS v praxi po 5 letech | Heronovo

  3. Pingback: Btrfs, lepší systém souborů – teorie | Heronovo

Komentáře nejsou povoleny.