Pythonovský skript Duplicity slouží ke snadnému vytváření a obnovování inkrementálních záloh, které dokáže i šifrovat. Navíc v maximální možné míře šetří objem přenesených dat. K tomu používá dobře známý protokol programu rsync, konkrétně implementovaný v knihovně librsync. V tomto ohledu je přístup Duplicity stejný jako jeho mladšího bratra, programu rdiff-backup, o kterém jsme již na Rootovi psali.
Co je však rozdílné, je přístup k úložišti zálohy. Duplicity dokáže uložit zálohu na jakékoli úložiště, přičemž ze strany úložiště není třeba žádná kooperace. Protože zálohy mohou být šifrovány a podepisovány, není problém přenášet je po síti třeba obstarožním protokolem FTP. Jste-li příznivci cloudových řešení, nabízí Duplicity přímou podporu pro ukládání do služby Amazon S3.
Jak to funguje
Protokol rsync ke své činnosti potřebuje kontrolní součty a hashe jednotlivých částí souborů. Při spuštění rsync nejprve zdrojový i cílový soubor analyzuje, spočítá kontrolní součty jednotlivých částí souborů, následně vyhodnotí, které části je potřeba přenést a tyto přenese. Pokud jde o přenos přes síť, je třeba aby přenos probíhal vlastním protokolem rsync. Pak si klient a server vymění pouze nezbytné minimum dat. Naproti tomu pokud rsync spustíme lokálně a necháme jej přenášet například soubor z NFS svazku na lokální disk, k žádné úspoře přenosové kapacity nedojde. Rsync bude muset celý soubor z NFS svazku přečíst, aby bylo možné vůbec stanovit, které části se liší od lokálního souboru.
Stejným problémem trpí i rdiff-backup. Duplicity jej však obchází tak, že během vytváření zálohy zapisuje „stranou“ také spočtené kontrolní součty jednotlivých bloků. Soubor s těmito metadaty je relativně malý a tak kromě úložiště zůstává i na zálohovaném stroji. Při vytváření inkrementální zálohy již není třeba přečíst celý obsah úplné zálohy, spočtené kontrolní součty se porovnávají s dříve vypočítanými hodnotami. Mimochodem, stejný princip předem vypočtených kontrolních součtů využívá i program zsync, pomocí kterého můžete například výrazně urychlit stahování nových verzí Ubuntu.
Jak to spustit
Pokud jste někdy používali rdiff-backup, budete ve volbách pro výběr souborů k záloze jako doma. Základní syntaxe programu je:
$ duplicity [akce] [volby] <zdroj> <cíl>
Platí pravidlo, že na místě zdroje a cíle se cesta k úložišti záloh udává ve formátu URL, zatímco cesta k souborům, které mají být zálohovány, se udává přímo. Chceme-li například zálohovat adresář /home
do adresáře /zaloha
, použijeme následující příkaz:
$ duplicity /home file:///backup
Parametr akce je nepovinný. Duplicity samo určí z pořadí argumentů, zda je požadována záloha nebo obnovení, stejně tak automaticky podle obsahu úložiště určí, zda se má provést úplná nebo inkrementální záloha.
Bez dalšího nastavování Duplicity zálohy šifruje pomocí GnuPG symetrickou šifrou s heslem, na které se zeptá po spuštění. Pro neinteraktivní spuštění je možné heslo uložit před spuštěním programu do proměnné PASSPHRASE
. To ukazuje následující složitější příkaz, zároveň s příkladem, jak ukládat na vzdálený server prostřednictvím SFTP protokolu a přihlášení speciálním SSH klíčem:
export PASSPHRASE='MojeSifrovanaZaloha' duplicity --verbosity 5 --include-globbing-filelist filelist.txt \ --ssh-options="-oIdentityFile=duplicityscpkey_rsa -oIdentitiesOnly=yes" \ / scp://uploader@server.example.com//home/backup
V tomto případě zálohujeme celý kořenový adresář s výjimkami, popsanými v textovém souboru filelist.txt:
- /proc - /sys - /dev - /tmp - /var/tmp + /var/cache - **/.cache
Na pořadí záznamů v souboru záleží, při nalezení shody se další řádky neporovnávají. Jednoduchá hvězdička nahrazuje sekvenci libovolných znaků mimo lomítka, dvě hvězdičky nahrazují libovolnou sekvenci znaků.
Jak vypadá záloha
Po provedení zálohy se na cílovém úložišti vytvoří několik souborů. Vlastní zálohovaná data se ukládají v souborech s příponou difftar.gpg
, což je šifrovaný tar-archiv. Tento formát neobsahuje žádný index, při každém požadavku na získání byť jediného souboru je třeba přečíst celý archiv od začátku. Tento problém řeší Duplicity tak, že po dosažení určité velikosti (standardně 25 MB) soubor s archivem ukončí a pokračuje novým souborem. Index, obsahující informaci který soubor je ve kterém archivu, je uložen do souboru s příponou manifest.gpg
, což je šifrovaný textový soubor:
$ gpg -d duplicity-inc.20111029T163109Z.to.20111029T163140Z.manifest.gpg Hostname pc.example.com Localdir / Volume 1: StartingPath . EndingPath newfile3 3 Hash SHA1 264dbe702e1f3d8f037d24ec2f2a4faba039f9b6 Volume 2: StartingPath newfile3 4 EndingPath newfile4 Hash SHA1 d6a640f491ef717a99a13bcba7a2255727ee2b27
V tomto případě byly přidány do zálohované oblasti čtyři soubory newfile1
– newfile4
, Duplicity vygenerovalo dva tar archivy. Kromě archivů se zálohovanými daty a popřípadě přírůstky Duplicity vygeneruje ještě archiv s příponou sigtar.gpg
. Tyto archivy obsahují vypočítané kontrolní součty jednotlivých částí zálohovaných souborů. Spolu s manifestem zůstávají uloženy i zálohovaném počítači, standardně v cestě ~/.cache/duplicity/
. Pokud je však smažete, nic se neděje – při dalším použití Duplicity se obnoví z úložiště.
Další práce se zálohami
Nastavíme-li pravidelné zálohování, bude objem zaplněného prostoru v úložišti jen přibývat. Přehled o zálohách v úložišti získáme příkazem collection-status
:
$ duplicity collection-status file:///backup Type of backup set: Time: Num volumes: Full Sat Oct 29 18:02:51 2011 1 Incremental Sat Oct 29 18:05:11 2011 1 Incremental Sat Oct 29 18:20:55 2011 1 Incremental Sat Oct 29 18:21:56 2011 2 Incremental Sat Oct 29 18:31:40 2011 2
Obnovení některé zálohy docílíme jednoduše prohozením pořadí argumentů. Duplicity z bezpečnostních důvodů odmítne obnovovat zálohu do neprázdného adresáře. Chceme-li obnovit zálohu z konkrétního data, můžeme – opět obdobně jako u rdiff-backup – pomocí přepínače -t
určit okamžik, ke kterému si přejeme zálohu obnovit:
$ duplicity -t 2011-10-29T18:21:00+02:00 file:///backup ./restore
Aby bylo možné po čase staré zálohy smazat, je třeba vytvářet úplné zálohy častěji, než jen poprvé. Program si hlídá závislosti inkrementálních záloh a odmítne vymazat ty zálohy, které jsou nutné k obnovení novějších. Častější vytváření úplných záloh je také bezpečnější, neboť snižuje počet souborů, které jsou třeba k obnovení poslední verze. Vytvoření úplné zálohy programu vnutíme klíčovým slovem full
.
Odstranění záloh starších než např. dva týdny dosáhneme následujícím příkazem. Bez volby --force
program pouze vypíše seznam záloh k vymazání.
$ duplicity remove-older-than 2W --force file:///backup
Šifrování a podepisování
Kromě šifrování záloh symetrickou šifrou je také možné použít šifrování asymetrické, nebo šifrování vypnout, není-li potřeba. Pomocí přepínačů --encrypt-key
a --sign-key
je možné také nastavit různé asymetrické klíče pro podepisování a pro šifrování záloh. K čemu to může být dobré? Pro zašifrování zálohy stačí veřejná část klíče, teprve k podpisu je třeba privátní klíč. Pokud použijeme pro každou činnost jiný klíč, není třeba, aby zálohovaný stroj vůbec vlastnil privátní část šifrovacího klíče. Ta může být bezpečně uložena třeba v trezoru a použita pouze v případě, kdy bude třeba zálohy obnovit.
Vygenerování šifrovacích a podepisovacích klíčů je nad rámec tohoto článku, zájemcům doporučuji buď starší seriál GnuPG: Komunikace po Internetu bezpečně, nebo velmi podrobný článek Unattended, Encrypted, Incremental Network Backups
Závěr
K zálohování používám již delší dobu program rdiff-backup. Protože zálohy ukládám na linuxový server, je přenos efektivní a nemám důvod nic měnit. Pokud bych ale měl někdy v budoucnu ukládat zálohy na USB disk, popřípadě domácí NAS připojený přes NFS/CIFS, určitě použiji Duplicity.
Co používáte pro zálohování vy? Podělte se s ostatními v diskuzi pod článkem!