Možná si ještě někdo klade onu otázku "Zálohovat, nebo ne?", ať už z důvodu, že nemá čas, nebo že cena pásek je vysoká, nebo z nějakého jiného důvodu. Asi ale ještě nezažil tu stresovou situaci, kdy práce (a sem si můžete dosadit projekt, na kterém zrovna intenzivně pracujete), která dosud šlapala jako po másle a pozítří se má odevzdávat, najednou skončí v troskách disku, který ne a ne se zavrtět. V tu chvíli je každá rada drahá. Jestli tedy chcete předejít takové černé hodince, není jiná volba než systematická a pravidelná záloha.
Trocha šedé teorie
O tom, jak správně zálohovat, byly popsány stohy papírů, napsáno mnoho prací a nesčetně článků. Teorie je možná nudná, ale na začátek je třeba uvést, jaké způsoby zálohování a jakou podporu pro tuto mravenčí práci lidstvo vymyslelo.
Rozlišuje se na jedné straně Full backup záloha a na straně druhé Inkrementální záloha. Full backup zálohování ukládá celý oddíl (ať už je to diskový svazek, skupina adresářů, nebo jen skupina souborů). Výhodou je, že nám stačí uchovávat poslední zálohu, neboť pokrývá veškeré předchozí. Její podstatnou nevýhodou je čas nutný k vytvoření zálohy a, pokud je potřeba uchovávat starší zálohy, i počet médií, který neúměrně narůstá.
Tento problém řeší již zmíněná inkrementální záloha. Zálohují se vždy jen změny od poslední nižší úrovně. Existují různá schémata pro zálohování a i vy si můžete vymyslet své vlastní. Jedním z nejpoužívanějších je například to uvedené na obrázku (k dispozici v PDF a SXD).
Každý sloupeček určuje jeden den v týdnu, každý řádek pak jeden týden. Číslo ve čtverečku znamená použitou úroveň a zálohování se provádí podle výše uvedeného kritéria. Jak je vidět, jednou měsíčně se provede Full backup záloha a každý pátek se vytvoří záloha za celý předchozí týden, což umožňuje, že týdny jako logické bloky práce jsou na jedné pásce (pokud se tam nevejdou, tak alespoň na ucelené sadě pásek). V pondělí se pak zazálohují jen změny od pátku, v úterý pouze změny provedené během pondělka atd.
Jedním důležitým tématem při zálohování bylo donedávna rotování médií. V dřívějších dobách bylo jedinou finančně přijatelnou možností zálohovat na magnetické pásky. Ty se samozřejmě opotřebovávaly, takže administrátor musel připravit plán, jak pásky v zařízení měnit. Jeden klasický scénář byl například 5 pásek na pracovní dny a jednu pásku na víkend s jejich nekonečnou výměnou.
Tento přístup umožňuje uchovávat podstatně méně datových médií oproti každodenní Full backup záloze a je i mnohem časově úspornější. Problematičtější je obnova. Pokud se disk rozhodne stávkovat například ve středu, bude potřeba najít předcházející páteční zálohu, z ní obnovit, co je potřeba, pak pondělní, obnovit poškozená data, a nakonec ještě úterní zálohu a také provést obnovení. Obnovování lze přece jen ale považovat za výjimečnou situaci a tuto "nepříjemnost" přehlédnout v očekávání snazšího zálohování.
Co zálohovat?
Na tuto otázku existuje vcelku jednoduchá odpověď. Zálohujte všechna data, jejichž získání ze zálohy vyjde levněji než získávání z původních zdrojů. Jestliže si převedeme tuto poučku do praxe, vyjde nám potřeba zálohovat hlavně uživatelské adresáře (/home), konfigurační soubory (/etc), mailové schránky apod. Zcela nemá smysl zálohovat virtuální souborové systémy (/proc, /dev, /mnt, /media), dočasné adresáře (/tmp, /var/tmp), fronty (tiskové, odchozí pošta) a ve většině případů ani nainstalované aplikace (/bin, /boot, /sbin).
Výběr, co zálohovat, a co nezálohovat, je jistě místo k zamyšlení, s trochou nadsázky můžeme ale říct, že dump nám to zjednodušuje, protože inkrementální zálohování je možné provozovat pouze na celém filesystému. Ale o tom až později.
Tradiční nástroje
Jako už je Linux systémem tisíců možností, je mnoho možností i v oblasti zálohování. Nebudeme se zde však zabývat celou plejádou produktů, zaměříme se jen na ty tradiční, tar/cpio na jedné straně a Dump/Restore na straně druhé. Dále v článku se podíváme trochu více pod kabát druhé zmíněné variantě, ale to už uvozuje nadpis.
Zálohujte všechna data, jejichž získání ze zálohy vyjde levněji než získávání z původních zdrojů.
V minulosti bylo nejpoužívanějším médiem pro ukládání záloh páskové zařízení pro svou cenu, jednoduchost, rychlost (ano, byly časy, kdy počítač nestačil pásku "krmit" daty). Jelikož zápis na toto médium má svá specifika, vznikly i specifické programy: tar [TApe aRchiver] a cpio [CoPy In Out]. Jejich původním a dodnes hlavním cílem bylo posbírat data ze zadaných souborů a v pevných blocích (např. po 5 kB) je posílat na výstup (tedy obvykle do souboru vytvořeného na pásce). Základní práce s nimi je velice jednoduchá. Stačí zadat seznam souborů či adresářů a výstupní soubor (či pomlčku ve smyslu "posílej vstup na standardní výstup", který je možno pak dle libosti přesměrovat) a za nějakou chvíli vám na disku leží vytvořený soubor, ve kterém jsou uloženy všechny zadané soubory i s adresáři.
Oba programy (tar a cpio) jsou součástí projektu GNU a zdrojové kódy si pod licencí GNU GPL můžete zdarma stáhnout na www.gnu.org/software.
Stále tu mluvím o dvou programech: tar a cpio. Jaký je ale mezi nimi rozdíl? Nač mít dva programy, které se zdá dělají to samé? Pomineme-li spoustu novinek, které do taru přinesl vývoj, jako je třeba těsná vazba s kompresními programy gzip a bzip2, základní podpora inkrementální zálohování a množství nových přepínačů, jistý rozdíl zde pochopitelně je. Je to seznam souborů pro ukládání do výstupního archivu. Program tar si přečte seznam parametrů na příkazové řádce. Typickým příkazem pro vytváření archivu pomocí tar je tedy:
tar cvf archiv.tar soubor1 soubor2 adresar1
Program cpio bere seznam ze standardního vstupu. Typickým příkazem tedy je:
find /home | grep mp3 | cpio -o > archiv.cpio
Jak je vidět z příkladů, cpio je vhodnější na dlouhé seznamy, třeba ty generované pomocí jiných programů, kdežto tar je vhodný, pokud chceme zadat pár adresářů ručně (toto samozřejmě platí, pokud nechceme využít vylepšení taru, jak bylo uvedeno výše).
Programy tar a cpio si může začátečník v Linuxu představit jako nástroj PKZIP (WinZip) ze systému Windows. Tento formát totiž dovoluje ukládat do jednoho archivu více souborů a při vypnuté kompresi dělá podobnou věc jako nástroje tar a cpio. Ty jsou však daleko sofistikovanější a podporují mnoho voleb.
Dump
Ve zkratce by se dalo říct, že to je "specialista na zálohování diskových oddílů". Přestože je možné zálohovat pouze vybrané adresáře, veškeré možnosti lze využít, pouze pokud zálohujeme celý diskový oddíl. Samozřejmostí je, že výstup je "nakouskován" na bloky pevných velikostí podobně, jak to dělají tar a cpio, aby vše bylo připraveno pro uložení na pásku.
Dump ale přichází s něčím zcela novým oproti taru. Nepřistupuje k souborovému systému pomocí funkcí jádra, ale využívá k tomu vlastní knihovny. Toto přináší mnohé nevýhody, ale také samozřejmě výhody, protože jinak by tato možnost dávno zanikla. Vyjmenuji tedy nejdříve nevýhody:
- může ho používat pouze root (protože program potřebuje přímý zápis/čtení ze zařízení);
- neumí zálohovat libovolný souborový systém (umí pouze ty, pro které má vlastní knihovnu);
- inkrementální zálohování nefunguje při zálohování seznamu adresářů;
- pokud zálohujeme např. na CD/DVD, je potřeba na jiném disku (nebo oddílu) vymezit dostatečné místo (což při zálohování celého oddílu znamená místo rovnající se obsazenému místu na daném oddílu).
A teď to zajímavější, v čem je Dump lepší:
- je rychlejší (dobře zná souborový systém, nejdříve si ho tedy načte, seřadí i-nody, tak aby hlavička musela minimálně cestovat, a pak teprve zahájí čtení);
- protože nepoužívá jaderné funkce pro přístup do souborového systému, nemění žádné časové razítko při čtení souboru;
- přímo podporuje inkrementální zálohování;
- lepší možnosti práce s už existujícím archivem;
- podporuje interaktivní obnovu (nejdříve si uživatel vybere, co chce obnovit a Restore pak obnoví jen to vybrané, což je samozřejmě rychlejší a bezpečnější, protože je menší riziko, že si přepíšu soubor, který jsem nechtěl).
Padlo tady něco o možnosti inkrementálního zálohování. Ptáte se, jak si to ten dump pamatuje? Jednoduše, vytvoří si soubor /etc/dumpdates, ve kterém zaznamená historie pro jednotlivé úrovně inkrementální zálohy. V souboru jsou tři sloupce oddělené pomocí bílých znaků (tedy mezera, tabulátor apod.) ve kterém jsou popořadě uvedeny:
- jméno zařízení, na kterém leží souborový systém, který byl podroben záloze;
- úroveň zálohy;
- datum, kdy byla provedena záloha uvedeného zařízení na dané úrovni.
Jedná se o historii, tedy při každém spuštění zálohy se přidá do tohoto souboru nový řádek. Pokud tedy chceme zálohovat úroveň 3, najde se odspodu poslední řádek s číslem nižším či rovným trojce ve druhém sloupci. Následně se pak zálohují pouze soubory změněné od data uvedeného ve třetím sloupci.
Základní operace
Nejprve je potřeba provést přípravu před samotným zálohováním. Oddíl, který budeme zálohovat, musí být připojen pro čtení (read-only), nebo být zcela odpojen, aby během zálohování, které může trvat dlouhou dobu, nedošlo ke změně souborů. Pokud zálohovaný souborový systém je nějaký "vnější" systém, stačí ukončit veškeré přístupy k němu a odpojit ho pomocí příkazu umount /mnt/fsystem.
Pokud se však jedná například o oddíl připojený ke kořenu souborového systému, není možné ho takto jednoduše odpojit ani pod uživatelem root, protože zde běží spousta démonů, které si na tento oddíl dělají nároky. Nejprve je nutno přepnout se do runlevelu 1, aby se všechny v tuto chvíli nepotřebné služby zastavily, a připojit oddíl jako read-only.
init 1 mount -r -n -o remount /
V krajním případě, pokud třeba chceme zálohovat každý den a není možné každý den přepínat systém do runlevelu 1, je možné zálohovat i ve víceuživatelském režimu (runlevel 3, 4 nebo 5 podle distribuce). Je to však na úkor robustnosti a riskujeme tím, že zálohovaná data nebudou konzistentní.
Nyní máme oddíl připraven pro zálohování a ihned můžeme přikročit k zahájení. Typický příkaz při použití dump bude vypadat:
dump -0uf /dev/rmt1 /home
Popořadě vysvětlím jednotlivé parametry. První číslice udává úroveň inkrementální zálohy, pokud je zde uvedena '0', jedná se o celkovou zálohu (full backup). Následující znak 'u' udává, že bude updatován soubor /etc/dumpdates, který bude použit pro další inkrementální zálohy. Předposlední položka určuje, kam se bude ukládat (-f cílové zařízení) a jako poslední oddíl, který se bude zálohovat.
Pokud ukládáme zálohu na pásku a je jisté, že se na jednu nevejde, můžeme pomocí těchto přepínačů ovlivnit, kdy dojde k ukončení zápisu na aktuálně zapisovanou.
- -a - ignoruje výpočet délky pásky a zapisuje až do značky konce pásky (nutné, pokud páskové zařízení podporuje hardwarovou kompresi);
- -B i - zapíše i bloků o velikosti 1 kB a přestane zapisovat (nezávisle na pozici na pásce);
- -s i - zapíše nejvýše i stop na pásku; popis tohoto přepínače přesahuje rámec tohoto článku, odkazuji vás tedy na manuálové stránky.
Je už snad samozřejmostí, že zálohovací program, jako je Dump, přímo podporuje kompresi výsledného archivu. Jsou opět dvě možnosti, buď použít starší gzip, použitím přepínače -z, nebo novější bzip2 pomocí přepínače -j. Jestliže však použijeme jeden z těchto přepínačů, vyskytne se problém. Na výstup budou putovat různě velké bloky tak, jak je kompresní program vytvořil. Tento výstup však nelze posílat na pásku. Problém je možno vyřešit takto:
dump -0uj 9 /home | dd bs=1024 of=/dev/rmt0
V tomto příkazu dump zálohuje oddíl připojený do adresáře /home, komprimuje ho pomocí programu bzip2 (úroveň komprese je zvolena maximální, tedy 9) a výstup posílá na standardní výstup. Ten však je přesměrován na standardní vstup programu dd, jenž variabilní bloky, které mu přicházejí, rozsekává na bloky o pevné velikosti 1024 B a ty ukládá na pásku. Jestliže se během zálohování vyskytne problém, že je nutno vytvořit více archivů (např. archiv je větší než 2 GB), je možno použít parametr -M.
Dalším velice zajímavým přepínačem je -S. Je-li uveden, Dump neprovede fyzicky zálohu, ale pouze vypočte místo, které bude potřeba pro uložení archivu. Což se hodí ve chvíli, kdy potřebujeme zjistit, kolik médií vlastně vůbec potřebujeme. Konečně přepínač -W vypíše na obrazovku seznam oddílů, které už je potřeba zazálohovat.