Hlavní navigace

COW filesystémy BTRFS

22. 10. 2014 12:35 (aktualizováno) | Jan Krcmar

BTRFS je mladším kolegou ZFS. Stejně jako ZFS se snaží o implementování rozšířených vlastností s důrazem na toleranci chyb, opravy a jednoduchou administraci.

Název může mít několik významů: BetterFS, BtreeFS, ButterFS, ButterFace.
Nemá tak vysoké cíle jako ZFS. Chce být stejně tak dobré nebo dokonce lepší než stávající Linuxové systémy souborů (ext4, ReiserFS, XFS). Důraz klade na škálovatelnost a výkon.
Používá pevnou velikost bloků, které seskupuje do extentů.
Extenty zajistí nižší fragmentaci dat, ale mají i své nevýhody. Například při kompresi je nutné přečíst celý extent.
Pro ukládání datových struktur se používají optimalizované b+stromy.
Transakce v BTRFS porušují některé ACID pravidla (atomicity, consistency).
Oproti ZFS se snaží co nejvíce využít funkcí jádra (io scheduler, cache, komprese).
Na stránkách BTRFS se můžeme dočíst, že návrh systému již není nestabilní, ale kód prochází překotným vývojem.
Není doporučeno jeho použití pro produkční účely.
BTRFS je licencován GPL, tedy stejně jako Linux, což je možná jeden z důvodů, proč je vůbec tento systém vyvíjen.

V názvosloví BTRFS se skupina zařízení pro ukládání dat označuje jako filesystem.
Do filesystemu můžeme přidávat a odebírat zařízení online.
Ve filesystemu vytváříme subvolumy.

Aby systém věděl, kde se BTRFS filesystemy nacházejí, použije se skanování.

/mnt/btrfs # btrfs device scan Scanning for Btrfs filesystems

Pro vytvoření filesystemu použijeme standardní utilitu mkfs.
Při použití více zařízení, jsou v základním nastavení metadata v RAID1 a data RAID0.
Rozložení dat a metadat se může nastavit parametry mkfs při vytváření, nebo později změnit příkazem btrfs.
Při vytváření systému může být v parametru mkfs.btrfs více zařízení.

/ # mkfs.btrfs -L btrfs_data -d raid1 -m raid1 /dev/sda3 /dev/sdb2 /dev/sda2 / # mount /dev/sda3 /mnt/btrfs

Vypsání dostupných BTRFS filesystemů provedeme příkazem btrfs.

/mnt/btrfs # btrfs filesystem show Label: 'btrfs_data' uuid: b4793685-b88a-4480-8869-437f71554959 Total devices 3 FS bytes used 267.15GiB devid 2 size 74.61GiB used 2.00GiB path /dev/sda3 devid 4 size 461.95GiB used 293.03GiB path /dev/sdb2 devid 5 size 387.34GiB used 291.00GiB path /dev/sda2 Btrfs v3.14.2

Vidíme systém s názvem btrfs\_data, obsahující 3 diskové oddíly.

Rozložení dat ve filesystemu.

/mnt/btrfs # btrfs fi df . Data, RAID1: total=291.00GiB, used=266.10GiB System, single: total=32.00MiB, used=52.00KiB Metadata, RAID1: total=2.00GiB, used=1.05GiB unknown, single: total=360.00MiB, used=0.00 /mnt/btrfs # df -h . Filesystem Size Used Avail Use% Mounted on /dev/sda3 924G 535G 243G 69% /mnt/btrfs

Pro ukládání dat a metadat se použije systém RAID1.
Příkaz df zobrazuje volné místo na disku netradičně, oproti zvyklostem.
Velikost je součet všech zařízení ve filesystemu. Volné resp. použité místo se mění v závislosti na použitém RAID modelu.

Zařízení odebereme příkazem btrfs.

/mnt/btrfs # btrfs dev delete /dev/sda3 . /mnt/btrfs # btrfs fi sh Label: 'btrfs_data' uuid: b4793685-b88a-4480-8869-437f71554959 Total devices 2 FS bytes used 272.93GiB devid 4 size 461.95GiB used 293.03GiB path /dev/sdb2 devid 5 size 387.34GiB used 293.00GiB path /dev/sda2 Btrfs v3.14.2

Data se automaticky rozloží na zbylé disky.

Vytvoření subvolumu provedeme příkazem btrfs.

/mnt/btrfs # btrfs subvolume create tmp Create subvolume './tmp' /mnt/btrfs # btrfs su list . ID 256 gen 692121 top level 365 path var/cache/pacman ID 257 gen 692148 top level 365 path var/lib/mysql ID 270 gen 699161 top level 5 path usr ID 317 gen 691332 top level 5 path opt ID 365 gen 699174 top level 5 path var ID 497 gen 699174 top level 5 path home ID 499 gen 699144 top level 497 path home/virts ID 1099 gen 699173 top level 5 path tmp

Pokud připojujeme BTRFS filesystem, je jedno, které zařízení použijeme jako parametr pro příkaz mount.
Nový systém obsahuje pouze jeden subvolume (subvolid=5). Ten je implicitně nastaven jako výchozí pro mount.
Výchozí subvolume se nastaví příkazem btrfs.
Pro připojení subvolumu na jiné místo, než jaké má ve struktuře filesystemu přidáme příkazu mount parametr subvol, nebo subvolid.

/mnt/btrfs # mount /dev/sda3 /usr/home -o subvol=home

Kvóty jsou v BTRFS implicitně vypnuty.
Jejich zapnutí se provede příkazy btrfs.

/mnt/btrfs # btrfs quota enable . /mnt/btrfs # btrfs qu rescan .

Každý subvolume je zařazen do qgroup. Limit lze nastavit přímo nad subvolumem.

/mnt/btrfs # btrfs qgroup limit 1g opt

Snapshot vytvoříme analogicky jako subvolume.

/mnt/btrfs # btrfs su snapshot opt/ opt2 Create a snapshot of 'opt/' in './opt2' /mnt/btrfs # ls home opt opt2 tmp usr var

Snapshoty jsou v BTRFS prosté subvolumy, které sdílí společná data s jiným subvolumem.
Defaultně jsou read-write.

Výpis qgroup pak vypadá následovně.

/mnt/btrfs # btrfs su li . ... ID 1105 gen 712160 top level 5 path opt2 /mnt/btrfs # btrfs qg sh -r . qgroupid rfer excl -------- ---- ---- ... 0/317 889212928 4096 1073741824 ... 0/1105 889212928 4096 0

Ve sloupcích je název qgroup, zabrané místo odkazované a vlastní, limit.

Pokud jsme vytvořili systém pouze na jednom zařízení, není zajištěna redundance.
Toho docílíme přidáním dalšího zařízení.
Samotná operace přidání ale nestačí k tomu, aby se data na nově přidané zařízení rozprostřela.
Pro tento účel existuje příkaz balance.
Další jeho funkcí je konvertovat rozložení dat (single, RAIDx).

/mnt/btrfs # btrfs dev add /dev/sda3 . /mnt/btrfs # btrfs balance start -dconvert=raid0 -mconvert=raid1 .

Oproti ZFS je podporováno online změna velikosti file systému.
Nároky na použití jsou také nižší. Doporučuje se 1 GB místa na disku a 128 MB RAM.

Pro kontrolu dat na disku má btrfs příkaz scrub. Ten přečte všechna data a metadata a použije kontrolní součty pro odhalení chyb. Pro opravy použije redundantní kopie z RAID zařízení.

/mnt/btrfs # btrfs scrub start . /mnt/btrfs # btrfs sc status . scrub status for b4793685-b88a-4480-8869-437f71554959 scrub started at Thu Sep 4 16:28:51 2014 and finished after 276 seconds total bytes scrubbed: 31.91GiB with 0 errors

Kompresní algoritmus můžeme volit lzo, rychlý a lepší pro SSD, nebo zlib, pomalejší s lepší kompresí.