Kopie zapasowe i ich odtwarzanie

Wykonywanie regularnych kopii zapasowych jest jednym z codziennych zadań administratora. Zwykle wiąże się z tym opracowanie odpowiedniej strategii wykonywania kopii. Z jednej strony ważne jest, aby kopia wykonywała się szybko, a drugiej strony należy również zadbać o to, żeby w razie potrzeby odtworzenie kopii również odbyło się szybko i sprawnie.

Kopie możemy zwykle podzielić na następujące rodzaje:

  • Kopia pełna. Zapisywane są wszystkie dane.
  • Kopia przyrostowa. Zapisywane są dane od momentu wykonania ostatniej kopii przyrostowej.
    PnPełna kopia     
    Wt  
    Śr      
    Cz      
    Pi      
  • Kopia różnicowa. Zapisywane są dane od momentu wykonanie ostatniej pełnej kopii.
  • PnPełna kopia    
    Wt   
    Śr   
    Cz   
    Pi  

W systemie linux kopie można wykonać na kilka sposobów. Przede wszystkim mamy odpowiedni moduł YaST, który jest łatwy w obsłudze i intuicyjny. Co więcej, jest przygotowany tak, że można wykonać w nim pełną kopię systemu wykluczając pliki, których nie warto kopiować (np. tymczasowe). Podstawowym narządziem tekstowym do robienia kopii to tar i jemu przyjrzymy się w pierwszej kolejności. Umówimy też inne polecenia tekstowe: cpio, rsync, dd. Przy okazji umówimy też krótko narzędzia kompresji: gzip i bzip2.

tar

Jest to najczęściej używane narzędzie do archiwizacji danych. Jego podstawowym zadaniem jest upakowanie wielu plików w jeden plik. Pierwotnie to narzędzie nie miało za cel robienia kompresji, chociaż obecnie oczywiście są obecnie opcje, które to umożliwiają.

Trzy podstawowe składnie użycia polecenia są następujące. Warto tutaj odnotować, że opcje -zv są wspólne i określają fakt pracy na pliku skompresowanym (-z) oraz generowanie dodatkowych komunikatów (-v).

  • Tworzenie archiwum
    tar -c [-zv] [-X pliki_wykluczone] -f archiwum.tar pliki
    
    Przegląd opcji:
    • -c — określa, że tworzymy archiwum,
    • -X pliki_wykluczone — do archiwum nie zostaną dodane pliki będące na liście w pliku pliki_wykluczone. Przykładowa zawartość pliku:
      /home/gucio/test.txt
      /home/maja/*.txt
      
    • -f — określa plik archiwum i zwykle ma rozszerzenie .tar lub .tar.gz, .tgz (w przypadku zawartości skompresowanej).
  • Przeglądanie zawartości archiwum
    tar -tf archiwum.tar
    
  • Rozpakowanie archiwum
    tar -x [-v] [-C katalog_lub_plik] -f archiwum.tar
    
    Przegląd opcji:
    • -x — określa, że chcemy rozpakować archiwum,
    • -C katalog — określa nową lokalizację rozpakowywanych plików,
    • -C plik — określa, że należy rozpakować jeden konkretny plik,
    • -f archiwum.tar — określa ścieżkę do rozpakowywanego archiwum.

Powyższa wiedza pozwala na wykonywanie pełnej kopii archiwum. W jaki sposób można realizować pozostałe rodzaje kopii: różnicowy i przyrostowy? Kopie przyrostowe realizujemy przez mechanizm plików typu snapshot, natomiast kopie różnicowe robimy korzystając z połączenia poleceń find i tar (kopie przyrostowe też możemy tak robić).

Kopie przyrostowe

Poprzez opcję -g możemy wskazać plik snapshot. Polecenia wyglądają następująco:

# tar -zc -g /backup/home_snapshot -f /backup/backup_full.tar.gz /home
# tar -zc -g /backup/home_snapshot -f /backup/backup_mon.tar.gz /home
# tar -zc -g /backup/home_snapshot -f /backup/backup_tue.tar.gz /home
...

Uwaga: przez odpowiednią manipulację plikami snapshot można także zrealizować kopie różnicowe.

Kopie różnicowe

Kopie różnicowe można realizować poprzez połączenie poleceń find i tar:

# tar -zcf /bakup/backup_full.tar.gz /home
# find /home -type f -newer /backup/backup_full.tar.gz -print0 | tar -zcf /backup/backup_mon.tar.gz -T -
# find /home -type f -newer /backup/backup_full.tar.gz -print0 | tar -zcf /backup/backup_tue.tar.gz -T -
...

W powyższych poleceniach warta zwrócenia uwagi jest sekwencja -T - — określa, że lista plików archiwum powinna być czytana ze standardowego wejścia. Istotne jest także użycie opcji -print0, dzięki której bez problemu archiwizowane są pliki o nazwach z białymy znakami.

Pozostałe narzędzia do archiwizacji

dd

Bardzo użyteczne polecenie, które pozwala na kopiowania plików pomiędzy dowolnymi urządzeniami w sposób niskopoziomowy. Dzięki niemu możemy zrobić obraz dysku, możemy też taki obraz potem za pomocą dd odtworzyć. Składnia:

dd if=zrodlo of=cel [bs=rozmiar] [count=liczba]

Znaczenia opcji if i of jest intuicyjne: określają skąd dokąd kopiujemy dane. Domyślnie te dane są kopiowane blokami po 512B i rozmiar tego bloku można zmienić opcją bs. Dodatkowo możemy określić liczbę kopiowanych bloków przez opcję count. Przykładowe użycia:

# dd if=/etc/hosts of=/backup/hosts
# dd if=/dev/sda1 of=/backup/boot.partition
# dd if=/dev/sda of=/backup/tmp/mbr bs=512 count=1

rsync

To polecenie służy do synchronizacji danych pomiędzy systemami plików. Synchronizacja może być wykonywana w ramach lokalnych systemów plików, ale także również z wykorzystaniem zdalnych systemów plików. Domyślnie używamy opcji -a (archive mode), która jest skrótem na zbiór opcji (rlptgoD) i sprawia, że polecenia używa się dużo łatwiej. Podsumowując opcje mamy:

  • -a — archive mode
  • -x — zapisuje pliki z tylko jednego systemu plików (np. nie będą kopiowane pliki podlinkowane symbolicznie do innych systemów plików)
  • -v — listowane są kopiowane pliki
  • -z — transmisja jest kompresowana; ma szczególne znaczenia przy synchronizacji zdalnej
  • --delete — usuwane są pliki, których nie ma już w oryginalnej lokalizacji
  • --exclude-from=plik — nie sa kopiowane pliki umieszczone na liście w pliku plik

Przykłady synchronizacji lokalnej:

# rsync -a /home /backup/home
# rsync -a /home/ /backup/home
# rsync -a /home/. /backup/home
# rsycn -a --exclude-from=/home/exclude /home/. /backup/home

Warto zwrócić tutaj uwage na jedną subtelność. W piewrszym przykładzie zarchiwizowany zostanie katalog /home, czyli katalogi domowe będą w /backup/home/home. Natomiast w drugim i trzecim przykładzie archiwizowana jest zawartość katalogu /home, w związku z czym katalogi domowe są bezpośrednio na ścieżce /backup/home.

Przykłady synchronizacji zdalnej:

# rsync -ae ssh root@host:/home/. /backup/home
# rsync -ae ssh /backup/home/gucio root@host:/home

W powyższym rodzaje zdalnej synchronizacji opieramy się na ssh, co wymaga oczywiście instalacji serwera ssh na obu komputerach. Można synchronizować zdalnie również bez ssh, ale tego tutaj nie omawiamy.

cpio

Jest to nieco mniej popularne narzędzie, ale też możemy się spotkać z danych zarchiwizowanymi z jego pomocą. Dlatego warto poznać podstawowe użycia, czyli tworzenie, rozpakowanie i przeglądanie archiwum.

  • Archiwizacja
    # cpio -o < plik_z_lista.txt > archiwum.cpio
    
  • Rozpakowanie archiwum
    # cpio -i < archiwum.cpio
    
  • Lista plików z archiwum
    # cpio -t < archiwum.cpio
    

Kompresja

Do kompresji możemy użyć poleceń gzip, gunzip, bzip2 oraz bunzip2. Poleceń tych używa się bardzo łatwo.

# gzip archiwum.tar
# gunzip archiwum.tar.gz
# bzip2 archiwum.tar
# bunzip2 archiwum.tar.bz2