Zálohy

rsync, borg, snapshoty, tar.

Záloha je druhá (a třetí) kopie tvých dat na jiném místě, ze které dokážeš data obnovit, když ta původní zmizí. A ona zmizí — disk jednou selže, ransomware ti soubory zašifruje, nebo si sám ve spěchu smažeš špatnou složku. Otázka není „jestli", ale „kdy". Kapitola ti ukáže, co je záloha (a co jen vypadá jako záloha), pravidlo 3-2-1, moderní nástroje jako rsync, borg a restic — a proč je netestovaná záloha vlastně žádná záloha.


Pár pojmů na úvod

  • Záloha (backup) = kopie dat na jiném médiu/místě, kterou lze obnovit nezávisle na originálu. Klíčové slovo je „nezávisle" — kopie na stejném disku není záloha.
  • Obnova (restore) = proces vrácení dat ze zálohy zpět. To je ten, na kterém záleží — záloha je jen prostředek, cíl je úspěšná obnova.
  • Snapshot = zmrazený stav souborového systému (btrfs, LVM) v čase. Rychlý, ale na stejném disku jako data. Skvělý na „vrať mě před update", ne na katastrofu.
  • Inkrementální záloha = ukládá jen to, co se od poslední zálohy změnilo. Šetří místo i čas oproti pořizování plné kopie pokaždé znovu.
  • Deduplikace = nástroj ukládá každý identický blok dat jen jednou, i když se opakuje ve spoustě souborů či verzí. Proto moderní zálohovače (borg, restic) zaberou málo místa.
  • Retence = pravidlo, jak dlouho a kolik starých verzí zálohy držíš (např. 7 denních, 4 týdenní).

Proč vůbec zálohovat

Data nezmizí jen „z blbosti". Existují tři typické scénáře a každý z nich potká skoro každého:

  • Disk selže. Mechanické i SSD disky mají omezenou životnost. SSD umře často bez varování — z minuty na minutu se nenamountuje a data jsou pryč. Žádný SMART tě nemusí stihnout varovat.
  • Ransomware / malware. Škodlivý program ti soubory zašifruje a chce výkupné. Pokud má přístup i k tvé „záloze" (připojený disk, síťová složka), zašifruje i ji. Proto se cení kopie offline.
  • Lidský omyl. Nejčastější příčina ztráty dat vůbec. Jedno špatné rm -rf, přepsaný soubor, smazaná databázová tabulka. V Linuxu neexistuje „koš" pro terminál — smazané je smazané.

💡 Zálohu neděláš pro sebe z minulosti, ale pro sebe z budoucnosti — pro ten den, kdy se ti sevře žaludek a napíšeš do vyhledávače „jak obnovit smazané soubory". Tehdy už je pozdě začínat.


⚠️ Pravidlo 3-2-1

Nejjednodušší a nejdůležitější poučka v celém zálohování. Zapamatuj si tři čísla:

  • 3 kopie dat — originál + dvě zálohy. Jedna kopie navíc ještě není bezpečí (co když selže při obnově?).
  • 2 různá média — např. interní disk + externí disk, nebo disk + cloud. Ne dvě složky na jednom disku.
  • 1 kopie mimo lokaci (off-site) — u kamaráda, na jiném serveru, v cloudu. Chrání před požárem, krádeží, bleskem — před událostí, která zničí celé místo najednou.
        ORIGINÁL            ZÁLOHA 1              ZÁLOHA 2 (off-site)
   ┌──────────────┐    ┌──────────────┐      ┌──────────────────────┐
   │  notebook    │───▶│ externí disk │      │  cloud / jiný server │
   │  (SSD)       │    │  (doma)      │      │  (jiné město)        │
   └──────────────┘    └──────────────┘      └──────────────────────┘
        kopie 1              kopie 2                  kopie 3
        médium A            médium B          médium B, jiná lokace

🚩 Klasická past: „mám zálohu na druhém oddílu stejného disku". To není 3-2-1 — je to jedna kopie na jednom médiu. Když disk fyzicky selže, zmizí originál i „záloha" naráz.


⚠️ Snapshot ≠ záloha

Snapshoty (btrfs, LVM) jsou skvělá věc — udělají se v mžiku a umožní „vrátit čas". Ale nejsou to zálohy a plést si to je jedna z nejdražších chyb:

  • Snapshot leží na stejném disku/poolu jako data. Když disk fyzicky odejde, snapshot odejde s ním.
  • Snapshot nechrání před smazáním celého poolu nebo formátem — zmizí spolu s ním.
  • Ransomware s dostatečnými právy dokáže snapshoty i smazat (btrfs subvolume delete).

K čemu snapshot je: krátkodobá pojistka typu „udělám snapshot před dnf upgrade, a kdyby se to rozbilo, vrátím se". Nebo jako konzistentní zdroj pro skutečnou zálohu — snapshot zmrazí stav a ty z něj v klidu odkopíruješ data pryč (viz tar níže).

# btrfs snapshot před riskantní akcí (rychlé, ale JEN na stejném disku!)
sudo btrfs subvolume snapshot -r / /.snapshots/pred-updatem

# ...update se nepovede...
# vrátit se ke snapshotu (zjednodušeně — detaily podle rozložení subvolume)

💡 Pravidlo palce: snapshot = „vrať mě o hodinu zpět na stejném stroji". Záloha = „obnov mě, i když ten stroj shoří". Potřebuješ obojí, ale nikdy nezaměňuj jedno za druhé.


Nástroje — čím zálohovat

Není jeden správný nástroj. Vyber podle toho, co zálohuješ a kam.

rsync — chytré kopírování

rsync synchronizuje soubory a kopíruje jen to, co se změnilo. Ideál na jednoduché „nakopíruj domovskou složku na externí disk".

# zrcadlení domova na externí disk (-a = zachovej práva/časy, --delete = smaž i to, co zmizelo ve zdroji)
rsync -a --delete /home/matej/ /mnt/backup/matej/

🚩 Prosté zrcadlo s --delete není verzovaná záloha — věrně propaguje i omylem smazané soubory a ransomware: co se zašifruje/smaže ve zdroji, přepíše se i v cíli. Proto k ochraně proti tomu potřebuješ verze (--link-dest níže) nebo nástroj jako borg/restic s historií.

Přidáním --link-dest vyrobíš inkrementální zálohy skoro zadarmo: nezměněné soubory se neukládají znovu, jen se na ně vytvoří hardlink na předchozí zálohu. Každá záloha pak vypadá jako plná kopie, ale místo zabere jen to, co přibylo:

rsync -a --delete \
  --link-dest=/mnt/backup/2026-07-11 \
  /home/matej/ /mnt/backup/2026-07-12/

🚩 rsync sám o sobě nešifruje obsah v cíli a neumí deduplikaci napříč soubory. Na cizí/cloudové úložiště se hodí spíš borg/restic.

borg a restic — moderní volba pro servery

borgbackup a restic jsou dnešní standard pro serverové zálohy. Umí naráz to, co rsync neumí:

  • Deduplikace na úrovni bloků — identická data uloží jen jednou (i mezi verzemi a soubory).
  • Komprese — záloha zabere méně místa.
  • Šifrování — obsah je v úložišti nečitelný bez klíče/hesla. Nutnost pro cloud a cizí servery.
  • Inkrementální — po první plné záloze se posílají jen změny, rychle a levně.
# borg: jednorázová inicializace šifrovaného úložiště
borg init --encryption=repokey /mnt/backup/borg-repo

# vytvoření zálohy (jméno archivu s datem), s kompresí
borg create --compression zstd \
  /mnt/backup/borg-repo::'{hostname}-{now:%Y-%m-%d}' \
  /home /etc

# smazání starých archivů podle retence (7 denních, 4 týdenní, 6 měsíčních)
borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=6 /mnt/backup/borg-repo
borg compact /mnt/backup/borg-repo   # teprve tohle reálně uvolní místo (borg 1.2+); prune jen odznačí

restic je koncepčně velmi podobný a navíc umí přímo do cloudů (S3, Backblaze B2, atd.) — skvělá volba pro off-site kopii z pravidla 3-2-1.

tar — archiv snapshotu

tar sbalí soubory do jednoho archivu (.tar, s kompresí .tar.gz/.tar.zst). Hodí se na jednorázový „zmrazený" archiv — třeba stavu ze snapshotu, konfigurace nebo malého projektu.

# archiv /etc s kompresí zstd a datem v názvu
sudo tar --zstd -cf /mnt/backup/etc-2026-07-12.tar.zst /etc

💡 tar neřeší inkrementalitu ani deduplikaci sám za tebe. Je to „sbal a odlož", ne zálohovací systém. Ale je všude, rozumí mu každý Linux, a je super jako doplněk.


⚠️ Testuj obnovu — netestovaná záloha = žádná záloha

Nejčastější a nejbolestivější lekce v celém oboru: lidé roky zálohují, jsou v klidu — a v den katastrofy zjistí, že se záloha nedá obnovit. Skript tiše selhával, cíl byl plný, šifrovací heslo se ztratilo, zálohovaly se prázdné soubory. Nikdo to nikdy nezkusil.

Zálohu, kterou jsi nikdy neobnovil, nemáš. Máš jen naději. Proto pravidelně:

# borg: vypiš archivy a zkontroluj integritu úložiště
borg list /mnt/backup/borg-repo
borg check /mnt/backup/borg-repo

# zkušební obnova do dočasné složky (NE přes originál!)
mkdir -p /tmp/restore-test && cd /tmp/restore-test
borg extract /mnt/backup/borg-repo::hostname-2026-07-12   # naostro obnoví do aktuální složky

🚩 Obnovu testuj naostro aspoň jednou: vezmi konkrétní soubor, obnov ho do dočasné složky a porovnej obsah. „Skript proběhl bez chyby" není důkaz — důkaz je soubor, který otevřeš a je celý.


Automatizace — ať na to nemusíš myslet

Ruční záloha je záloha, na kterou jednou zapomeneš. Proto ji spouštěj automaticky — přes cron nebo systemd timer (viz kapitola o cron a systemd). Základní myšlenka:

# systemd timer (doporučeno na moderních distrech) spustí zálohovací službu např. každou noc
# viz kapitola „cron a časovače" — timer + service, který volá borg/restic skript

💡 K automatizaci vždy přidej hlášení výsledku — mail nebo notifikaci „záloha OK / SELHALA". Tichý cron, který půl roku selhává, je horší než žádná záloha, protože se na něj spoléháš.


Zálohuj i konfigurace a databáze (správně)

Data v /home nejsou všechno. Na dvě věci se často zapomíná:

  • Konfigurace (/etc) — nastavení systému, služeb, sítě, firewallu. Když server shoří, ušetří ti hodiny ručního nastavování znovu. /etc je malé, zálohuj ho vždy.
  • Databáze — a hlavně správně. Kopírovat živé datové soubory běžící databáze je cesta k poškozené, neobnovitelné záloze (databáze do nich zapisuje uprostřed kopírování). Vždy použij dump:
# PostgreSQL: konzistentní dump celé databáze do souboru
pg_dump -U postgres mojedb > /mnt/backup/mojedb-2026-07-12.sql

# MySQL / MariaDB
mysqldump -u root -p mojedb > /mnt/backup/mojedb-2026-07-12.sql

🚩 Dump ti dá konzistentní stav v jednom okamžiku, který jde spolehlivě obnovit. Kopie živých .ibd/base/ souborů za běhu = ruleta. Buď dump, nebo záloha ze snapshotu se zastavenou službou.


Failure modes — časté omyly

  • Netestovaná obnova. „Zálohuju roky." Ale nikdy neobnoveno → v den D zjistíš, že to nefunguje. Zálohu bez otestované obnovy nepočítej.
  • Jen jedna kopie / na stejném disku. Druhý oddíl stejného disku není druhé médium. Fyzické selhání disku vezme originál i „zálohu" naráz. Poruš pravidlo 3-2-1 a jednou zaplatíš.
  • Snapshot považovaný za zálohu. Btrfs/LVM snapshot leží na stejném poolu — nechrání před selháním disku ani smazáním poolu. Je to pojistka „před updatem", ne záloha.
  • Záloha bez šifrování na cizí úložiště. Nešifrovaný archiv v cloudu nebo na cizím serveru = tvoje data si čte, kdo se k úložišti dostane. Na off-site vždy šifruj (borg/restic).
  • Kopírování živého DB souboru místo dumpu. Kopie datových souborů běžící databáze bývá poškozená a neobnovitelná. Používej pg_dump/mysqldump (nebo zálohu ze snapshotu se zastavenou službou).
  • Plný cíl zálohy. Disk/kvóta se zaplní, zálohovací skript tiše selhává týdny. Bez hlášení o tom nevíš. Hlídej volné místo a nastav retenci (prune), ať staré zálohy uvolňují místo.

🛠️ Cvičení

  1. Aplikuj 3-2-1 na sebe. Sepiš, kde teď reálně máš svoje důležitá data, a rozvrhni je do pravidla 3-2-1: co je originál, kde bude kopie 2 (jiné médium) a kde kopie 3 (mimo lokaci). Kde ti to teď skřípe?
  2. Inkrementální rsync. Vytvoř si testovací složku s pár soubory a udělej dvě zálohy rsync s --link-dest do složek podle data. Změň jeden soubor, spusť druhou zálohu a ověř (du, ls -i), že nezměněné soubory nezabraly místo dvakrát. Jak to --link-dest dělá?
  3. Borg od nuly. Založ šifrované borg úložiště, udělej dvě zálohy (mezi nimi něco změň), vypiš archivy (borg list) a nakonec obnov jeden konkrétní soubor do /tmp. Ověř, že sedí.
  4. Dump vs kopie DB. Vysvětli vlastními slovy, proč nemáš kopírovat živé datové soubory běžící databáze a co místo toho použiješ. Co konkrétně dělá pg_dump jinak než cp?
  5. Test obnovy jako rituál. Navrhni, jak bys pravidelně (např. měsíčně) automaticky ověřoval, že tvoje záloha jde obnovit — ne jen že „skript proběhl". Co konkrétně bys kontroloval?
Náčrt řešení — rozbal, až si cvičení zkusíš sám
  1. 3-2-1 na sebe — typicky: originál = notebook (SSD); kopie 2 = externí disk doma (jiné médium); kopie 3 = cloud nebo borg repo na cizím serveru (off-site, šifrované). Nejčastěji skřípe kopie 3 — lidé mají „externí disk v šuplíku vedle notebooku", což při požáru/krádeži padne s originálem. Pozor: dvě složky na jednom disku = jedna kopie, jedno médium — pravidlo neplní.
  2. Inkrementální rsync--link-dest=<předchozí záloha> porovná soubory s minulou zálohou a pro nezměněné vytvoří v nové záloze hardlink (další jméno na tentýž datový blok) místo nové kopie. ls -i ukáže stejné číslo inode u nezměněných souborů ve dvou zálohách, du (bez -l) je nezapočítá dvakrát. Každá záloha přitom vypadá jako plná kopie. Pozor: funguje jen na stejném souborovém systému (hardlink nepřekročí hranici FS).
  3. Borg od nulyborg init --encryption=repokey <repo>, pak borg create <repo>::archiv1 <data>, něco změň, borg create <repo>::archiv2 <data>. borg list <repo> vypíše oba archivy. Obnova: borg extract <repo>::archiv1 cesta/k/souboru (spouštěj v prázdné/dočasné složce, ať nepřepíšeš originál). Pozor: heslo/klíč k šifrovanému repu si ulož zvlášť — bez něj zálohu neobnovíš vůbec.
  4. Dump vs kopie DB — běžící databáze zapisuje do datových souborů průběžně; cp je čte v různých okamžicích, takže výsledek je „napůl zapsaný" a nekonzistentní → poškozená, neobnovitelná záloha. pg_dump si vyžádá konzistentní snímek dat v jednom okamžiku a vygeneruje z něj logický SQL výpis (příkazy, které DB znovu postaví). Pozor: alternativa je zastavit službu a teprve pak kopírovat, nebo zálohovat z konzistentního snapshotu FS.
  5. Test obnovy jako rituál — automatizovaně (cron/timer) měsíčně: obnov ze zálohy konkrétní soubor(y) do dočasné složky a porovnej ho s očekávaným (např. sha256sum, nebo u DB obnov dump do testovací databáze a zkontroluj počet řádků/tabulek). U borg/restic navíc pravidelně check (integrita repa). Výsledek pošli mailem/notifikací. Pozor: „skript skončil s kódem 0" není test obnovy — testem je až soubor, který otevřeš a je celý.

🧠 Otázky & odpovědi

Co je pravidlo 3-2-1 a proč na něm tak záleží?

Je to nejjednodušší recept na bezpečnou zálohu: měj 3 kopie dat (originál + dvě zálohy), na 2 různých médiích (třeba interní disk + externí disk nebo cloud) a 1 kopii mimo lokaci (off-site — u kamaráda, na jiném serveru, v cloudu). Každé číslo řeší jiný typ katastrofy: víc kopií kryje selhání jedné z nich, víc médií kryje fyzické selhání disku, off-site kopie kryje požár, krádež nebo blesk, které zničí celé místo naráz. Klasická past je „záloha na druhém oddílu stejného disku" — to je jedna kopie na jednom médiu a při selhání disku zmizí všechno.

Proč není snapshot to samé co záloha?

Snapshot (btrfs, LVM) je zmrazený stav souborového systému v čase — udělá se rychle a umí vrátit čas. Jenže leží na stejném disku a poolu jako původní data. Když disk fyzicky selže, snapshot zmizí spolu s ním. Nechrání ani před smazáním celého poolu nebo formátem a útočník s právy ho může smazat. Snapshot je proto skvělá krátkodobá pojistka typu vrať mě před update, nebo konzistentní zdroj, ze kterého teprve uděláš skutečnou zálohu na jiné místo. Záloha musí být nezávislá na originálu — na jiném médiu a ideálně mimo lokaci. Potřebuješ obojí, ale nesmíš je zaměňovat.

Kdy použít rsync a kdy borg nebo restic?

rsync je super na jednoduché zrcadlení souborů na místní nebo domácí externí disk, kde ti stačí kopie 1:1 a případně inkrementalita přes --link-dest (hardlinky). Je jednoduchý a všude. Jenže sám o sobě nešifruje obsah v cíli a neumí deduplikaci napříč soubory. Jakmile posíláš zálohu na cizí či cloudové úložiště, chceš borg nebo restic: dělají deduplikaci na úrovni bloků (šetří místo), kompresi, inkrementální zálohy a hlavně šifrování, takže data v cizím úložišti nikdo nepřečte bez klíče. Pro servery a off-site kopie z pravidla 3-2-1 jsou borg/restic dnešní standard.

Proč se říká že netestovaná záloha je žádná záloha?

Protože smyslem zálohy není zálohovat, ale obnovit — a to jestli obnova funguje zjistíš jistě až ve chvíli, kdy ji zkusíš. Spousta lidí roky spouští zálohovací skript, který tiše selhává: cíl je plný, zálohují se prázdné soubory, ztratilo se šifrovací heslo, skript hodí chybu, které si nikdo nevšimne. V den katastrofy pak zjistí, že mají jen naději, ne data. Proto obnovu pravidelně testuj naostro: obnov konkrétní soubor do dočasné složky a ověř, že je celý (u databáze obnov dump do testovací DB). Hláška skript skončil bez chyby není důkaz — důkazem je až soubor, který otevřeš a funguje.

Jak správně zálohovat databázi?

Nekopíruj živé datové soubory běžící databáze. Databáze do nich zapisuje průběžně, takže obyčejné cp je sebere v různých okamžicích a výsledek je nekonzistentní, poškozený a neobnovitelný. Místo toho použij dump: pg_dump u PostgreSQL, mysqldump u MySQL/MariaDB. Dump si vyžádá konzistentní stav dat v jednom okamžiku a vygeneruje z něj logický výpis (SQL příkazy, které databázi znovu postaví), takže se dá spolehlivě obnovit. Alternativa je službu na chvíli zastavit a teprve pak kopírovat soubory, nebo zálohovat z konzistentního snapshotu souborového systému. A nezapomeň zálohovat i konfiguraci (/etc).