BTRFS – úklidové práce

Technické navázání na článek btrfs po pěti letech a také na článek jarní úklid v linuxu. Dnes si řekneme něco o tom, jak btrfs udržet v dobré formě.

Defragmentace

Předminule jsem uváděl jednořádkový skript pro defrag všech souborů na oddíle:

find /home/backup -xdev -type f -print0 | xargs -0 -l1 btrfs fi defrag

Tohle už dnes není potřeba, příkazu btrfs filesystem defragment přibyl parametr -r (recursive).

Příklad: defragmentace adresáře /var/data

btrfs fi defrag -r /var/data

Vzhledem k tomu, že můžeme použít volbu připojení autodefrag, lze manuální defragmentaci považovat za zbytečnou. Jenže, příkaz defrag dostal i mnohem zajímavější parametr -c (compress), díky kterému můžeme zkomprimovat data pouze ve vybraných adresářích.

BTRFS umožňuje mít data na disku v mnoha různých formách. Pokud existující fs připojíme s volbou compress, nová a změněná data budou na tento fs zapsaná v komprimované podobě. Potom můžeme změnit parametr compress a určit si konkrétní algoritmus. Na disku tak budeme mít bloky dat, které nejsou komprimované vůbec a vedle nic také bloky komprimované různými algoritmy. Z hlediska userspace je vše transparentní.

Zatím jsou pouze omezené možnosti, jak určit, která data mají být jak komprimována, to se ale časem změní, plánuje se možnost nastavit compress per subvolume.

Příklad komprimace (a defragmentace) adresáře maildir:

btrfs fi def -v -r -c Maildir/

Balance

Pokud používáte btrfs nad více disky, po přidání nebo odebrání zařízení se data nijak automaticky nepřeskupí. Na novém disku nebudou žádná data. Jen nově zapsaná.

V intenzívním provozu to nijak nevadí, data se časem sama rozhodí tak jak budou zapisována. Chceme-li tento proces urychlit, můžeme použít příkaz balance:

btrfs device add /dev/sdc /mnt
btrfs filesystem balance /mnt

Dalším použitím příkazu balance, je změna módu raidu (s tím už jsme se setkali minule):

btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt

Příkaz balance ale nabízí i filtry, pomocí kterých můžeme vybírat, které bloky chceme nějak zpracovat. Nejvíce se nám asi bude hodit řešení „plného prázdného disku“, tedy stavu, kdy btrfs hlásí plný disk, který je přitom zaplněn jen z části:

btrfs balance start -dusage=0 /mnt

Filtr -d (data) usage=0 (zaplnění bloku 0%) značí, že balance projde pouze prázdné bloky a označí je v mapě bloků jako skutečně prázdné. (Stejně jako příkaz defrag dostal svůj interní proces aktivovaný volnou autodefrag, dá se očekávat, že i balance prázdných bloků bude řešen interním procesem.  V každém případě je dobré vědět, jak se vyhrabat z různých chybových stavů.)

Scrub

Systém souborů si ke každému bloku vede jeho checksum. Při čtení bloku se data porovnávají s tímto součtem. V případě, že součet nesedí, systém přečte data z jiného disku (pokud takový existuje) a na původním je opraví. Pokud další disk není, btrfs ohlásí chybu. Chyby se píší do systémového logu.

Jistě je dobré mít možnost si konsistenci dat ověřit i jinak než „vše přečíst“. Od toho je příkaz scrub:

btrfs scrub start /mnt

Spustí proces běžící na pozadí. Scrub můžeme pozastavit, zcela vypnout a také sledovat stav:

btrfs scrub status /mnt/btrfs_pool
  scrub status for 83f38077-90b4-49cd-9fac-8cc1204098ce
  scrub started at Tue May 5 13:48:30 2015, running for 60 seconds
  total bytes scrubbed: 29.66GiB with 0 errors

Díky tomu, že btrfs ví, které bloky jsou obsazené, nekontroluje celé místo (tak jako například kontrola mdadm raidu), ale jen místo s daty.

Statistiky chyb

Posledním příkazem, který ale na rozdíl od předchozích nic nedělá, je zobrazení statistik chyb příkazem device stats:

btrfs device stats /mnt/btrfs_pool
[/dev/sda3].write_io_errs 0
[/dev/sda3].read_io_errs 0
[/dev/sda3].flush_io_errs 0
[/dev/sda3].corruption_errs 0
[/dev/sda3].generation_errs 0
[/dev/sdb].write_io_errs 0
[/dev/sdb].read_io_errs 0
[/dev/sdb].flush_io_errs 0
[/dev/sdb].corruption_errs 0
[/dev/sdb].generation_errs 0
[/dev/sdh].write_io_errs 0
[/dev/sdh].read_io_errs 0
[/dev/sdh].flush_io_errs 0
[/dev/sdh].corruption_errs 0
[/dev/sdh].generation_errs 0
[/dev/sdg].write_io_errs 0
[/dev/sdg].read_io_errs 0
[/dev/sdg].flush_io_errs 0
[/dev/sdg].corruption_errs 0
[/dev/sdg].generation_errs 0

Pokud cokoliv není nula, je dobré zjistit v jakém je disk stavu. Nemusí se jednat přímo o selhávající disk, takto jsem například narazil na yet another vadný sata kabel.

Toť vše

Ani jeden z těchto příkazů není na každodenní používání. Balance můžeme použít po změně počtu disků. Defragmentace se hodí pro výběrovou komprimaci (do doby, než přijdou lepší možnosti nastavení). Někteří správci dávají do cronu scrub (vedle kontroly mdadm polí a smart testů), to je asi na každém, zda to považuje za nutné (btrfs chybu čtení stejně vykecá do logů). Do monitoringu se hodí dát chybové statistiky.

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

2 komentáře: BTRFS – úklidové práce

  1. Franta napsal:

    Díky za článek!

    BTW: jak řešíš šifrování? Líbí se mi mít RAID ve FS, protože, ale když pod tím budu chtít šifrovat, tak budu muset šifrovat všechna data dvakrát (RAID 1), což bude mít vliv na výkon. Případně se vzdát RAIDu v BTRFS a použít klasický MD RAID (takhle to zatím používám já).

    • Heron napsal:

      Díky :-)

      Šifrování řeším dvojím způsobem. Nešifruji celý disk (na ntb ano, ale tam mám jen jeden disk).

      Mám zašifrovaný soubor s fs, který v případě potřeby připojím (cryptmount).

      Druhý způsob je šifrování konkrétních dat. Konkrétní data jsou zašifrovaná (openssl) různými klíči (některé klíče ani nevlastním) a tak mohou být uloženy u mě, aniž by se jejich majitel bál, že si to přečtu.

      Takže mám buď šifrovaný kontejner s fs a vedle toho zašifrovaná konkétní data.

      Jak šifrovat btrfs multidevice nevím, asi nebyde, než šifrovat každé zařízení zvlášt (http://marc.merlins.org/perso/btrfs/post_2014-04-27_Btrfs-Multi-Device-Dmcrypt.html).

Komentáře nejsou povoleny.