Tu a tam se stane, že potřebujete zálohovat nějaké soubory. Třeba maily nebo web. Nebo třeba celý server. Můžete jednoduše vzít adresář a překopírovat jej do jiného umístění. A zítra tu starou zálohu přejmenovat a soubory zkopírovat znovu. Ale když vaše data mají nějakých 50 GB a zálohujete off-site na pomalém připojení, není to úplně to pravé ořechové.
Hardlink - Pevný odkaz
S větším množstvím souborů narůstá šance, že většina z nich zůstane nezměněna. Chtělo by to tedy něco, co umožní nezměněný soubor místo stažení pouze vytáhnout ze staré zálohy. Anebo ještě líp - prostě na něj odkázat. Přesně k tomuhle účelu poslouží hardlinky. Jednoduše z nové zálohy odkážou na soubor ve staré záloze. Na rozdíl od symlinků, které pouze odkazují na soubor nebo adresář v jiném umístění, hardlinky odkazují přímo na záznam v souborovém systému, takže stále fungují, i když „zdrojový“ soubor smažete. Respektive soubor není fyzicky smazán, dokud na něj odkazuje alespoň jeden hardlink.
Ferda Mravenec přes zálohy
Pokud jste někdy koukali do manuálu k rsyncu, asi víte, že toho umí opravdu mnoho. Vytváření inkrementálních záloh umí také, jen mu musíte vysvětlit co, odkud a kam chcete. Klasický zálohovací one-liner
rsync -a /zdroj /zaloha
je třeba rozšířit o parametr link-dest, který říká, odkud se mají brát hardlinky na nezměněné soubory. Toto umístění zpravidla označuje starou zálohu.
Zálohujete-li více adresářů, bude se vám jistě hodit i parametr include-from, kam zadáte jméno souboru s informacemi o tom, co vše se bude zálohovat. A protože starší zálohy asi budete chtít archivovat, můžete si pro lepší přehled dovolit použít i parametr delete, takže záloha nebude obsahovat již smazané soubory a bude skutečně shodná s originálem.
rsync -a --delete --include-from=/zalohy/backup.inc --link-dest=/zalohy/current /zdroj /zaloha
Takový backup.inc pak může vypadat třeba následovně:
+ etc
+ etc/firewall.conf
+ etc/cron.d
+ etc/cron.d/**
+ etc/postfix
+ etc/postfix/**
+ var
+ var/mail
+ var/mail/**
+ var/www
+ var/www/**
- var/www/nezalohovat
- var/www/nezalohovat/**
- *
Jak jste asi pochopili, znaménko plus značí, co se bude zálohovat a mínus co se přeskočí. Jedna hvězdička pak znamená „vše v této složce“, dvě hvězdičky „vše v této složce a podsložkách“, přičemž pravidla se, jako v každém slušném programu, aplikují shora dolů.
Celou zálohovací rutinu pak můžete automatizovat skriptem
#!/bin/bash
DATE=`date "+%Y-%m-%d_%H-%M"`
BACKUP_DIR="/zalohy"
mkdir $BACKUP_DIR/backup_$DATE/
rsync -az --delete --include-from=/zalohy/backup.inc --link-dest=$BACKUP_DIR/current/ user@example.com:/ $BACKUP_DIR/backup_$DATE/
rm -rf $BACKUP_DIR/current
ln -s $BACKUP_DIR/backup_$DATE $BACKUP_DIR/current
if [ `ls $BACKUP_DIR -1 | wc -l` -gt 180 ]; then
rm -rf $BACKUP_DIR/`ls $BACKUP_DIR -t1 | grep backup_ | head -n 1`
fi
díky kterému budete mít ve svých zálohách přehled
[root@localhost zalohy]# ll | tail -n 10
drwxr-xr-x 6 root root 4096 Oct 16 08:00 backup_2011-10-16_08-00
drwxr-xr-x 6 root root 4096 Oct 16 12:00 backup_2011-10-16_12-00
drwxr-xr-x 6 root root 4096 Oct 16 16:00 backup_2011-10-16_16-00
drwxr-xr-x 6 root root 4096 Oct 16 20:00 backup_2011-10-16_20-00
drwxr-xr-x 6 root root 4096 Oct 17 00:00 backup_2011-10-17_00-00
drwxr-xr-x 6 root root 4096 Oct 17 04:00 backup_2011-10-17_04-00
drwxr-xr-x 6 root root 4096 Oct 17 08:00 backup_2011-10-17_08-00
drwxr-xr-x 6 root root 4096 Oct 17 12:00 backup_2011-10-17_12-00
drwxr-xr-x 6 root root 4096 Oct 17 16:00 backup_2011-10-17_16-00
lrwxrwxrwx 1 root root 35 Oct 17 16:00 current -> /zalohy/backup_2011-10-17_16-00
A nejlepší na tom je to, že stahujete jen ty soubory, které se skutečně změnily. Takže místo 50 GB stahujete třeba jen 20 MB, což je únosné i na ADSL nebo jiném dial-upu.