O nejrůznějších zálohovacích nástrojích jsme toho během let psali už opravdu hodně. Namátkou to byly například nástroje Duplicity, Pachy, Bup, Rdiff-backup a další. Dnes k nim přidáme další, jehož autoři o něm tvrdí, že je to deduplikační archivátor s kompresí a šifrováním
a jmenuje se Borg nebo plným názvem BorgBackup.
Co se dozvíte v článku
Deduplikace na všech úrovních
Jeho hlavní devízou je úspora kapacity při opakovaném zálohování průběžně se měnících dat. Používá k tomu masivní deduplikaci, kdy se každý kousek dat uloží do zálohy vždy jen jednou, byť by se na původním úložišti mnohokrát opakoval. To jednak šetří místo na disku, ale zároveň je možné opakované zálohy provádět velmi rychle.
Konkrétně to funguje tak, že jsou soubory rozděleny na různě velké bloky, pro každý z nich je vypočítán haš (HMAC-SHA256) a do zálohy jsou uloženy jen ty bloky, které v ní ještě nejsou. V každém repozitáři se zálohou se pak takový blok nachází právě jednou, bez ohledu na to, odkud pochází.
Deduplikace tak probíhá na všech možných úrovních v jednom repozitáři: napříč všemi předešlými zálohami, všemi zálohovanými stroji, ale i disky a dokonce i uvnitř jednotlivých souborů. Kdekoliv se určitý blok opakuje, Borg ho nemilosrdně asimiluje, deduplikuje a uloží jen jednou.
Výhodné je to zejména pro moderní dynamická prostředí, kde se data migrují mezi různými uzly, mění svá úložiště nebo se doplňují do velkých souborů v případě obrazů virtuálních serverů. S tímhle vším si Borg bravurně poradí a vytváří minimalistické zálohy toho, co se skutečně změnilo.
Nejvíc práce na místě
Aby byl Borg rychlý, provádí všechnu svou práci na místním úložišti. Rychle vyhledává nezměněné soubory a zabývá se jen tím, co se od poslední zálohy pohnulo. Metadata o jednotlivých souborech si také nechává na místním disku, aby k nim měl přístup při příštích zálohách a nemusel je znovu počítat.
Výsledek své práce pak může volitelně komprimovat pomocí jednoho ze čtyři algoritmů:
- lz4 – velmi rychlý, nízký stupeň komprese
- zlib – střední rychlost i komprese
- lzma – nízká rychlost, vysoký stupeň komprese
- zstd – univerzálně konfigurovatelný
Vedle toho je možné zálohu také zašifrovat, což je dobrý nápad, pokud ji budete poté třeba nahrávat na úložiště nějaké veřejné cloudové služby. Šifrování probíhá pomocí ověřeného symetrického algoritmu AES-256 a integritu zajišťuje HMAC-SHA256.
Vytváříme zálohu
Nejprve je potřeba nástroj nainstalovat, což není nic těžkého, protože bývá součástí distribučních repozitářů. Stačí tedy jednoduše zavolat například:
# apt install borgbackup
V tuto chvíli musíme vytvořit nový repozitář. Během tohoto kroku můžeme zároveň zapnout šifrování tohoto repozitáře. Je to rozhodně doporučovaná varianta, zálohovat bez šifrování není nikdy dobrý nápad. Pozor také na to, že šifrování v repozitáři nelze zapnout dodatečně. Vhodný postup je následující:
# borg init --encryption=repokey /backup
Inicializujeme nový repozitář, zapínáme šifrování pomocí klíče chráněného frází (heslem) a ukazujeme cestu pro uložení repozitáře. Borg se nás zeptá na frázi, vygeneruje klíč a uvedenou frází jej zašifruje. Zároveň zobrazí varování, že je potřeba si klíč někam zálohovat. Bez jeho znalosti totiž už nikdy nepřečtete obsah záloh.
Klíč je uložen v kořenovém adresáři repozitáře v souboru config
. Buď si někam zkopírujte přímo tento soubor nebo můžete využít funkce Borga a nechat si jej exportovat.
# borg key export /backup zaloha_klice.txt
Nastal čas vytvořit zálohu. K tomu musíme znát frázi k našemu klíči, musíme určit co chceme zálohovat (které adresáře) a také určíme cestu k repozitáři a archiv si pojmenujeme. Výsledný příkaz pak vypadá takto:
# borg create /backup::archiv1 /var/www/example.com/
Kromě toho můžeme určit, že se má záloha komprimovat, k čemuž slouží parametr --compress
. K němu ještě musíme doplnit použitý algoritmu a kompresní poměr, takže například zlib,9
.
Můžeme hned spustit zálohu znovu a přidat parametr --stats
, který zobrazí statistiky, týkající se vytvářené zálohy. Dozvíme se, jak je velká, jak velká část je deduplikovaná a kolik celkem jednotlivé archivy zabírají místa na disku.
------------------------------------------------------------------------------ Archive name: archiv2 Archive fingerprint: f6463b0a2ff2ee836e0963dc3ac4dd0b5df48c871946dc0619652652d43ef1e4 Time (start): Tue, 2022-12-06 12:11:17 Time (end): Tue, 2022-12-06 12:11:17 Duration: 0.01 seconds Number of files: 39 Utilization of max. archive size: 0% ------------------------------------------------------------------------------ Original size Compressed size Deduplicated size This archive: 1.01 MB 831.16 kB 479 B All archives: 2.01 MB 1.66 MB 673.76 kB Unique chunks Total chunks Chunk index: 32 82
Obnovujeme zálohu
Nejprve si můžeme vypsat podrobnosti o tom, jak vypadá náš repozitář a jaké archivy obsahuje:
# borg list /backup/ Enter passphrase for key /backup: archiv1 Tue, 2022-12-06 12:10:59 [705d124e2f84e1dfbf77635786970e617dbcf3131f96c0b8ab64408c1fb1e49b] archiv2 Tue, 2022-12-06 12:11:17 [f6463b0a2ff2ee836e0963dc3ac4dd0b5df48c871946dc0619652652d43ef1e4]
Můžeme si také vypsat soubory ve kterémkoliv archivu:
# borg list /backup/::archiv2
Stejně tak máme možnost si jednotlivé archivy porovnat a nechat si vypsat změny, které mezi jejich vytvořením vznikly. Dozvíme se, které soubory byly přidány ( added
), upraveny ( modified
) či odstraněny ( removed
).
# borg diff /backup/::archiv1 archiv2
Pro vybalení konkrétního archivu do aktuálního umístění stačí zavolat:
# borg extract /backup/::archiv2
Pokud potřebujeme z archivu dostat jen jeden soubor, nastupuje velmi příjemná možnost celý obsah si připojit do některého adresáře a procházet jej jako souborový systém. Využívá se k tomu univerzální subsystém FUSE, který dokáže s pomocí uživatelského procesu proměnit prakticky jakákoliv data v adresářovou strukturu.
# mkdir /mnt/zaloha/ # borg mount /backup/::archiv2 /mnt/zaloha/
Pokud vám připojování selže na chybu ImportError: No module named 'llfuse'
, doinstalujte si balíček python3-llfuse
. Jakmile se vám podaří archiv připojit, můžete z adresáře kopírovat soubory dle potřeby. Obsah je připojen pouze ke čtení, takže do něj nemůžete zapisovat. Když jste spokojeni s výsledkem, můžete vše zase odpojit:
# borg umount /mnt/zaloha/
Vzdálený repozitář
Záloha by samozřejmě nebyla zálohou, pokud by zůstala na svém původním místě. Borg tedy pochopitelně umožňuje zálohy nahrát vzdáleně na zálohovací server. Lze k tomu použít jednak přenos souborů po SSH nebo je možné využít nějakého vzdáleného souborového systému připojeného lokálně.
Třetí, nejrychlejší a zároveň nejbezpečnější možností je zálohování přímo proti serverové instanci Borgu. V takovém případě se jako přenosový kanál využívá SSH, ale klienti nemají přístup k souborům na vzdáleném disku. Mohou komunikovat pouze s příslušným procesem, který může být nakonfigurován pouze k přijímání nových záloh.
V takovém režimu nemůže klient vzdálené zálohy poškodit nebo odstranit. Pokud by například došlo k úspěšnému průniku ransomware na jeden ze serverů, nebude archiv záloh nikterak ohrožen, jako by tomu bylo v případě prostého kopírování souborů na vzdálený souborový systém. O správu záloh včetně případného odstraňování starých nepotřebných verzí se pak stará server samotný.
Použití vzdáleného repozitáře je v principu stejné jako u toho lokálního, který jsme si ukazovali doposud. Jen místo cesty k místnímu adresáři používáme cestu vzdálenou. Voláme tedy například:
# borg init --encryption=repokey backuper@backup.example.com:/home/backups/ # borg create backuper@backup.example.com:/home/backups/::06-12-2022 /var/www/ # borg mount backuper@backup.example.com:/home/backups/::06-12-2022 /mnt/zaloha/
Všechny tyto operace fungují úplně stejně, jako byste adresář s repozitářem měli lokálně u sebe. Rozhodně doporučuji kombinovat takovou práci s přihlašováním k SSH pomocí klíčů. Je to bezpečnější a pohodlnější než zadávání hesel.
Spuštění serveru Borg
Jak už bylo zmíněno, nemusíme dávat klientovi plný přístup k SSH na zálohovacím serveru. Můžeme na druhé straně vynutit spuštění Borga v serverovém režimu. Provedeme to tak, že u vzdáleného uživatele (v našem příkladě se jmenuje backuper
) editujeme soubor ~/.ssh/authorized_keys
a před jeho veřejný klíč připíšeme kousek konfigurace.
command="borg serve --restrict-to-path /home/backuper/backup/",restrict ssh-rsa AAAAB3[...]
Uživatel se pak nemůže připojit pomocí běžného SSH klienta, protože mu po autorizaci nenaskočí shell, ale rovnou Borg v roli serveru. Pokud se k němu nepřipojíte Borgem, ale jiným klientem, dostanete chybu a budete vyhozeni:
$LOG ERROR borg.archiver Remote: Borg 1.1.16: Got unexpected RPC data format from client.
Pokud správně použijete na klientské straně zálohovač Borg, bude se vám vše jevit úplně stejně, jako před úpravou. Jen si nemůžete vymýšlet cestu k archivům úplně libovolně, ale máte ji pevně danou už na serveru.
Velmi užitečný je také volitelný parametr --append-only
, který dovolí pouze přidávání nových záloh a znemožní například vzdálené odstranění těch starých.
Odstranění starých záloh
Zálohy je potřeba tvořit, ale také někdy odstraňovat ty staré, aby nám repozitář nerostl nade všechny meze. Musíme tedy stanovit nějakou politiku zálohování a podle ní udržovat v daných časových úsecích určitý počet záloh. Typické je zálohování v modelu „děda-otec-syn“ (GFS), při kterém se zálohuje ve třech nebo více cyklech, například denně, týdně a měsíčně. Čím delší časové okno máme, tím méně záloh v něm také udržujeme. Přístup se ale může lišit podle konkrétního použití.
K průběžnému čistění repozitáře slouží funkce prune, která ve výchozím stavu postihuje všechny archivy napříč repozitářem, pokud některé z nich nevybereme podle prefixu parametrem --prefix
. Takové čistění je potenciálně nebezpečné, protože můžete přijít o důležité zálohy. Doporučuje se proto jej spouštět tak, abyste si nejprve prohlédli, jaké změny budou případně provedeny:
# borg prune -v --list --dry-run …
Pokud například budeme chtít udržovat sedm posledních denních záloh, čtyři poslední týdenní a šest měsíčních, bude příkaz vypadat takto:
# borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=6 /backup
Kromě tohoto čistění máme samozřejmě možnost vymazat i kompletní repozitář či některé archivy v něm. Opět je tu možné použít parametr --dry-run
a přesvědčit se, že příkaz pak udělá přesně to, co očekáváme.
# borg delete /backup/::archiv2
Důležitá poznámka: Toto promazávání záloh automaticky neuvolní místo na disku. K tomu je pak ještě potřeba zavolat parametr compact
, což provede odstranění nepotřebných kusů souborů napříč repozitářem. Nějakou dobu to trvá, takže si můžete pomocí parametru --progress
zobrazit informace o průběhu. Tato akce také nevyžaduje klíč, takže ji můžete pouštět i na vzdáleném úložišti třeba pomocí cronu. Pozor také na to, že tato funkce přibyla až ve verzi 1.2.
# borg compact /backup/
Pokud zálohujeme na server v režimu pouze pro připisování (append only), nemůžeme výše popsané čistění na dálku vůbec provádět. To je chtěná vlastnost, která brání změnám ve starších zálohách. Přesto nám nic nebrání tyto příkazy spouštět přímo na serveru, z jehož hlediska je repozitář na lokálním disku. Pokud na něj máme právo zápisu a známe frázi ke klíči, můžeme se o repozitář starat.
Zálohy s Borgem
Ukázali jsme si základní použití zálohovacího nástroje Borg, který má samozřejmě mnoho dalších možností. Jeho výhodou je, že je možné na internetu najít řadu služeb, které jej podporují a umožňují skrze něj ukládat zálohy. Ve webovém rozhraní pak můžete vidět jednotlivé repozitáře a nastavovat pravidla pro uchovávání jednotlivých záloh.
Další podrobnosti naleznete na domovské stránce nebo v podrobné dokumentaci. V ní naleznete také řadu příkladů a užitečných tipů, jak správně zálohovat a jak k tomu použít Borg. Kompletní dokumentace je také součástí balíčků, kde najdete manuálové stránky ke všem parametrům, pokud je od názvu programu oddělíte pomlčkou. Zkuste například man borg-create
. Úspěšné zálohování!