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
Naposledy změněno: 19.2.2007 15:10