Zálohování pomocí programu rdiff-backup
Rdiff-backup je 
program napsaný v jazyce Python a slouží pro vzdálené zálohování 
souborů nebo adresářů. Rdiff-backup využívá některých vlastností programu 
mirror a rsync a navíc přidává podporu pro inkrementální zálohování. Podporuje 
ukládání podadresářů, hard linků i symbolických linků, speciálních 
souborů (v adresáři /dev), uchovává práva, 
vlastníka i skupinu souborů či adresářů, 
čas modifikace a rozšířené atributy souborů, rozšířená práva (ACL). 
Při zálohování vzdálených počítačů se využívá protokol ssh, tzn. data 
jsou po síti přenášena šifrovaně. Navíc je díky schopnosti vytvářet 
pouze rozdíly přenášených dat šetřena přenosová kapacita linky.
Rdiff-backup vytváří zálohu tím způsobem, že klasicky kopíruje data z jednoho adresáře (původního) do adresáře druhého (tedy záložního). Pokud je na straně počítače na který se zálohuje stejná funkcionalita (podpora ACL, EA, možnost změnit vlastníka souboru a podobně) jako na původním zálohovaném počítači, tak jsou zazálohovaná data identická jako původní data, což je výhodné, protože lze data ze zálohy obnovit prakticky pouze jejich zkopírováním a nejsou tedy vázána na opětovné použití programu rdiff-backup.
Pokud počítač na který se zálohuje nepodporuje některé funkcionality, které 
jsou na zálohovaném počítači, tak jsou tyto funkcionality zapsány do souboru s 
metadaty, který leží v adresáři se zálohovanými daty, konkrétně v podadresáři 
s názvem rdiff-backup-data. V tomto podadresáři lze nalézt 
i další informace o dané záloze jako jsou logy, statistiky a informace 
o příslušných ikrementech. 
Instalace
Instalace programu rdiff-backup v CentOSu je velice jednoduchá pokud máte přidán repozitář RPMForge. Pak lze program nainstalovat následujícím příkazem:
yum install rdiff-backup
Pro podporu ACL je zapotřebí doinstalovat python modul pylibacl a pro podporu rozšířených atributů pyxattr. Dag Wieers nám zase ulehčil práci, protože v repozitáři RPMForge jsou oba python moduly v podobě RPM balíčků k dispozici, takže je stačí pouze nainstalovat:
yum install python-libacl python-xattr
Pokud si budete chtít zálohování vzdálených počítačů zautomatizovat a spouštět jej například z cronu, tak je výhodné si nastavit přihlašování přes ssh protokol s využitím klíčů namísto hesel. O problematice vytváření a používání klíčů pro přihlašování přes ssh protokol pojednává článek "Ochrana SSH démona proti útokům (2)", každopádně zde vytváření klíčů ještě znovu zopakuji.
Příklady použití
Program rdiff-backup nemá parametr -h nebo 
--help jak jsme zvyklí u většiny 
příkazů v Linuxu, takže si případné parametry musíme nalézt v manulové stránce
(man rdiff-backup).
Vzhledem k tomu, že parametrů není mnoho a obsluha programu je poměrně
jednoduchá, tak tato absence parametrů pro krátkou nápovědu není nijak 
kritická.
Lokální záloha adresáře
Zálohu adresáře /etc do adresáře /mnt/backup/etc_backup na stejném počítači provedeme následujícím příkazem:
rdiff-backup /etc /mnt/backup/etc_backup
V adresáři /mnt/backup/etc_backup vznikl kromě 
zazálohovaných souborů a adresářů ještě podadresář 
rdiff-backup-data s níže uvedeným obsahem. Z názvů je zřejmé co 
se v daných adresářích a souborech nachází:
backup.log chars_to_quote current_mirror.2007-01-30T23:12:06+01:00.data error_log.2007-01-30T23:12:06+01:00.data.gz file_statistics.2007-01-30T23:12:06+01:00.data.gz increments mirror_metadata.2007-01-30T23:12:06+01:00.snapshot.gz session_statistics.2007-01-30T23:12:06+01:00.data
Vzdálená záloha adresáře
Vzdálená záloha adresáře je totožná jako lokální záloha s tím rozdílem, že na jedné straně uvedeme kromě adresáře i název počítače (nebo jeho IP adresu). Je také dobré vědět, že pro vzdálenou zálohu je zapotřebí, aby i na vzdáleném zálohovaném (či zálohovacím) počítači byl nainstalován program rdiff-backup. V opačném případě skončí pokus o zálohu vzdáleného počítače s chybou. Názorný příklad vzdálené zálohy:
rdiff-backup ondra@www.tachec.org::/home/ondra /home/ondra/tachec_home_backup
Výše uvedený příklad provede pod uživatelem ondra zálohu 
adresáře /home/ondra umístěného na serveru 
www.tachec.org do lokálního adresáře 
/home/ondra/tachec_home_backup na počítači ze kterého 
bylo zálohování spuštěno. Pokud 
máte nastaveno příhlašování přes ssh protolol s využitím klíčů, tak po vás 
nebude požadováno heslo, v opačném případě budete vyzváni k zadání hesla. 
Samozřejmě můžete udělat zálohu i opačně, tzn. zazálohovat lokální adresář někam na vzdálený počítač, příkaz bude následovný:
rdiff-backup /home/ondra/ ondra@www.tachec.org::tachec_home_backup
Dokonce lze provést i zálohu ze vzdáleného počítače na jiný vzdálený počítač:
rdiff-backup ondra@www.tachec.org::/home/ondra \ backup@backup.tachec.org::/mnt/backup/tachec_home_backup
Při nastaveném klasickém přihlašování přes ssh protokol na základě hesel po vás budou požadována hesla na oba vzdálené počítače.
Rdiff-backup podporuje i seznamy adresářů/souborů, které chceme 
(--include) nebo naopak nechceme 
(--exclude) zálohovat. Tyto seznamy lze načítat i ze souboru.
 Zálohu celého počítače můžeme s využitím těchto seznamů provést takto:
rdiff-backup --exclude /dev --exclude /proc --exclude /sys --exclude /tmp \ ondra@www.tachec.org::/ backup@backup.tachec.org::/mnt/backup/tachec_full_backup
Obnova adresáře
Obnovu adresáře (nebo v našem příkladu pouze jednoho souboru) lze 
provést klasickým příkazem cp 
nebo lépe zase programem rdiff-backup. Soubor .vimrc 
obnovíme ze zálohy umístěněné na serveru backup.tachec.org 
do lokálního adresáře /home/ondra tímto způsobem:  
rdiff-backup -r now backup@backup.tachec.org::/mnt/backup/tachec_home_backup/.vimrc \ /home/ondra/.vimrc
Parametr -r znamená obnovu a vyžaduje zadání hodnoty. 
Hodnota now znamená, že 
chceme obnovit soubor ze zálohy k dnešímu datu - tedy jeho poslední verzi. 
Pokud bychom chtěli obnovit ze zálohy nějakou starší verzi, tak místo hodnoty 
now uvedeme jiný časový údaj, například 30D 
pro 30 dní. Možné časové formáty hodnot parametru -r naleznete 
v manuálové stránce v sekci TIME FORMATS. 
Obnovu lze také provést přímo z daného souboru s inkrementy (cesta k souboru s inkrementem byla zalomena na dva řádky):
rdiff-backup backup@backup.tachec.org::/mnt/backup/tachec_home_backup/rdiff-backup-data/ /increments/.vimrc.2007-02-03T18:21:41+01:00.diff.gz /home/ondra/.vimrc
Promazávání starých souborů s přírůstky
Protože je někdy nežádoucí z důvodu úspory místa uchovávat staré verze souborů, tak lze tyto staré verze periodicky promazávat. Starší verze souborů než 4 týdny smažeme následovně:
rdiff-backup --remove-older-than 4W ondra@www.tachec.org::tachec_home_backup
Soubory, které se nezměnily například za poslední 2 měsíce zůstanou samozřejmě zachovány. Mazání se týka pouze více verzí jednoho souboru.
Získání informací o zálohovaném adresáři
Informace o jednotlivých přírůstcích v zálohovaném adresáři získáme příkazem:
rdiff-backup -l ondra@www.tachec.org::tachec_home_backup
Parametr --list-changed-since 7D vypíše všechny 
soubory a adresáře změněné 
za posledních 7 dnů. Parametr --list-at-time 7D 
vypíše všechny soubory 
a adresáře, které se nacházely v dané záloze před týdnem a nebyly 
změněny a ty co byly za poslední týden smazány. Pomocí parametru 
--compare můžeme porovnávat zálohovaný adresář 
s aktuálním adresářem.
rdiff-backup --compare /home/ondra/ ondra@www.tachec.org::tachec_home_backup
Dalším užitečným parametrem je parametr --test-server 
sloužící k ověření zda je na vzdáleném počítači funkční 
program rdiff-backup. Příklad použití:
rdiff-backup --test-server ondra@backup.tachec.org::/
Konfigurace zálohovacího počítače
Konfigurace zálohovacího počítače představuje nastavení pár věcí a protože není nad příklady z praxe, tak zde celou tuto konfiguraci uvedu. Níže uvedená konfigurace zálohovacího počítače je jednou z mnoha možností a ne každému musí vyhovovat.
Zálohovací počítač se bude jmenovat linux_backup, adresář 
pro zálohy bude /var/backup a zálohovat budu server 
s názvem www (nebude to kompletní záloha celého serveru, ale 
pouze některých adresářů). Zálohování nebudu provádět 
pod uživatelem root, ale pod neprivilegovaným 
uživatelem backup a navíc se 
bude zálohování provádět automaticky (využiji cron démon).
Nejprve si tedy na zálohovacím počítači (linux_backup) založíme 
uživatelský účet pro uživatele backup. Prototože se 
bude zálohovat z cronu, tak není zapotřebí, aby měl tento uživatel 
nastaven validní shell a nepotřebuje ani mít nastavené heslo.
adduser -s /sbin/nologin -d /var/backup backup
Přihlásíme se jako uživatel backup, pomocí příkazu:
su -m backup
a vygenerujeme si ssh klíče (bez "passphrase"), abychom nemuseli zadávat 
heslo pro přihlášení na zálohovaný server (www):
ssh-keygen -t rsa
Já jsem si klíč uložil do souboru /var/backup/.ssh/id_rsa_www. 
Pokud bude váš zálohovací počítač zálohovat více dalších počítačů, tak je na 
vašem rozhodnutí zda pro každý počítač budete mít různé klíče nebo jeden 
společný klíč.
Můžeme si ještě vytvořit konfigurační soubor /var/backup/.ssh/config do kterého si pro zjednodušení práce napíšeme následující direktivy:
host www-backup hostname www user backup identityfile /var/backup/.ssh/id_rsa_www compression yes protocol 2
Pokud zálohujete po lokální síti o rychlosti 100Mbit/s a více, tak komprese není potřeba. Máte-li jeden ssh klíč pro všechny počítače, které budete zálohovat, tak si tento konfigurační soubor nemusíte vytvářet.
Nezapomeneme nastavit bezpečná práva:
chmod 700 /var/backup/.ssh/ chmod 600 /var/backup/.ssh/config chmod 600 /var/backup/.ssh/id_rsa_www
Přihlásíme se jako uživatel root na počítač, který budeme chtít 
zazálohovat, v mém případě www a založíme zde stejného uživatele - 
tedy backup a zároveň zde vytvoříme adresář .ssh. 
adduser backup mkdir /home/backup/.ssh chown backup:backup /home/backup/.ssh
Zkopírujeme si (jako uživatel root - pokud nemáte povoleno 
přihlašování přes ssh na uživatele root, tak si musíte 
poradit jinak, třeba zkopírováním klíče myší z jednoho terminálu 
do druhého nebo podobně) veřejnou část klíče 
z počítače linux_backup na počítač, který budeme zálohovat, tedy 
na www. 
scp root@linux_backup:/var/backup/.ssh/id_rsa_www.pub /home/backup/.ssh/authorized_keys chmod 700 /home/backup/.ssh chmod 600 /home/backup/.ssh/authorized_keys
Otevřeme si soubor authorized_keys nějakým textovým editorem 
a přidáme do něj následující (zalomeno na dva řádky a zkáceno - 
ve skutečnosti musí být vše na jediném řádku):
command="sudo rdiff-backup --server --restrict-read-only /",from="linux_backup", no-port-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB3Nza...TwJ71E= backup@linux_backup
Abychom se dostali ke všem souborům na zálohovaném počítači, tak si na něm 
ještě nastavíme spouštění příkazu rdiff-backup přes 
sudo, tzn. pod identitou uživatele root, viz soubor
/etc/sudoers:.
backup ALL=NOPASSWD: /usr/bin/rdiff-backup --server --restrict-read-only /
To je z hlediska konfigurace vše, nyní již můžeme z počítače 
linux_backup provést zálohu pod uživatelem 
backup tímto způsobem:
rdiff-backup www-backup::/etc backup_etc
Pokud po vás není požadováno heslo a záloha proběhne, tak máte vše nastaveno v pořádku. V opačném případě si projděte znovu veškeré konfigurační soubory a případně se zkuste na zálohovaný počítač přihlásit přes ssh protokol se zapnutým debug módem.
Zautomatizování zálohování pak již spočívá jen v nastavení crontabu 
na zálohovacím počítači (linux_backup) pro uživatele 
backup a to příkazem crontab -e -u backup 
a zadáním:
20 2 * * * rdiff-backup www-backup::/etc backup_etc
Pokud se nechcete nastavovat s konfigurací do souboru 
authorized_keys, tak nemusíte, ale zálohování pak musíte 
volat pomocí příkazu:
rdiff-backup --remote-schema \ "ssh %s sudo /usr/bin/rdiff-backup --server --restrict-read-only /" \ www-backup::/etc backup_etc