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.
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á).
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).