Hlavní navigace

Souborový systém Btrfs: jak pohodlně a efektivně zálohovat

Josef Jebavý

Nedílnou součástí správy diskového systému je také dobré zálohování. V minulosti se používaly utility jako tar, rsync nebo pokročilejší nástroje jako Bacula. Pokud ale používáte Btrfs, můžete zálohovat lépe.

Doba čtení: 6 minut

Sdílet

Dříve se zálohovalo nástrojem tar, pak přibyly různé další nástroje. Výborný je např Rsync, jeho nadstavba rdiff-backup nebo se používají nástroje typu klient-server, například Bacula. Nyní se souborovým systémem Btrfs můžete zálohovat jednodušeji a navíc i efektivněji.

Souborový systém Btrfs má mnoho funkcí a díky snapshotům ho lze využít k zálohování. Díky implementaci, kdy se sdílí datové bloky, bude navíc takové zálohovaní velmi efektivní z hlediska zabraného místa na disku.

Když využijete všechny možnosti a zálohování navrhnete a implementujete dobře, dosáhnete toho, že budete mít zálohy, které budou zabírat místo jako přírůstkové, přitom je budete moci promazávat jednotlivě jako plné zálohy.

Data tak budou přímo přístupná a budou mít stejnou adresářovou strukturu, jako je má uživatel/aplikace na zálohovaném počítači. Případná obnova byť i jediného souboru se tak stane radostí.

Jednoduché zálohování

Pokud máte vytvořenou subvolume /mnt/btrfsbackup/ZALOHY, můžete do tohoto místa ukládat data. Můžete také průběžně z této subvolume vytvářet snapshoty, kdy každému nově vytvořenému snapshotu dáte do názvu i aktuální datum a čas.

Zálohy pomocí snapshotů můžete vytvářet tímto skriptem:

# DATE=`date +%Y-%m-%d_%Hh`
# btrfs subvolume snapshot /mnt/btrfsbackup/ZALOHY \
  /mnt/btrfsbackup/ZALOHY-${DATE}

Tím dosáhneme toho, že budeme mít historii adresáře verzovanou. Navíc veškerá historie je přístupná jako soubor a nezměněné verze soubory nezabírají žádné místo navíc. U změněných souborů zabírají místo jenom změněné bloky.

Viz dřívějšek článek Souborový systém Btrfs: práce se snapshotyVyzkoušejte si do adresáře /mnt/btrfsbackup/ZALOHY nahrát nějaký soubor, udělat snapshot, pak nějaký soubor smazat a udělat snapshot a pak porovnat obsahy původní a vytvořené subvolume  /mnt/btrfsbackup/ZALOHY-xxx.

root hacking tip

Zálohy

Jiný případ použití je, pokud budete používat server jako úložiště pro další stroje. Koncové zařízení však nebude nic vědět o souborovém systému Btrfs. Jednotlivá zařízení budou nějakým způsobem data pouze nahrávat na server. Nahrávání dat na server můžete umožnit pomocí protokolu ssh, ftps nebo jiným. Záleží i co budou umět používat koncová zálohovaná zařízení.

Pro každé zařízení vytvoříme subvolume v adresáři /mnt/databtrfs. Tedy například /mnt/databtrfs/zarizeni1. Každé zařízení bude do svého adresáře zálohovat data včetně souboru backup, který bude umístěn v kořeni zálohy. Jednou denně pomoci Cronu server spustí následující skript:

AdrZALOHY=/mnt/databtrfs
DATE=‘date +%Y-%m-%d_%Hh‘
for file in ‘ls $AdrZALOHY/*/backup ‘; do
  dir=‘dirname "$file"‘
  if [ -f $file ] ; then
    rm -f $file
    touch $dir
    btrfs subvolume snapshot $dir $dir-${DATE}
  fi;
done

Tento skript zajistí, že bude vytvořen snapshot z dané subvolume, ale to jen v případě, že tam zařízení nahrálo nová data k zálohování. Skript to pozná právě podle souboru backup, který po vytvoření snapshotu smaže, aby příště opět mohl rozeznat, jestli přibyla nová data k zálohování.

Jedná se o příklad řešení pro nepravidelné zálohování. V takovém případě vytvářet každý den snapshot by bylo nepřehledné a budilo by to mylný dojem, že je zařízení pravidelně zálohováno.

Pokud byste chtěli vyhledávat a promazávat zálohy podle času, kdy byly vytvořeny, je k tomu možné použít běžný příkaz find. Vzhledem k tomu, že vytvoření subvolume nemění čas změny adresáře, tak právě k nastavení aktuálního času změny je použit ve skriptu příkaz touch a program find díky tomu muže dohledat zálohy podle času.

Tímto příkazem se vám vypíší zálohy/adresáře starší 90 dní:

# find /mnt/backup/ -maxdepth 1 -type d -mtime +90 -exec echo

Vyhledání podle stáří můžete zkombinovat se smazáním snapshotů. Skript na smazání záloh starších 90 dní:

# find /mnt/backup/ -maxdepth 1 -type d -mtime +90 -exec btrfs subvolume delete {} \;

Efektivní zálohování mezi dvěma stroji

Ideální řešení je, pokud zdrojový i cílový stroj mají souborový systém Btrfs. Pak můžete využit všech výhod souborového systému Btrfs, rychle zálohovat a přitom šetřit diskovým prostorem.

Právě k zálohování mezi dvěma stroji se souborovým systémem Btrfs využijete funkci send/receiveAbyste ji mohli použít, je potřeba vytvářet snapshoty read-only. K tomu sloučí přepínač r .

Názorná ukázka pro vytvoření takového snapshotu pouze ke čtení může vypadat takto: Mějme dva souborové systémy Btrfs btrfs1 a btrfs2. Nejdříve vytvoříme subvolume, která bude sloužit jako úložiště dat, které chceme zálohovat.Přejdeme do btrfs1 a vytvoříme subvolume:

# cd /mnt/btrfs1/
# btrfs subvolume  create zaklad

V subvolume vytvoříme soubor a ze subvolume uděláme snapshot.

# btrfs subvolume snapshot -r zaklad backup1

Tento snapshot, a tedy i jeho obsah, budeme chtít zálohovat na jiný souborový systém Btrfs. Pomocí příkazu btrfs send a receive to provedeme následujícím příkazem, kdy snapshot backup1 se zkopírujeme z btrfs1  na  btrfs2:

# btrfs send /mnt/btrfs1/backup1/ | btrfs receive /mnt/btrfs2/

Obsah snapshotu na druhém souborovém systému Btrfs vypíšete a tedy zkontrolujete příkazem:

# ls /mnt/btrfs2/
# ls /mnt/btrfs2/backup1

Vzhledem k tomu, že na zdrojovém i cílovém stroji je souborový systém Btrfs, tak při změně souboru se na druhý filesystém Btrfs nekopíruje celý soubor, ale pouze změna – změněné bloky. Což šetří místo a díky tomu se po síti přenáší i méně dat, takže i přenos je rychlejší. Také souborový systém Btrfs přesně ví, co bylo změněno, a proto nemusí trávit čas vyhodnocováním, co bude potřeba zálohovat.

Pokud chceme přenášet pouze změny mezi jednotlivými snapshoty, je potřeba uvést výchozí snapshot, od kterého se příkaz btrfs send odpíchne. Vytvořme další snapshot:

# btrfs subvolume snapshot -r zaklad backup2

Změny mezi tímto a předchozím snapshotem odešlete následujícím příkazem:

# btrfs send -p /mnt/btrfs1/backup1 /mnt/btrfs1/backup2 \
  |btrfs receive /mnt/btrfs2

Takto se přenesou pouze změny mezi snapshotem backup1backup2.

Vyzkoušejme nyní, jak je to s tím efektivním nakládáním s diskovým prostorem. Následujícím příkazem vytvoříme soubor o velikosti 4 GB:

# cd /mnt/btrfs1/zaklad
# dd if=/dev/zero  of=./file.bin bs=1MB count=4000

Vytvořme snapshot backup3:

# btrfs subvolume snapshot -r zaklad backup3

Přenesme změny nového snapshotu na druhý souborový systém Btrfs následujícím příkazem:

# btrfs send -p /mnt/btrfs1/backup2 /mnt/btrfs1/backup3 \
  |btrfs receive /mnt/btrfs2

Přenos 4 GB dat bude chvíli trvat a po něm soubor mírně upravte. Můžete ho otevřít v nějakém editoru a upravit jeden bajt, nebo následujícím příkazem na konec souboru připíšete jeden znak:

# echo "a" >>  /mnt/btrfs1/zaklad/file.bin

Vytvořme snapshot backup4:

# btrfs subvolume snapshot -r zaklad backup4

Rozdíl mezi snapshotem backup3 a backup4 opět přeneseme na druhý souborový systém Btrfs příkazem:

# btrfs send -p /mnt/btrfs1/backup3 /mnt/btrfs1/backup4 \
  |btrfs receive /mnt/btrfs2

Tentokrát byl přenos velmi rychlý. To proto, že se nepřenášel celý soubor, ale pouze jeden změněný bajt daného souboru.Můžete i zkontrolovat soubory pomocí kontrolních součtů, tím ověříte, že soubory jsou stejné:

# md5sum /mnt/btrfs1/backup4/file.bin
# md5sum /mnt/btrfs1/backup3/file.bin
# md5sum /mnt/btrfs2/backup4/file.bin
# md5sum /mnt/btrfs2/backup3/file.bin

Následujícím příkazem můžete ověřit, kolik místa je vlastně na disku zabráno a uvidíte, že to není 8 GB, ale pouze zhruba 4 GB.

# btrfs fi show

Můžete si i prohlédnout seznam subvolume a jejich vazby na druhém souborový systému Btrfs. Odpovídají tomu, jak jste uvedli, od které subvolume se má přenos odpíchnout.

# btrfs subvolume list /mnt/btrfs2

Více informací o obsazení místa na souborovém systému Btrfs viz druhý článek Souborový systém Btrfs: zprovoznění na počítači.

Jelikož btrfs send/receive podporuje rouru (pipe), je možno provádět send samozřejmě i skrze ssh. Následujícím příkazem pošlete data jinam:

# btrfs send /mnt/btrfs1/backup1 | \
  ssh root@remote-server "btrfs receive /mnt/btrfs2"

Zálohovat tak můžete pohodlně a efektivně na úplně jiný stroj v jiné geolokaci, čímž zajistíte maximálně bezpečnost svých dat.

Video

Pokud by tyto informace rád někdo slyšel spíše mluveným slovem, je zde záznam mojí přednášky na téma zálohování se souborovým systémem Btrfs:

Zálohování pro všechny

Je mnoho lidí, kteří ještě nezálohují a tak doufám, že tento návod to pomůže změnit. Protože zálohovat se souborovým systém Btrfs je tak jednoduché a přitom efektivní, že zálohovat může i ten, kdo si myslí, že to vůbec nepotřebuje.

V dalším díle si ukážeme některé pokročilé funkce při použití souborového systému Btrfs.