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