Zálohování dat na Linuxu lze provést několika způsoby.
Archivační program tar
Archivační nástroj tar byl původně navržen jako obslužný program pro archivaci velkého množství souborů a celých adresářů na magnetickou pásku.[1] Z toho byl také odvozen jeho název (Tape Archiver). V Linuxu se používá verze programu vyvinutá v rámci projektu GNU která obsahuje spoustu nejrůznějších voleb a modifikátorů.
První stabilní verze archivační utility tar 1.0 se objevila v červnu 1989.
-
Od verze 1.11.2 ( 26. března 1993 ) začal tar používat místo kompresní utility místo compress gzip
-
Od verze 1.13.18 ( 29. října 2000 ) podporuje bzip2 kompresi přes parametr -j
-
Od verze 1.20 ( 14. dubna 2008 ) podporuje lzma kompresi přes parametr --lzma
-
Od verze 1.22 ( 5. března 2009 ) podporuje vícevláknovou xz kompresi přes parametr -J který má stejný efekt jako --xz

Popis formátu
Tar je schopen sloučit do jednoho velkého souboru několik souborů i včetně adresářové struktury a přístupových práv. Tento archivní soubor má velikost jako součet velikostí souborů v něm obsažených, plus režie (názvy souborů apod.). Nejedná se o kompresní program, jen spojuje více souborů do jednoho většího. Ke komprimaci výstupního archivu využívá externích komprimačních utilit jako jsou např. gzip, bzip2, lzma, xz a zstd.
Použití taru
Program tar pracuje poměrně jednoduchým spůsobem.
Má několik funkcí:
-
vytvořit archiv a nacpat do něj soubory a adresáře
-
přidat do archivu
-
rozbalit archiv na nějakém místě
-
vypsat, co je v archivu
-
aktualizovat archiv
$ tar volby [modifikátory] [seznam-souborů]
Volby
V příkazovém řádku lze použít jednu z následujících voleb, které specifikují typ operace. Každou operaci lze upravovat pomocí tvz. modifikátorů.
- --append (-r)
-
Po zadání volby -r se soubory uvedené v seznamu souborů zařadí na konec archivního souboru. Původní soubory zůstanou nedotčeny, proto hrozí, že v archivu bude uloženo několik duplicitních kopií jednoho souboru. Při obnově se jako aktuální extrahuje poslední kopie.
- --create (-c)
-
Po uvedení volby -c se soubory uvedené v seznamu uloží do nového archivního souboru. Pokud soubor již soubor se stejným názvem existuje, bude nejdříve zrušen. Pokud argument seznam-souborů je jméno adresáře, tar provede rekurzivní kopírování všech souborů, včetně podadresářů, z tohoto adresáře.
- --extract nebo --get (-x)
-
Po zadání této volby program provede extrakci všech souborů z archívu. Každý existující soubor se stejným jménem bude přepsán. Pokud se neuvede argument seznam-souborů, budou budou extrahovány všechny soubory z archívu. Jestliže argument seznam-souborů obsahuje jméno adresáře, provede tar extrakci všech souborů z tohoto adresáře včetně jeho podaresářů. Tar se snaží zachovávat všechny atributy souborů. Když tar přečte tentýž soubor vícekrát, pak novější verze vždy přepíše starší.
- --list (-t)
-
Jestliže není zadán seznam souborů seznam-souborů, zobrazí tar seznam všech souborů uložených v archívu. Když je seznam-souborů zadán, zobrazí se seznam jmen souborů z tohoto seznamu, které jsou uloženy v archívu. S touto volbou se pojí ještě volba --verbose. Při jejím užití program zobrazí podrobné informace o každém souboru v archívu.
- --update (-u)
-
Do archivního souboru se po užití této volby přidají soubory uvedené v seznamu seznam-souborů, pokud se v archívu již nenacházejí nebo pokud jsou novější. Protože se v tomto módu musejí dělat četné kontroly, běží program poněkud pomaleji.
- --help
-
Po zadání volby --help se zobrazí návod , jak tar používat. Dále se zobrazí seznam voleb a modifikátorů spolu s jejich popisem.
Poznámka: Nejedná se zdaleka o všechny volby. Popis se zabývá jen těmi nejčastěji používanými. Kompletní dokumentaci si můžete přečíst pomocí: man tar
Modifikátory
Za každou volbou je možné specifikovat jeden nebo více modifikátorů. Jestliže je použit jednoznakový zástupce pro modifikátor, není třeba před něj psát pomlčku. Přesto je doporučeno pomlčky používat.
Jestliže má za modifikátorem následovat argument, pak musí být modifikátor uveden ve skupině na konci. V následujícím příkladu jsou argumenty uspořádány správně:
$ tar -cb 10 -f /dev/ftape
Další příklad správný není a způsobí chybové hlášení:
$ tar -cbf 10 /dev/ftape
tar: invalid value for blocksize
Tato chybová hláška se objeví proto, že modifikátor -b akceptuje argument, ale není uveden jako poslední ve skupině. V tom se liší starší verze programu používaných v operačních systémech Unix, kde byla takováto syntaxe povolena.
- --absolute-path (-P)
-
Program jako implicitní uvažuje relativní nastavení cest. Tato volba zajistí, že se všechny cesty budou považovat za absolutní.
- --block-size [n] (-b)
-
Po zadání této volby se při běhu programu zapisují bloky o velikosti n. Číslo n označuje počet bloků o velikosti 512 bajtů. Jestliže není specifikováno, bude použita implicitní hodnota 20.
- --compress nebo --uncompress (-Z)
-
Při vytváření archívu se použije komprimace a při obnově se použije dekomprimace.
- --directory directory (-C)
-
Před zpracováním archívu se změní pracovní adresář podle hodnoty argumentu directory.
- --gzip nebo --gunzip (-z)
-
Po zadání této volby se bude archív během svého vytváření komprimovat a při obsluze dekomprimovat. Při dekomprimaci tar určí, zda byl archív komprimován obslužným programem compress. Pokud ano, bude k dekomprimaci použit program uncompress a ne gunzip.
- --verbose (-v)
-
Jestliže bude tato volba zadána, bude zobrazeno jméno každého zpracovávaného souboru. Společně s volbou -t bude zobrazovat další informace, jako je vlastník souboru, práva, velikost ap.
Pozn.: Opět se nejedná o všechny možné modifikátory. Viz: $ tar --help
Příklady použití
Chci si zazálohovat kompletní adresář /home/jirka/pico, kde mám všechno k programování na Raspberry Pi Pico.
Udělám to takto:
jirka@jirka-Precision-T3610:~$ cd (1)
jirka@jirka-Precision-T3610:~$ tar -czv pico >/home/jirka/pico.tar.gz (2)
pico/
pico/pico/
pico/pico/picotool/
pico/pico/picotool/CMakeLists.txt
pico/pico/picotool/.git/
pico/pico/picotool/.git/index
pico/pico/picotool/.git/packed-refs
pico/pico/picotool/.git/logs/
pico/pico/picotool/.git/logs/refs/
pico/pico/picotool/.git/logs/refs/remotes/
pico/pico/picotool/.git/logs/refs/remotes/origin/
pico/pico/picotool/.git/logs/refs/remotes/origin/HEAD
pico/pico/picotool/.git/logs/refs/heads/
pico/pico/picotool/.git/logs/refs/heads/master
pico/pico/picotool/.git/logs/HEAD
pico/pico/picotool/.git/hooks/
pico/pico/picotool/.git/hooks/update.sample
pico/pico/picotool/.git/hooks/fsmonitor-watchman.sample
pico/pico/picotool/.git/hooks/applypatch-msg.sample
... (3)
pico/mojepokusy/lcd_czech_chars/CMakeFiles/lcd_czech_chars.dir/depend.make
pico/mojepokusy/lcd_czech_chars/CMakeFiles/CMakeDirectoryInformation.cmake
pico/mojepokusy/lcd_czech_chars/lcd_czech_chars.c~
pico/mojepokusy/lcd_czech_chars/cmake_install.cmake
pico/mojepokusy/.gitmodules
pico/mojepokusy/LICENSE
jirka@jirka-Precision-T3610:~$
| 1 | Přepnu se do domácího adresáře /home/jirka. |
| 2 | Volba -c znamená: vytvoř archiv, volba -z znamená: komprimuj výsledný archiv gzipem, volba -v znamená: vypisuj mi, co děláš. Výstup je přesměrován do souboru /home/jirka/pico.tar.gz |
| 3 | Tady jsem vynechal hooodně dlouhý výpis na několik obrazovek. |
pico.tar.gz.jirka@jirka-Precision-T3610:~$ ls -l pico*
-rw-rw-r-- 1 jirka jirka 1247770974 pro 14 01:05 pico.tar.gz
pico:
celkem 19120
-rw-rw-r-- 1 jirka jirka 638464 zář 5 12:31 micropython.uf2
drwxrwxr-x 15 jirka jirka 4096 lis 12 19:37 mojepokusy
drwxrwxr-x 9 jirka jirka 4096 zář 5 12:09 pico
-rwxrwxr-x 1 jirka jirka 3762 zář 5 12:04 pico_setup.sh
-rw-rw-r-- 1 jirka jirka 18923186 zář 5 12:41 RPi_PiPico_Digital_v10.pdf
drwxrwxr-x 3 jirka jirka 4096 říj 26 21:35 rp2040-freertos-template
jirka@jirka-Precision-T3610:~$
Výsledný archiv je hodně velký, má velikost 1247770974 bajtů (komprimoval se gzipem). Mohl bych ho zmenšit třeba pomocí lepších komprimačních nástrojů zstd nebo xz.
Aby byla záloha v bezpečí, zkopíruji ji na jiný stroj (m1.jr.lixis.cz) pomocí scp.
jirka@jirka-Precision-T3610:~$ scp pico.tar.gz root@m1.jr.lixis.cz:/mnt/zaloha/
pico.tar.gz 100% 1190MB 11.0MB/s 01:48
jirka@jirka-Precision-T3610:~$
Přihlásím se pomocí ssh na vzdálený stroj m1.jr.lixis.cz a rozbalím si zálohu a budu pokračovat ve vývoji tam.
jirka@jirka-Precision-T3610:~/vyuka_sspvc$ ssh root@m1.jr.lixis.cz (1)
m1 ~ # cd /mnt/zaloha (2)
m1 /mnt/zaloha # tar -xzf pico.tar.gz (3)
m1 /mnt/zaloha # ls -l pico* (4)
-rw-r--r-- 1 root root 1247770974 Dec 14 01:55 pico.tar.gz
pico:
total 19120
-rw-rw-r-- 1 jirka jirka 18923186 Sep 5 12:41 RPi_PiPico_Digital_v10.pdf
-rw-rw-r-- 1 jirka jirka 638464 Sep 5 12:31 micropython.uf2
drwxrwxr-x 15 jirka jirka 4096 Nov 12 19:37 mojepokusy
drwxrwxr-x 9 jirka jirka 4096 Sep 5 12:09 pico
-rwxrwxr-x 1 jirka jirka 3762 Sep 5 12:04 pico_setup.sh
drwxrwxr-x 3 jirka jirka 4096 Oct 26 21:35 rp2040-freertos-template
m1 /mnt/zaloha # (5)
Connection to m1.jr.lixis.cz closed.
| 1 | Přihlášení ssháčkem na stroj m1.jr.lixis.cz |
| 2 | Přepnu se do adresáře /mnt/zaloha |
| 3 | Rozbalení archivu. Volba -x znamená rozbal archiv, volba -z znamená, že je komprimován gzipem a volba -f znamená, že archiv je v souboru pico.tar.gz
Všimněte si, že se archiv rozbalil v adresáři /mnt/zaloha. |
| 4 | Výpis |
| 5 | Tady jsem zmáčknul Ctrl+d a odhlásil jsem se ze stoje m1.jr.lixis.cz. |
Pokud bych chtěl zálohování adresáře /home/jirka/pico i přenos archivu na stroj m1.jr.lixis.cz do /mnt/zaloha udělat jedním vrzem, mohu to zkombinovat takto:
jirka@jirka-Precision-T3610:~$ tar -cf - /home-jirka/pico | gzip | ssh root@m1.jr.lixis.cz "cat >/mnt/zaloha/pico.tar.gz"
Zde vidíte zřetězení (nebo zrourování) několika programů, které dělají jednu věc a tu dělají dobře. Znaky | znamenají tzv. rouru a spojují standardní výstup prvního programu se standardním vstupem programu druhého.
- tar -cf - /home/jirka/pico
-
tar udělá archiv adresáře
- gzip
-
gzip zkomprimuje archiv na menší velikost
- ssh root@m1.jr.lixis.cz "cat >/mnt/zaloha/pico.tar.gz"
-
ssh ho bezpečným způsobem nakopíruje na vzdálený stroj do adresáře
/mnt/zaloha
Celou tuto operaci mohu takto zautomatizovat a pomocí cronu ji vykonávat každý den, bez toho, abych na to musel myslet a dělat to rukama.
Program rsync
S programem rsync můžeme dělat pokročilé zálohování a nejenom to.

Co je to rsync?
Rsync je aplikace pro unixové systémy, která dokáže synchronizovat soubory a složky z jednoho umístění do jiného. Přitom, pokud je to možné, minimalizuje objem přenášených dat pomocí delta encodingu.
Rsync by měl být s největší pravděpodobností součástí výchozí instalace vaší distribuce. Pokud tomu tak není, nainstalujte ho z balíčku pro vaši distribuci nebo použijte zdrojové kódy z webové stránky projektu k sestavení.
Výhody rsync
Rsync má např. oproti klasickému nástroji z balíku GNU utilit cp několik výhod. Tou nejvýraznější je pravděpodobně optimalizace velikosti přenášených dat. Rsync k tomuto používá speciální algoritmus, vyvinutý australským programátorem Andrewem Tridgellem, který zefektivní přenos struktury (jako např. souboru) přes komunikační linku, když má cílový počítač již jinou verzi stejné struktury. Platí to však také pro lokální kopírování. Stručně a srozumitelně řečeno: rsync, pokud je to možné, nekopíruje celé soubory, ale jen rozdíly mezi nimi. Z toho samozřejmě plyne, že se celý proces kopírování značně urychlí.
Další výhody rsync jsou např. zachování oprávnění a vlastnické informace souborů, kopírování symbolických odkazů, atd. Při přenosu je také možné zapnout kompresi dat, což je výhodné zejména při zálohování přes síť.
Základy práce s rsync
Základní syntaxe rsync je jednoduchá: rsync [volby] A B, kde A je zdrojový adresář (soubor) a B je cílový adresář (soubor).
Pokud tedy chcete zálohovat adresář se svými dokumenty z domovského adresáře na jiný disk, použijte příkaz podobný tomuto:
$ rsync -av /home/uzivatel/dokumenty /mnt/zaloha/
V příkladu jsem použil dvě volby. Volba -a zajistí to, že rsync bude pracovat v archivačním módu. To znamená, že u kopírovaných souborů zachová oprávnění a vlastnické informace, zkopíruje symbolické odkazy, soubory zařízení, atd. Volba -v, jak je zvykem, nastavuje množství vypisovaných informací. Lze ji použít až třikrát, kdy -v vypisuje jen několik základních informací o prováděných činnostech, volba -vv poskytne o něco více informací a -vvv vás detailně informuje o všech činnostech, které rsync právě provádí, i když pak už výpis není tak přehledný.
Další důležitou volbou je zajisté --exclude. Představte si, že zálohujete svůj /etc adresář. Nechcete ale do zálohy zařazovat např. soubory s koncovkou bak. Použijete tedy příkaz
$ rsync -av --exclude="*.bak" /etc /mnt/zalohy/
Ten zajistí, že tyto soubory budou ze zálohovacího procesu vyřazeny.
Lokální záloha
S rsync můžete samozřejmě provádět lokální zálohy. Zálohy mohou být ukládány např. na externí disk, flash disk, ale také do adresáře na obyčejném oddílu pevného disku. Rsync ale kvůli svému přístupu ke kopírování dat není vhodný pro ukládání na zařízení s magnetickým lineárním zápisem (magnetické pásky). K tomu se spíš hodí nástroje dump nebo tar, které zajistí, že se k datům bude přistupovat lineárně.
Řekněme, že si chci zálohovat fotky z dovolené z adresáře /mnt/data/fotky-dovolena/ na svůj externí disk.
Provedu to příkazem, který jsme si již vysvětlovali:
$ rsync -av /mnt/data/fotky-dovolena /mnt/sda1/
Potom ale přijedou známí, kteří se mnou byli na dovolené, a dovezou svoje fotky. Některé jejich se mi líbí více, a proto jejich fotky přidám do své složky a některé moje smažu. Znovu chci zálohovat na svůj externí disk. Kdybych použil stejný příkaz jako posledně, nové fotky od známých by se přidaly k mým starším, ale ty, které jsem smazal, by tam zůstaly také. Kvůli těmto situacím rsync obsahuje volbu --delete, která zajistí, že se z cílové složky odstraní soubory, které již ve zdrojové složce neexistují. Pak příkaz bude vypadat nějak takto:
$ rsync -av --delete /mnt/data/fotky-dovolena /mnt/sda1/
Tuto volbu ale používejte velice opatrně. S její pomocí lze smazat gigabajty dat během několika vteřin, čehož byste mohli později litovat. Raději nejdříve celý proces zálohy spusťte s volbou --dry-run, díky které zjistíte, jak bude záloha probíhat, aniž by se jakékoliv soubory někam kopírovaly, přesouvaly nebo se mazaly.
Pro obnovení dat ze zálohy neexistuje žádný speciální příkaz. Stačí jenom prohodit cílovou a zdrojovou složku v příkazu rsync. Dobře si zde rozmyslete použití volby --delete. Ta by mohla způsobit ztrátu některých dat vytvořených po posledním zálohování. Pokud je to možné, tato data odděleně zálohujte a po obnovení ze zálohy je znovu zařaďte.
Při psaní cesty složky, kterou hodláte zálohovat, dávejte pozor na koncové lomítko. Rsync totiž jeho přítomnost a nepřítomnost chápe rozdílně. Pokud ho nenapíšete, kopíruje se zadaná složka i s jejím obsahem. Příkaz by vypadal takto:
$ rsync -av /home /mnt/zaloha
Pokud ale lomítko na konci cesty zadáte, rsync zkopíruje pouze obsah složky. Následující příkaz bez koncového lomítka:
$ rsync -av /home/ /mnt/zaloha/
tedy zkopíruje do složky /mnt/zaloha pouze složky jednotlivých uživatelů, kdežto rsync -av /home /mnt/zaloha/ je zkopíruje i s adresářem /home.
Vzdálená záloha
Co když budete chtít kopírovat svá data přes síť na vzdálený počítač? S rsync to není žádný problém. Rsync jako výchozí možnost nabízí přenos dat mezi dvěma počítači přes daemona rsyncd. Ten je sice rychlý, ale přenášená data nešifruje. Proto se podíváme na to, jak data posílat pomocí SSH (zabezpečeného shellu), který sice není tak rychlý jako rsyncd, ale vaše data se s jeho pomocí přenáší zašifrovaná, takže nikdo nepovolaný nemůže zjistit, jaké informace přenášíte.
Příkaz, který k přenosu použijeme může být podobný tomuto:
$ rsync -ave ssh --delete /mnt/data/fotky-dovolena user@remotehost.cz:/mnt/data/
Pokud chcete vědět jak rychle přenos probíhá a za jak dlouho proces skončí, přidejte k příkazu volbu --progress. To je vhodné, pokud proces zálohování spouštíte ručně a kontrolujete jeho průběh. Pokud se ale spouští zálohování automaticky (viz níže), není tato volba potřeba. Data můžete samozřejmě také kopírovat zpět. Třeba takto:
$ rsync -ave ssh user@remotehost.cz:/mnt/data/fotky-dovolena /mnt/data/
Pokud disponujete pomalým připojením nebo prostě chcete ušetřit nějaké ty bajty, měli byste zapnout volbu --compress nebo kratší -z.
S touto volbou bude rsync komprimovat přenášené soubory a tím redukovat množství dat přenášených po síti.
Míru koprese lze nastavit pomocí volby --compress-level=NUM. Za NUM dosadíte celé číslo, nula vypne kompresi.
Automatizace
Řekněme, že chcete vytvářet denní zálohy celého kořenového adresáře.
To by znamenalo každý den nejlépe ve stejnou dobu spouštět stále stejný příkaz, který by to obstaral.
Koho by to ale bavilo, že?
Naštěstí existují různé automatizační nástroje a jedním z nich je také cron.
Jak tedy pomocí cronu nastavit automatické každodenní zálohy?
Začneme editací crontab.
Jako root spustíme příkaz crontab -e a přidáme následující řádku:
00 23 * * * rsync -av --delete --exclude="/mnt/zalohy" --exclude="/proc" --exclude="/sys" / /mnt/zalohy/denni
Díky ní se každý den přesně ve 23:00 spustí zadaný příkaz. Pokud jste náročnější a jednořádkový příkaz vám nestačí, není problém napsat si skript, který pak bude cron spouštět.
Doufám, že jste se z článku dozvěděli něco nového a že (pokud ještě pravidelně nezálohujete) jste poznali, že to nemusí být vůbec složité.
Stačí tomu na začátku chvíli věnovat a pak už se o nic nemusíte starat, vše probíhá automaticky.
Použití programu popsané v tomto článku by mělo stačit na vytváření plnohodnotných záloh.
Pokud ale máte zájem podrobněji zkoumat rozsáhlé možnosti tohoto programu, odkážu vás na manuálové stránky man rsync nebo webové stránky projektu.
Web sspvc.lixis.cz
Web, který pro vás dělám, vytvářím doma v kanceláři pomocí Asciidoctoru. Webový server sspvc.lixis.cz běží někde v datacentru.
Abych nemusel pořád myslet, jestli jsem správně nakopíroval vytvořenou stránku do správného adresáře na webu, používám k tomu jednoduchý skript v bashi, který všechno provede. Kopírování na web je zajištěno právě programem rsync spolu s ssh. Při kopírování se přenášejí jenom změny, které jsem udělal a nikoliv tuny dat, které už tam jsou.
sync.sh na výrobu webu sspvc.lixis.cz#!/bin/bash
ODKUD="/home/jirka/vyuka_sspvc" (1)
KAM="root@mx3.lixis.cz:/var/www/htdocs/sspvc/" (2)
cd $ODKUD
asciidoctor index.adoc (3)
cd c_programming (4)
#asciidoctor jazyk_c_funkce.adoc
#asciidoctor jazyk_c_pole.adoc
#asciidoctor jazyk_c_retezce.adoc
#asciidoctor jazyk_c_ukazatele.adoc
#asciidoctor jazyk_c_dynamicka_alokace.adoc
#asciidoctor jazyk_c_struktury.adoc
#asciidoctor jazyk_c_soubory.adoc
#asciidoctor jazyk_c_preproces.adoc
#asciidoctor jazyk_c_staticke_promenne.adoc
#asciidoctor c_program_v_pameti.adoc
#asciidoctor jazyk_c_static_functions.adoc
cd aaaa
#asciidoctor programovaci_jazyk_c.adoc
cd ..
cd ..
## a tak dále, další předměty v dalších adresářích
cd mikrotik
cd winbox
#asciidoctor instalace_winbox_linux_wine.adoc
cd ..
cd ..
rsync -avz $ODKUD/* $KAM (5)
| 1 | Adresář na lokálním stroji jirka-Precision-T3610, odkud se kopírují data. |
| 2 | Kam se kopírují data pomocí rsync a ssh. Ssh spojení je klíčem bez hesla, aby to fungovalo automaticky. |
| 3 | Výroba html stránky ze zdroje pomocí asciidoctoru. |
| 4 | Přepnutí do podadresáře. |
| 5 | Tady je rsync, který to nakopíruje na stroj mx3.lixis.cz, kde běží OpenBSD. |
Pokud zjistím ve škole, že mám na webu chybu, mohu ji operativně opravit na notebooku. Podobným skriptem resync.sh si data stánu na notebook, opravím, co potřebuji, a skriptem sync.sh nakopíruju zpět.
Jak prosté, milý Watsone.
