Jak zálohovat rychle a bezbolestně

26. 3. 2010
Doba čtení: 6 minut

Sdílet

Téma zálohování jsme na Rootu probírali už několikrát a vždycky jsme se dostali k nějakému řešení, které vyžadovalo náš pravidelný zásah. Pojďme zkusit něco téměř plně automatického, co provede zálohu po pouhém zasunutí zálohovacího média, nejlépe nějakého disku, do USB portu počítače.

 Óda na zálohování

Zálohovat se má, má se to dělat často a nejlépe někam, kde se zálohovaným datům nemůže stát stejná nehoda jako datům na původním místě. V domácím prostředí, kam je také tento článek směrován, se nabízí koupě externího pevného disku, kam se budou zálohovat rodinné i pracovní záležitosti. Můžete sice využít RAID1 nebo RAID5, ale pořád je tu velká šance, že když se přihodí něco fyzicky celému domu, budou data pryč. Důležitých dat většinou není víc než pár desítek GB a u někoho to může být i řádově ve stovkách MB. Není tedy potřeba nějaké opravdu velké zálohovací médium.

Bohužel tu je i několik překážek, které bezpečnosti našim datům chybí. Tou první je určitě lenost, kdy na zálohování prostě nemyslíte. Možná vás napadne použít nějaké automatické řešení se zálohováním na jiný stroj. Pokud bude takový stroj doma, narazíte na problém polohového oddělení zálohovaných dat od těch původních. Ne všichni ale mají druhý stroj a už vůbec ne mimo svůj domov. Limitem může být i připojení k internetu. Externí disk je tedy spolehlivé a finančně dostupné řešení pro každého, komu na svých datech záleží a přitom vada na elektrických rozvodech mu v odpojením stavu neublíží.

Další problém je softwarový. Možná se vám už stalo, že jste si vymazali nějakou část textu nebo kódu a vesele programovali dál. Mezitím jste provedli zálohu a za pár dní přišli na to, že jste si před čtrnácti dny vymazali něco, co teď potřebujete. Stará záloha je pryč a nezbývá, než se s takovými daty rozloučit nebo je vyprodukovat znovu. To se ale s fotkami z dovolené nedělá zrovna dobře.

Našim cílem v tomto článku tedy bude udělat zálohy co nejvíce automatické a s historií tak, aby posledních XX záloh bylo uživateli k dispozici. Použijeme k tomu udev, rdiff-backup a trochu skriptovacího umu. Je to totiž akce pro Linux jak dělaná a byla by škoda si o tom neříct.

Co budeme potřebovat

Nejprve se podíváme na dva nástroje, které budeme potřebovat, abychom našeho cíle dosáhli.

rsync, rdiff-backup

Program rsync je velmi oblíbený na synchronizaci adresáře v bodě A s adresářem v bodě B. Často se na zálohování používá, protože dokáže mezi stroji přenášet jen změněná data a tím ušetří kapacitu sítě. Je to samozřejmě vykoupeno náročností na procesor, protože rsync si počítá hashe každého souboru a případně vytváří jejich rozdíly, které odesílá. Rsync má i vlastního daemona, se kterým může komunikovat klientská strana, nicméně bezpečnější je použití tunelu přes SSH. O rsync si můžete přečíst hodně informací v našem článku Pokročilé zálohování s Rsync.

Nad rsync vzniklo několik řešení, které rozšířily jeho možnosti. Asi takovou nejčastěji doplňovanou možností je udržování historie změn. A tady se dostáváme k problému, kdy si něco vymažeme, ale zjistíme to, až když proběhne záloha a vše je ztraceno. O jednom z nich se můžete dočíst v článku Záloha dat pomocí rdiff-backup. Ten je napsaný v Pythonu a umožňuje pohodlné cestování napříč všemi zálohami, které jste v minulosti udělali. Umožňuje i jejich pohodlné vymazání. Jeho obsluha je jednoduchá, možná i jednodušší než u rsync, takže to je ideální nástroj pro náš problém.

udev

Udev je nenápadný daemon, který běží na pozadí vašeho systému. Je vcelku jednoduché ho nakonfigurovat a jelikož to už udělali vývojáři vaší distribuce, tak ani nemusíte vědět, že nějaký udev máte. Nicméně je tam a stará se o zařízení, která k vašemu počítači připojíte. Např. když jádro najde WiFi kartu, tak si o tom popovídá s udev daemonem a ten podle nastavených pravidel např. načte patřičný firmware, vytvoří v systému zařízení, třeba wlanX a dá mu správné pořadové číslo. Pravidla udevu můžeme jednoduše přiohnout k našemu účelu tak, aby spustila námi definovaný skript a ten se po připojení zařízení postaral o zálohu.

Jak na to

Teorii bychom měli za sebou a je čas přejít k praxi. Nejprve začneme s tím, že vytvoříme skript, který připraví náš disk a pomocí rdiff-backup na něj nakopíruje data. Nakonec disk řádně odpojí a dá uživateli nějakým způsobem vědět, že zálohování je dokončeno. Skript může vypadat třeba takto:

#!/bin/bash

DEV=/dev/backupdisk1
MOUNTPOINT=/mnt/p1
SOUNDUSER=cx
FROMDIR=/home/cx/co/rosti
TODIR=$MOUNTPOINT/rosti
SOUND=/home/cx/root/cow-moo1.wav

if [ "$1" == "1" ] && [ ! -e /tmp/nobackup ] && [ -e $DEV ]; then
    mount $DEV $MOUNTPOINT
    /bin/mkdir -p $TODIR
    /usr/bin/rdiff-backup $FROMDIR $TODIR
    eject $DEV
    su -c "/usr/bin/aplay -D pulse $SOUND" $SOUNDUSER 2> /dev/null
fi 

Nejdříve si do proměnných nastavíme všechno co budeme potřebovat, tj. jméno zařízení, přípojný bod, cílový a zdrojový adresář atd. Název zařízení si zvolíme níže v pravidle pro udev. Může vás ale zmást použité su v kombinaci s použitím. Moje Ubuntu nyní jede na Pulseaudio, které aplay nechtělo pustit ke slovu. Vyřešil jsem to nakonec tímto způsobem, kdy aplay spouštím pod právy svého uživatele včetně jeho prostředí, a tím má aplay přístup k Pulseaudiu a může nám dát vědět o tom, kdy zálohování skončilo.

Aby se zálohování spustilo, musí k tomu být splněny tři podmínky. První souvisí s udevem, který jako parametr předá číslo zařízení, nad kterým zrovna skončil svoji práci. Jednička v tomto případě značí první oddíl na externím disku. Druhá podmínka nám zajistí, abychom měli přístup k zálohám, kdyby se s původními daty něco stalo. V takovém případě je potřeba připojit disk, aniž by se spouštělo zálohování. To vyřešíme tím, že vytvoříme prázdný soubor „/tmp/nobackup/“ a skript podle něj pozná, že zálohovat teď nemá. Poslední podmínka kontroluje existenci vytvořeného správného souboru zařízení a je tu hlavně pro jistotu.

Na dalších řádcích připojíme oddíl na disku, vytvoříme na něm správný adresář do kterého se bude zálohovat a uděláme přes rdiff-backup zálohu. Program eject odpojí definitivně disk od systému a tím také zabrání automounteru, aby konal svoji práci. Nakonec spustíme oblíbený zvuk přes Pulseaudio a končíme. Automounter bude fungovat normálně, pokud vytvoříme blokovací soubor, který je popsán v předchozím odstavci.

Druhým krokem bude identifikovat disk pomocí informací, které má udev k dispozici. To uděláme tak, že disk připojíme k počítači a použijeme následující příkaz:

$ udevadm info -a -p $(udevadm info -q path -n /dev/sdd) | grep model
ATTRS{model}=="USB Flash Drive " 

Kde /dev/sdd nahraďte za cestu k disku. Vidíte, že zrovna u mého disku výrobce moc fantazie neměl, ale nám to bude stačit.

Když víme, jak vidí udev náš disk, přejdeme k psaní pravidla. Ta se vyskytují v adresáři „/etc/udev/ru­les.d/“. Tam vytvoříme soubor „90-local.rules“ a vložíme do něj:

KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}=="USB Flash Drive ", NAME+="backupdisk%n", RUN+="/opt/backup.sh %n" 

Mnou uvedený model nahraďte tím, co vám vypsal udevadm výše.

Nezbývá než zavést nové pravidlo do udevu:

ict ve školství 24

/etc/init.d/udev reload 

A vyzkoušet, jak zálohování funguje připojením externího disku.

Závěr

Pohodlné zálohování je nejlepší cesta k tomu, jak ho dělat pravidelně. Stačí si do večerního rituálu mezi čištěním zubů a spuštěním oblíbeného seriálu přidat připojení externího disku a data budete mít v bezpečí. Jediný plně automatický způsob, jak mít data v bezpečí stejně nebo lépe, je dělat pravidelné zálohy na jiný stroj patřičně vzdálený od toho zálohovaného. Pokud takovou možnost máte, určitě ji využijte.

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.