Zálohovanie

Existuje mnoho spôsobov akým sa dajú zálohovať dáta systému Ubuntu. Najdôležitejšou vecou pri zálohovaní je však navrhnutie plánu zálohy, ktorý hovorí čo zálohovať, kedy zálohovať a ako v prípade potreby dáta zo zálohy obnoviť.

Nasledujúce časti hovoria o rôznych spôsoboch, akými tieto úlohy vykonať.

Shell skripty

Jedným z najjednoduchších spôsobov, akým sa dá zálohovať systém, je použitie tzv. shell skriptov - skriptov pre príkazový riadok. Pomocou takéhoto skriptu môžeme nastaviť, ktoré priečinky sa majú zálohovať a obsah týchto priečinkov môžeme skomprimovať (zbaliť) pomocou nástroja tar do archívu. Archív je súbor, ktorý potom môžeme skopírovať na iné miesto. Môžeme ho vytvoriť aj na vzdialenom súborovom systéme, ktorý pripojíme pomocou systému NFS.

Nástroj tar dokáže vytvoriť jeden archívny súbor z veľkého množstva súborov a priečinkov. Nástroj tar tiež zredukuje priestor potrebný na uchovanie archívu prostredníctvom kompresie.

Jednoduchý skript

Nasledujúci skript použije nástroj tar na vytvorenie archívu na vzdialenom súborovom systéme, ktorý je pripojený pomocou systému NFS. Meno súboru s archívom sa odvodí od dátumu a názvu počítača.

#!/bin/sh
####################################
#
# Skript na vytvorenie zálohy na vzdialenom disku
#
####################################

# Čo sa bude zálohovať.
backup_files="/home /var/spool/mail /etc /root /boot /opt"

# Kam sa bude zálohovať.
dest="/mnt/backup"

# Vytvorí názov súboru s archívom.
day=$(date +%A)
hostname=$(hostname -s)
archive_file="$hostname-$day.tgz"

# Vypíše hlásenie o prebiehajúcej operácii.
echo "Zálohujem $backup_files do $dest/$archive_file"
date
echo

# Vytvorí archív pomocou nástroja tar.
tar czf $dest⁄$archive_file $backup_files

# Vypíše správu o dokončení operácie.
echo
echo "Záloha bola vytvorená"
date

# Detailný výpis cieľového priečinka $dest aby sa dala overiť veľkosť archívu.
ls -lh $dest
  • $backup_files: premenná, ktorá obsahuje zoznam priečinkov, ktoré sa majú zálohovať. Tento zoznam si môžeme upraviť podľa našich potrieb.

  • $day: premenná, ktorá obsahuje deň v týždni (Pondelok, Utorok, Streda, atď.). Táto premenná sa používa na vytvorenie archívu pre každý deň v týždni, čo nám poskytne sedem dňovú históriu archívov. Meno archívu môžeme vytvoriť aj inými spôsobmi. Napríklad môžeme využiť nástroj date.

  • $hostname: premenná, ktorá obsahuje krátky názov stanice. Vďaka tomuto menu rozoznáme, z ktorého počítača záloha pochádza, v prípade, že na rovnaké miesto ukladáme zálohy z viacerých počítačov.

  • $archive_file: celé meno súboru s archívom.

  • $dest: priečinok, do ktorého sa má archív uložiť. Tento priečinok je potrebné pred použitím skriptu vytvoriť a v našom prípade aj pripojiť pomocou NFS. Viac informácií o NFS sa nachádza v časti Sieťový súborový systém NFS.

  • stavové správy: toto sú voliteľné správy, ktoré sa vypíšu pomocou nástroja echo na počítači, aby používateľ vedel, čo sa na počítači deje.

  • tar czf $dest/$archive_file $backup_files: príkaz tar sa využíva na vytvorenie archívu.

    • c: vytvorí archív.

    • z: použije kompresiu gzip.

    • f: zapíše výstup do súboru. Keby sme tento parameter nepoužili, tar by výstup odoslal na STDOUT.

  • ls -lh $dest: voliteľný príkaz ktorý zobrazí -l dlhý výpis cieľového priečinka -h v tvare zrozumiteľnom pre človeka. Tento príkaz je užitočný, ak sa chceme uistiť, že bol súbor vytvorený a aká je jeho veľkosť.

Toto je jednoduchý príklad skriptu na vytvorenie zálohy. Pri vytváraní skriptu máme k dispozícií veľké množstvo možností. Viac informácií o vytváraní skriptov môžeme nájsť v časti “Zdroje”.

Spustenie skriptu

Spustenie z príkazového riadka

Najjednoduchší spôsob, akým spustiť predchádzajúci skript, je uložiť ho do súboru. Súbor môžeme nazvať napríklad zaloha.sh. Potom ho môžeme spustiť v príkazov riadku:

sudo bash zaloha.sh

Tento spôsob môžeme využiť, ak chceme otestovať správnu funkčnosť skriptu.

Spustenie pomocou plánovacieho nástroja cron

Nástroj cron môžeme využiť na automatické spúšťanie skriptu. Démon cron umožňuje spúšťanie skriptov alebo príkazov v stanovený čas.

cron môžeme nastaviť prostredníctvom záznamov v súbore crontab. Syntax riadkov súboru crontab je nasledovná:

# m h dom mon dow   command
  • m: minúta, kedy sa má príkaz spustiť v rozsahu 0 až 59.

  • h: hodina, kedy sa má príkaz spustiť v rozsahu 0 až 23.

  • dom: deň v mesiaci, kedy sa má príkaz spustiť.

  • mon: mesiac, v ktorom sa má príkaz spustiť v rozsahu 1 až 12.

  • dow: deň v týždni, kedy sa má príkaz spustiť v rozsahu 0 až 7. Nedeľa sa dá zapísať buď pomocou 0 alebo 7.

  • command: príkaz, ktorý sa má vykonať.

Ak chceme pridať záznam do súboru crontab, použijeme príkaz crontab -e. Obsah súboru crontab si môžeme pozrieť pomocou príkazu crontab -l.

Ak chceme nastaviť spúšťanie skriptu zaloha.sh pomocou nástroja cron, najskôr zadáme príkaz:

sudo crontab -e
[Note]

Ak použijeme sudo spolu s príkazom crontab -e, budeme upravovať crontab používateľa root. To je nevyhnutné, ak chceme zálohovať systémové priečinky, pretože iba používateľ root ku nim má prístup.

Pridáme nasledujúci záznam do súboru crontab:

# m h dom mon dow   command
0 0 * * * bash /usr/local/bin/zaloha.sh

Pri použití tohto nastavenia sa bude skript zaloha.sh spúšťať každý deň o polnoci.

[Note]

Skript zaloha.sh je potrebné nakopírovať do priečinka /usr/local/bin/, lebo tak sme definovali cestu v súbore crontab. Skript môžeme umiestniť aj inam, ale v tom prípade je potrebné túto cestu zmeniť.

Viac informácií o súboroch crontab môžeme nájsť v časti “Zdroje”..

Obnovenie údajov z archívu

Potom ako vytvoríme archív, je dôležité ho otestovať. Môžeme to urobiť tak, že si necháme vypísať súbory, ktoré obsahuje. Najlepší test ale je, ak súbory z archívu obnovíme.

  • Ak chceme zobraziť obsah archívu, do príkazového riadka zadáme:

    tar -tzvf /mnt/backup/nazovpc-Pondelok.tgz
    
  • Ak chceme obnoviť súbor z archívu do iného priečinka, zadáme:

    tar -xzvf /mnt/backup/nazovpc-Pondelok.tgz -C /tmp etc/hosts
    

    Prepínač -C povie nástroju tar, aby presmeroval obnovovaný súbor do zadaného priečinka. Predchádzajúci príkaz obnoví súbor /etc/hosts do priečinka /tmp/etc/hosts. Nástroj tar obnoví súbor aj s celou jeho cestou a chýbajúce priečinky automaticky vytvorí.

    Z tohto dôvodu na začiatku cesty, ktorá sa má obnoviť, nie je zapísané  "/".

  • Ak chceme obnoviť súbory z archívu, zadáme nasledujúce príkazy:

    cd /
    sudo tar -xzvf /mnt/backup/nazovpc-Pondelok.tgz
    
[Note]

Týmto prepíšeme aktuálne súbory v súborovom systéme.

Zdroje

  • Viac informácií o vytváraní skriptov sa dozviete na stránke Advanced Bash-Scripting Guide

  • Vynikajúcou online knihou o vytváraní skriptov je Teach Yourself Shell Programming in 24 Hours.

  • O ďalších možnostiach nástroja cron sa môžeme dozvedieť na stránke CronHowto Wiki Page.

  • Viac o nástroji tar sa dozvieme na stránke GNU tar Manual.

  • O iných stratégiách pre vytváraní záloh sa dozvieme na stránke Wikipédie s názvom Backup Rotation Scheme.

  • V našom skripte sme použili na vytvorenie zálohy nástroj tar, no existuje mnoho ďalších nástrojov, ktoré sa dajú na tento účel použiť. Sú to napríklad:

    • cpio: používa sa na vytváranie kópií do a z archívov.

    • dd: je súčasťou balíka coreutils. Umožňuje nízkoúrovňové kopírovanie dát z jedného formátu do druhého

    • rsnapshot: systém na zálohovanie aktuálneho stavu systému - vytvorenie tzv. snap shotu.

Rotácia archívov

  Shell skript v časti  Shell skripty vytvára iba sedem archívov.  Na serveri, kde sa údaje nemenia príliš často, to postačuje, no ak je na serveri väčšie množstvo dát, je rozumnejšie použiť inú schému.

Rotácia NFS archívov

V tejto časti skript upravíme tak, aby implementoval schému dedo-otec-syn (mesiac-týždeň-deň):

  • Rotácia vytvorí dennú zálohu pre pondelok až sobotu.

  • V nedeľu vytvorí týždennú zálohu tak, že za mesiac budeme mať štyri zálohy.

  • Mesačná záloha sa vytvorí prvý deň v mesiaci a budú vytvárané dva archívy podľa toho, či je mesiac párny alebo nepárny.

Tu je skript:

#!/bin/bash
####################################
#
# Skript na vytvorenie zálohy na vzdialenom disku
# s použitím schémy dedo-otec-syn.
#
####################################

# Čo sa bude zálohovať.
backup_files="/home /var/spool/mail /etc /root /boot /opt"

# Kam sa bude zálohovať.
dest="/mnt/backup"

# Nastavenie premenných, z ktorých sa vytvorí meno archívu.
day=$(date +%A)
hostname=$(hostname -s)

# zistí číslo týždňa v mesiaci 1-4.
day_num=$(date +%d)
if (( $day_num <= 7 )); then
week_file="$hostname-week1.tgz"
elif (( $day_num > 7 && $day_num <= 14 )); then
week_file="$hostname-week2.tgz"
elif (( $day_num > 14 && $day_num <= 21 )); then
week_file="$hostname-week3.tgz"
elif (( $day_num > 21 && $day_num < 32 )); then
week_file="$hostname-week4.tgz"
fi

# Zistí či je mesiac párny alebo nepárny.
month_num=$(date +%m)
month=$(expr $month_num % 2)
if [ $month -eq 0 ]; then
month_file="$hostname-month2.tgz"
else
month_file="$hostname-month1.tgz"
fi

# Vytvorí meno archívu.
if [ $day_num == 1 ]; then
archive_file=$month_file
elif [ $day != "Saturday" ]; then
archive_file="$hostname-$day.tgz"
else
archive_file=$week_file
fi

# Vypíše správu o začatí operácie.
echo "Zálohujem $backup_files do $dest/$archive_file"
date
echo

# Vytvorí archív pomocou nástroja tar.
tar czf $dest⁄$archive_file $backup_files

# Vypíše správu o dokončení operácie.
echo
echo "Záloha bola vytvorená"
date

# Detailný výpis cieľového priečinka $dest aby sa dala overiť veľkosť archívu.
ls -lh $dest/

Skript môžeme spustiť rovnakými spôsobmi ako v časti Shell skripty.

Dobrým zvykom je odložiť médium so zálohou na bezpečné miesto. V našom prípade shell skriptu je záložným médiom iný počítač, ktorý poskytuje priečinok zdieľaný pomocou NFS systému. Umiestnenie NFS servera na iné umiestnenie bude pravdepodobne nepraktické. V závislosti od toho, aké máme pripojenie, môžeme prostredníctvom siete WAN archívy prekopírovať na server, ktorý je na inom mieste.

Iná možnosť je skopírovanie archívu na externé médium, ktoré je možné vybrať z počítača a umiestniť ho na bezpečné miesto. Vďaka tomu, že cena mechaník stále klesá, môžeme použiť dve mechaniky. To nám umožní mať jednu mechaniku pripojenú k serveru so zálohami a jednu na inom mieste.

Pásková mechanika

Páskovú mechaniku pripojenú k serveru môžeme použiť miesto zdieľaného priečinka cez NFS. Použitie páskovej mechaniky zjednodušuje rotáciu archívov a tiež umožňuje uchovávať záložné médium v bezpečí.

Pri použití páskovej mechaniky nie je potrebná časť skriptu, ktorá vytvára meno archívu, pretože sa údaje odošlú priamo na páskovú mechaniku. Pribudne však niekoľko príkazov, ktoré pracujú s páskou. Tieto príkazy sa vykonávajú pomocou nástroja na prácu s magnetickou páskou mt, ktorý je súčasťou balíka cpio.

Tu je upravený shell skript pre páskovú mechaniku:

#!/bin/bash
####################################
#
# Zálohovanie na páskovú mechaniku.
#
####################################

# Čo sa bude zálohovať
backup_files="/home /var/spool/mail /etc /root /boot /opt"

# Kam sa bude zálohovať.
dest="/dev/st0"

# Vypíše správu o začatí operácie.
echo "Zálohujem $backup_files do $dest"
date
echo

# Uistí sa že je páska previnutá.
mt -f $dest rewind

# Vytvorí archív pomocou nástroja tar.
tar czf $dest $backup_files

# Previnie pásku a vysunie ju
mt -f $dest rewoffl

# Vypíše správu o dokončení operácie.
echo
echo "Záloha bola vytvorená"
date

[Note]

Predvolené označenie páskovej mechaniky SCSI je /dev/st0. Použite označenie platné pre váš systém.

Údaje z páskovej mechaniky obnovíme rovnako ako keby sme ich obnovovali z bežného archívu. Jednoducho previnieme pásku a použijeme miesto cesty k súboru označenie zariadenia. Ak napríklad chceme obnoviť súbor /etc/hosts do /tmp/etc/hosts, zadáme:

mt -f /dev/st0 rewind
tar -xzf /dev/st0 -C /tmp etc/hosts

Bacula

Bacula je program umožňujúci zálohovanie, obnovu zo zálohy a preverenie dát cez sieť. Klient systému Bacula existuje pre operačné systémy Linux, Windows aj Mac OSX. Tieto vlastnosti zo systému robia široko použiteľné multiplatformové sieťové riešenie zálohovania.

Prehľad

Systém Bacula tvorí niekoľko častí a služieb určených na riadenie toho, ktoré súbory sa majú zálohovať a kam:

  • Bacula Director: služba, ktorá riadi celé zálohovanie, obnovu, overovanie a operácie s tým spojené.

  • Bacula Console: aplikácia umožňujúca komunikáciu so službou Director. Existujú tri verzie konzoly:

    • Textovo založený príkazový riadok.

    • Grafické rozhranie pre prostredie Gnome založené na GTK+.

    • Grafické rozhranie založené na wxWidgets.

  • Bacula File: známy tiež ako Bacula Client program. Táto aplikácia je nainštalovaná na počítačoch, ktoré chceme zálohovať, a ktorý poskytuje údaje žiadané programom Director.

  • Bacula Storage: program, ktorý ukladá a číta údaje z fyzického média.

  • Bacula Catalog: je zodpovedný za správu zoznamu súborov a databázu zväzov so všetkými zálohovanými súbormi. Umožňuje rýchle vyhľadanie a obnovenie archivovaných súborov. Program Catalog podporuje tri rôzne databázy MySQL, PostgreSQL a SQLite.

  • Bacula Monitor: umožňuje monitorovanie programov Director, File a Storage. Momentálne je tento program dostupný iba v aplikácii s grafickým rozhraním GTK+.

Tieto služby a aplikácie môžu byť súčasne spustené na viacerých serveroch a klientoch alebo môžu byť všetky nainštalované na jednom počítači, ak zálohujeme jeden disk alebo zväzok.

Inštalácia

Komponenty systému Bacula sú rozložené do viacerých balíkoch. Ak chceme nainštalovať systém Bacula, do príkazového riadka zadáme:

sudo apt-get install bacula

V predvolenom stave po nainštalovaní balíka bacula bude pre program Catalog použitá databáza MySQL. Ak chceme pre program Catalog použiť SQLite alebo PostgreSQL, nainštalujeme balík bacula-director-sqlite3 alebo bacula-director-pgsql.

Počas inštalácie bude potrebné zadať prihlasovacie údaje pre konto správcu databázy a vlastníka databázy bacula. Správca databázy potrebuje prislúchajúce oprávnenia na vytváranie databáz. Viac informácií sa nachádza v časti MySQL.

Konfigurácia

Konfiguračné súbory systému Bacula sú formátované na základe zdrojov pozostávajúcich z direktív uzatvorených do zložených zátvoriek {}. Každý komponent systému Bacula má svoj vlastný konfiguračný súbor v priečinku /etc/bacula.

Rôzne časti systému Bacula sa musia navzájom autorizovať. Toto je zabezpečené pomocou direktívy password. Napríklad heslo zdroja Storage v súbore /etc/bacula/bacula-dir.conf sa musí zhodovať s heslom zdroja Director v súbore /etc/bacula/bacula-sd.conf.

V predvolenom stave je vytvorená úloha s názvom Client1, ktorá archivuje údaje prostredníctvom programu Catalog systému Bacula. Ak máme v pláne použiť server na archivovanie údajov z viacerých klientov, zmeníme meno tejto úlohy na niečo viac popisné. Meno zmeníme v súbore /etc/bacula/bacula-dir.conf:

#
# Define the main nightly save backup job
# By default, this job will back up to disk in
Job {
Name = "BackupServer"
JobDefs = "DefaultJob"
Write Bootstrap = "/var/lib/bacula/Client1.bsr"
}
[Note]

V predchádzajúcom príklade sme ako názov úlohy použili názov stanice BackupServer. Nahraďte  BackupServer názvom vašej stanice alebo iným popisným menom.

Program Console si môže vyžiadať od programu Director úlohy, ale aby mohli program Console použiť aj používatelia, ktorí nemajú právo root, musia byť členmi skupiny bacula. Používateľa do skupiny bacula pridáme napísaním nasledujúceho príkazu do príkazového riadka:

sudo adduser $username bacula
[Note]

Nahraďte $username skutočným menom aktuálneho používateľa. Po pridaní používateľa do skupiny sa musíte odhlásiť a znova prihlásiť, aby sa zmena prejavila.

Záloha na lokálnom počítači

Táto časť vysvetľuje spôsob, ako nastaviť zálohovanie určitých priečinkov na jednom počítači na lokálne pripojenú páskovú mechaniku.

  • Najskôr nastavíme parametre zariadenia pre program Storage. Otvoríme súbor /etc/bacula/bacula-sd.conf a pridáme:

    Device {
    Name = "Tape Drive"
    Device Type = tape
    Media Type = DDS-4
    Archive Device = /dev/st0
    Hardware end of medium = No;
    AutomaticMount = yes; # when device opened, read it
    AlwaysOpen = Yes;
    RemovableMedia = yes;
    RandomAccess = no;
    Alert Command = "sh -c 'tapeinfo -f %c | grep TapeAlert'"
    }

    V tomto príklade použijeme páskovú mechaniku DDS-4. Direktívy Media Type a Archive Device nastavíme tak, aby sa zhodovali s naším hardvérom.

    Miesto tohto nastavenia by sme tiež mohli odpoznámkovať jeden z ďalších súborov s príkladmi.

  • Po dokončení úprav súboru /etc/bacula/bacula-sd.conf je potrebné reštartovať démon programu Storage:

    sudo /etc/init.d/bacula-sd restart
    
  • Teraz pridáme zdroj Storage do súboru /etc/bacula/bacula-dir.conf aby použil nové zariadenie :

    # Definition of "Tape Drive" storage device
    Storage {
    Name = TapeDrive
    # Do not use "localhost" here
    Address = backupserver # N.B. Use a fully qualified name here
    SDPort = 9103
    Password = "Cv70F6pf1t6pBopT4vQOnigDrR0v3LT3Cgkiyj"
    Device = "Tape Drive"
    Media Type = tape
    }

    Do direktívy Address je potrebné zapísať úplné doménové meno (FQDN) servera. Zmeníme backupserver na mennú adresu našej stanice.

    Tiež sa uistíme, či sa direktíva Password zhoduje s heslom definovaným v súbore /etc/bacula/bacula-sd.conf.

  • Vytvoríme novú sadu súborov FileSet, ktorá bude určovať, ktoré priečinky sa majú archivovať:

    # LocalhostBacup FileSet.
    FileSet {
    Name = "LocalhostFiles"
    Include {
    Options {
    signature = MD5
    compression=GZIP
    }
    File = /etc
    File = /home
    }
    }

    Tento FileSet hovorí, že budeme archivovať priečinky /etc a /home. Zdroj Options pomocou direktív prikazuje, aby boli vytvorené kontrolné MD5 obtlačky pre každý odzálohovaný súbor a aby sa na zálohovanie použila kompresia GZIP.

  • Teraz vytvoríme nový plán Schedule pre zálohovanie:

    # LocalhostBackup Schedule -- Daily.
    Schedule {
    Name = "LocalhostDaily"
    Run = Full daily at 00:01
    }

    Tento plán hovorí, že úloha sa má spustiť každý deň o 00:01. Samozrejme je k dispozícii omnoho viac volieb, ktoré sa dajú použiť.

  • Nakoniec vytvoríme úlohu Job:

    # Localhost backup.
    Job {
    Name = "LocalhostBackup"
    JobDefs = "DefaultJob"
    Enabled = yes
    Level = Full
    FileSet = "LocalhostFiles"
    Schedule = "LocalhostDaily"
    Storage = TapeDrive
    Write Bootstrap = "/var/lib/bacula/LocalhostBackup.bsr"
    }

      Úloha bude každý deň vykonávať úplnú Full zálohu na páskovú mechaniku.

  • Každá páska, ktorú použijeme, musí mať označenie - Label. Ak aktuálna páska nemá označenie, systém Bacula vám odošle email, aby ste o tom vedeli. Ak chceme priradiť páske označenie pomocou programu Console, spustíme ho pomocou príkazu:

    bconsole
    
  • a v príkazovom riadku konzoly Bacula zadáme:

    label
    
  • Po zadaní príkazu bude potrebné zadať zdroj Storage:


    Automatically selected Catalog: MyCatalog
    Using Catalog "MyCatalog"
    The defined Storage resources are:
    1: File
    2: TapeDrive
    Select Storage resource (1-2):2

  • Teraz zadáme nový názov zväzku - Volume name:


    Enter new Volume name: Nedela
    Defined Pools:
    1: Default
    2: Scratch

    Miesto slova Nedela môžeme použiť iný popisnejší názov.

  • Teraz vyberieme Pool:


    Select the Pool (1-2): 1
    Connecting to Storage daemon TapeDrive at backupserver:9103 ...
    Sending label command for Volume "Sunday" Slot 0 ...

Odteraz by mal systém Bacula zálohovať údaje z lokálnej stanice na pripojené páskové zariadenie.

Zdroje

  • Viac informácií o ďalších spôsoboch konfigurácie systému Bacula sa nachádza na stránke Bacula User's Manual.

  • Na domovskej stránke Bacula Home Page sa zasa nachádzajú informácie o najnovšej verzii systému Bacula a o jeho vývoji.

  • Stránka Bacula Ubuntu Wiki tiež stojí za pozretie.