Wykonywanie kopii zapasowej danych

Slackware FAQ - czyli baza pytań i odpowiedzi.

Moderatorzy: Moderatorzy, Administratorzy

ODPOWIEDZ
Awatar użytkownika
Radek_R
Moderator
Posty: 1196
Rejestracja: 2004-06-14, 11:40
Lokalizacja: Kraków
Kontakt:

Wykonywanie kopii zapasowej danych

Post autor: Radek_R » 2006-10-17, 16:07

[center]Wykonywanie kopii zapasowej danych[/center]
Za wszelkie szkody powstałe w wyniku stosowania się do porad z tego FAQ autorzy nie odpowiadają.

Kod: Zaznacz cały

1. Wstęp
2. Kopia zapasowa danych przy użyciu dd
2.1. Kopia zapasowa wędruje do pliku
2.2. Kopia zapasowa na drugim dysku 
3. Kopia zapasowa danych przy użyciu partimage
3.1. Kopia zapasowa partycji /
3.2. Przywracanie partycji /
4. Kopia zapasowa przy użyciu metody "tar+gzip"
4.1 Co i jak
4.2 Przykładowy skrypt
1. Wstęp
Często zachodzi potrzeba wykonania kopii zapasowej pewnych danych. Czasami danych jest na tyle dużo, że zdecydujemy się na backup całej partycji czy też dysku. W systemie Linux istnieje wygodne narzędzie które może nam pomóc w tej czynności, nazywa się dd. Dzięki niemu możemy skopiować cokolwiek, gdziekolwiek i w jakiejkolwiek wybranej ilości. Istnieją także inne narzędzia specjalnie przeznaczone do wykonywania tego typu operacji jak na przykład partimage. Jemu także przyjrzymy się bliżej. Najprostszą metodą wykonania kopii bezpieczeństwa jest po prostu spakowanie i skopiowanie w bezpieczne miejsce plików, które chcemy zabezpieczyć. Temu zagadnieniu poświęcony jest punkt 4.
A więc do dzieła!

2. Kopia zapasowa danych przy użyciu dd
Podstawowe użycie dd jest następujące:

Kod: Zaznacz cały

dd if=<plik_źródłowy> of=<plik_docelowy>
Dodatkowe opcje są opisane na stronie systemowego manuala dd.

Plikiem źródłowym i docelowym może być np. wybrana partycja czy dysk lub plik. W dalszej części będę się także posługiwał nazwą obraz zamiast plik kopii zapasowej.

2.1. Kopia zapasowa wędruje do pliku
W tym wypadku zgrywamy partycje do pliku który następnie możemy skompresować. Dobrym pomysłem jest wypełnienie pustego miejsca zerami, lub innym powtarzającym się ciągiem. Powodem takiego postępowania jest to, że zgrywając całą partycję dd nie rozróżnia plików tylko kopiuje wszystko jak leci (nawet wolne miejsce w którym mogą być przypadkowe dane). Dzięki tym zerom nie są kompresowane pozostałości po usuniętych plikach czy jakieś inne śmieci. Można to osiągnąć za pomocą samego dd:

Kod: Zaznacz cały

dd if=/dev/zero of=/plik/w/katalogu/na/partycji/do/backupu
lub

Kod: Zaznacz cały

dd if=/dev/zero of=/plik/w/katalogu/na/partycji/do/backupu bs=1K count=`df|grep hda1|awk '{print $4}'`
2.1.1 Na pierwszy ogień: partycje
Na samym początku należy przygotować odpowiednią ilość wolnego miejsca na partycji na której mamy zamiar przechowywać kopie zapasowe. Aby poprawnie wykonać kopię partycji, należy ją najpierw odmontować. Dzięki temu będziemy mieli pewność, że archiwizowane dane nie zmienią się w trakcie procesu archiwizacji.

Kod: Zaznacz cały

# umount /dev/hdc1
Następnie wydajemy polecenie

Kod: Zaznacz cały

# dd if=/dev/hdc1 of=/mnt/backupy/part_hdc1
gdzie /mnt/backupy/part_hdc1 to ścieżka do pliku, w którym chcielibyśmy składować daną partycje.
Co ciekawe, tak utworzony obraz możemy podmontować jak zwykłą partycję:

Kod: Zaznacz cały

# mount -o loop /mnt/backupy/part_hdc1 /mnt/hd/
Dodatkowo po wykonaniu tej czynności możemy posłużyć się programem do kompresji plików celem zmniejszenia rozmiaru obrazu. Do wyboru mamy:

Kod: Zaznacz cały

$ gzip part_hdc1
$ bzip2 part_hdc1
lub jakiś inny ulubiony kompresor.

Aby przywrócić skompresowane dane na partycję wykonujemy czynności w odwrotnej kolejności. Najpierw rozpakowujemy dany obraz:

Kod: Zaznacz cały

$ gzip -d part_hdc1.gz
$ bzip2 -d part_hdc1.bz2
Następnie musimy się upewnić, że partycja na którą chcemy zrzucić obraz ma rozmiar CO NAJMNIEJ równy obrazowi, z którego przywracamy dane. Partycja ta nie musi być sformatowana, musi być tylko utworzona. Gdy jesteśmy pewni co do rozmiaru danej partycji możemy przystąpić do przywracania:

Kod: Zaznacz cały

# dd if=/mnt/backupy/part_hdc1 of=/dev/hda1
Pragnę zauważyć iż, w przypadku posiadania backupu partycji hdc1, wcale nie musimy przepinać dysków jeżeli w międzyczasie zmienił nam się ich rozkład. Może to też być metoda na "klonowanie" partycji (np. z systemem).
W przypadku chęci odtworzenia danej partycji na nowy dysk, dobrym pomysłem jest zapisanie dokładnego rozmiaru partycji przed wykonaniem backupu. Można to zrobić za pomocą fdisk

Kod: Zaznacz cały

# fdisk -s /dev/hdc1
W wyniku otrzymamy liczbę jedno kilobajtowych bloków z których składa się partycja.

2.1.2 Cały dysk
Czasami zachodzi potrzeba wykonania kopii zapasowej całego dysku. Procedura wykonania kopii zapasowej całego dysku jest prawie taka sama jak w przypadku partycji. Z oczywistych względów musimy posiadać odpowiednią ilość wolnej przestrzeni na obraz.
Inne różnice przy tworzeniu obrazu całego dysku:
a) Zamiast urządzenia odpowiadającego partycji podajemy urządzenie wskazujące na dany dysk:

Kod: Zaznacz cały

# dd if=/dev/hdc of=/mnt/backupy/part_hdc
b) obrazu takiego nie podmontujemy za pomocą polecenia

Kod: Zaznacz cały

# mount -o loop
Przy przywracaniu obrazu musimy dysponować dyskiem najlepiej o takich samych parametrach dotyczących rozmiaru i geometrii (ilość sektorów na ścieżce i ilość głowic). Oczywiście można skorzystać z większego dysku, nic w takim wypadku się nie stanie. Najwyżej zostanie trochę wolnego miejsca, które możemy wykorzystać zakładając kolejną partycję lub rozszerzając jedną z właśnie przywróconych.

2.2. Kopia zapasowa na drugim dysku

2.2.1 Cały dysk
Czasami przy wykonywaniu kopii zapasowej priorytetem jest czas ewentualnego przywrócenia danych. Do tego celu nadaje się najlepiej kopia bezpośrednio na dysku. Dzięki temu w wypadku awarii po prostu przepinamy dysk.
Ale przejdźmy do rzeczy. Dysk docelowy i źródłowy nie muszą być jednakowe, jednak najlepiej żeby spełniały założenia dotyczące geometrii (patrz punkt poprzedni). W przypadku nie posiadania takich samych dysków należy pamiętać aby docelowy był większy od źródłowego. Dysk docelowy nie musi być wcześniej dzielony na p artycje i formatowany.
Gdy mamy już wszystko przygotowane przystępujemy do wykonania backupu:

Kod: Zaznacz cały

# dd if=/dev/hda of=/dev/hdb
Powyższe polecenie wykona dokładną kopię hda i zapisze ją na hdb. Innymi słowy dostaniemy klon dysku.

Przywracanie z tak wykonanego backupu nie jest konieczne ( w końcu możemy podpiąć backup jako primary) ale wykonalne i jak ktoś bardzo chce to przywróci sobie dysk poleceniem jak przy tworzeniu kopii, wystarczy tylko zamienić miejscami źródło i cel:

Kod: Zaznacz cały

# dd if=/dev/hda of=/dev/hdb
Należy pamiętać, że w przypadku użycia jako backup większego dysku, przy przywracaniu dd raczej na pewno się zbuntuje, ponieważ skończy mu się miejsce na docelowym, ale na źródłowym będą dalej same zera albo jakieś śmieci których i tak nie chcielibyśmy skopiować, więc nas to nie rusza :)

2.2.2 Pojedyncza partycja
Przy wykonywaniu kopii zapasowej partycji należy pamiętać, że obie partycje muszą mieć CO NAJMNIEJ taki sam rozmiar. Partycja docelowa może oczywiście być większa, ale wiąże się to ze stratą części miejsca na dysku.
Schemat postępowania jest taki sam jak w przypadku kopiowania całego dysku, różne są jedynie pliki urządzeń podawane jako cel i źródło:

Kod: Zaznacz cały

dd if=/dev/hdc1 of=/dev/hdd1
Przywrócenie takiej partycji jest sprawą dość prostą, zamieniamy (zupełnie jak w przypadku całego dysku) cel ze źródłem.

Kod: Zaznacz cały

dd if=/dev/hdd1 of=/dev/hdc1
3. Kopia zapasowa danych przy użyciu partimage
(Autor: Lone_wolf)
Do wykonywania obrazów używam programu partimage z knoppixa w wersji 3.6.
Polska strona knoppixa to: www.knoppix.pl
Dla przykładu wykonam obraz partycji / będącej na /dev/hda1 do partycji /home będącej na /dev/hda2

3.1 Tworzenie kopii zapasowej partycji /
Po zbotoowaniu komputera z płyty knoppixa i ukazaniu się boot wpisujemy:

Kod: Zaznacz cały

knoppix lang=pl
dzięki czemu mamy większość komunikatów w języku polskim. Po załadowaniu się knoppixa zobaczymy na pulpicie partycje naszego dysku. Klikamy prawym przyciskiem myszy ikonę hda2 umieszczoną na pulpicie. Z menu podręcznego wybieramy properites/device i odznaczamy read only. Bez tego partycja nie przyjmie nam zapisu. Odpalamy terminal i logujemy się jako root ponieważ na zwykłym userze partimage się nie uruchomi:

Kod: Zaznacz cały

knoppix@ttyp0[knoppix]$ su
Montujemy partycję hda2:

Kod: Zaznacz cały

root@ttyp0[knoppix]# mount /mnt/hda2
Poniewaz jesteśmy w ram dysku knoppixa

Kod: Zaznacz cały

@ttyp1[knoppix]$ pwd
/ramdisk/home/knoppix
przy próbie wykonania kopii szybko wyczerpałaby sie dostępna pamięć, wiec wchodzimy do katalogu w którym będzie umieszczona kopia:

Kod: Zaznacz cały

root@ttyp0[knoppix]# cd /mnt/hda2
Odpalamy partimage:

Kod: Zaznacz cały

root@ttyp0[hda2]# partimage
W oknie programu widzimy wszystkie partycje na naszym dysku:

Kod: Zaznacz cały

hda1                                 reiserfs-3.6 10,74 GiB
hda2                                 reiserfs-3.6 20,04 GiB
Kursorami zaznaczamy interesującą nas partycje,w tym wypadku hda1 następnie tabulatorem przechodzimy do pola w którym wpiszemy nazwę wykonywanego obrazu:

Kod: Zaznacz cały

Image file to create/use
Nazwa może być dowolna, ja wpisuje slack. Poniżej mamy pola wyboru:

Kod: Zaznacz cały

Action to be done:                                <Next (F5)>     
      (*) Save partition into a new image file                         
      ( ) Restore partition from an image file          <About>         
      ( ) Restore an MBR from the imagefil
Zaznaczamy pierwszą opcję z góry i wciskamy F5. W następnym oknie wybieramy:

Kod: Zaznacz cały

 Poziom kompresji                                                       
 ( ) Żaden (bardzo szybki + bardzo duźy plik                                 
 (*) Gzip (.gz: medium speed + small image file)                             
 ( ) Bzip2 (.bz2: very slow + very small image file)
Osobiście wybieram gzip, kiedyś skusiłem się na bz2 i operacja trwała wieczność.

Kod: Zaznacz cały

Opcje                                     Jeżli zakończono sukcesem:         
 [X] Sprawdź partycję przed zapisem        (*) Czekaj                         
 [X] Wprowadź opis                         ( ) Wyłącz                         
 [ ] Zamaż bez powiadomienia               ( ) Przeładuj                     
                                           ( ) Opuść                         
 Tryb dzielenia obrazu                     ( ) Last                           
 ( ) Automatyczne dzielenie (gdy brak miejsca)                               
 (*) Do plików których rozmiar jest:.......2037____ MiB                       
 [ ] Czekaj po każdej zmianie woluminu
W opcjach odznaczam sprawdzanie partycji oraz wprowadzenie opisu. Robię to ze względu na stratę czasu oraz wrodzone lenistwo, nie lubię po prostu wprowadzać dodatkowych opisów. Wciskamy znowu F5. Otrzymujemy komunikat, który zatwierdzamy:

Kod: Zaznacz cały

Block size....................4096 bytes               
  Used blocks count.............808591                   
  Free blocks count.............2006785                   
  Space usage:..................28 %                     
  Used space....................3,08 GiB                 
  Free space....................7,66 GiB                 
  Bitmap size...................344,00 KiB               
  Label.........................
Następuje wykonanie kopii. Dla partycji o rozmiarze 10GB i zajętości plików 3,1GB operacja trwała 8 minut i 59 sekund. Plik obrazu został umieszczony na partycji /home ( hda2). Jego wielkość wyniosła 1,1GB. Po wykonaniu kopii partimage do nazwy pliku automatycznie dodaje rozszerzenie w postaci trzech zer, więc po wykonaniu otrzymamy kopie o nazwie slack.000.

Kod: Zaznacz cały

root@ttyp0[hda2]# ls /mnt/hda2
ftp  lone_wolf  slack.000
Przechodzimy do katalogu / knoppixa przez cd / i odmontowujemy partycję /dev/hda2

Kod: Zaznacz cały

root@ttyp0[hda2]# cd /
root@ttyp0[/]# umount /mnt/hda2
Sprawdzamy czy partycja została odmontowana:

Kod: Zaznacz cały

root@ttyp0[/]# ls /mnt/hda2
root@ttyp0[/]#
Robimy to co się często robi na windows tzn. wciskamy reset na obudowie, bo to zawsze szybciej.

3.2 Przywracanie partycji /
Klikamy prawym przyciskiem myszy ikonę hda1, z menu properites/device odznaczamy read only, robimy to po to by partycja mogła przyjąć zapis. Logujemy sie w terminalu jako root i montujemy partycje /dev/hda2. Tu już nie musimy odznaczać dla tej partycji atrybutu read only, ponieważ z niej tylko czytamy. Nie musimy także do niej przechodzić.

Kod: Zaznacz cały

knoppix@ttyp0[knoppix]$ su
Montujemy partycję:

Kod: Zaznacz cały

root@ttyp0[knoppix]# mount /mnt/hda2
Odpalamy partimage:

Kod: Zaznacz cały

root@ttyp0[knoppix]# partimage
Zaznaczamy partycje hda1 i podajemy ścieżkę do pliku obrazu

Kod: Zaznacz cały

Image file to create/use
/mnt/hda2/slack.000
Zaznaczamy przywrócenie partycji:

Kod: Zaznacz cały

  ( ) Save partition into a new image file                         
  (*) Restore partition from an image file                 
  ( ) Restore an MBR from the imagefile
Wciskamy F5

Kod: Zaznacz cały

 Opcje                                                                       
 [ ] Symulacja odtworzenia (bez żadnego zapisu)                               
 [X] Wyczyszczenie wolnych bloków zerami                                     
                                                                             
 Jeśli zakończono sukcesem:                                                   
 ( ) Czekaj                                                                   
 (*) Wyłącz                                                                   
 ( ) Przeładuj                                                               
 ( ) Opuść
Zaznaczamy jak powyżej i wciskamy F5, zatwierdzamy komunikat. Czas przywracania wyniósł ok. 7 minut.
Partycje które przywracamy lub z których wykonujemy obraz nie mogą być podmontowane.

4. Kopia zapasowa przy użyciu metody "tar+gzip"
Kopia taka jest chyba najprostszym rozwiązaniem. Nie wymaga od nas jakichś specjalnych zabiegów z dyskami, musimy mieć po prostu partycję z wystarczającą ilością wolnego miejsca. Nie wymaga też specjalnych narzędzi - tar oraz gzip dostępne są standardowo w każdej dystrybucji. Zaletą takiego rozwiązania jest fakt backupowania tylko tych plików które chcemy mieć zabezpieczone i sami wybieramy które to będą pliki. Wadą jest żmudny proces w przypadku ręcznego wykonania takiej kopii bezpieczeństwa. Jednak za pomocą odpowiednich skryptów możemy zautomatyzować ten proces i wtedy pozbywamy się wspomnianej wady.

4.1 Co i jak
Najpierw musimy się zdecydować co backupujemy. Od razu wypada wspomnieć, że backup wszystkich plików jest zbędny. Najlepiej jest zabezpieczyć tylko te najważniejsze pliki z katalogu domowego. Jednak potrzeby są różne. Niektórzy zechcą utworzyć kopię całego systemu. Na pewno powinniśmy pominąć katalogi: /tmp /proc
Nie warto trzymać na backupie katalogów z tymczasowymi plikami internetowymi, miniaturkami itp. Katalogi w tym wypadku zależą od używanego oprogramowania. Jeżeli nic nie trzymamy w /opt to też pomijamy. Dla utrzymania porządku dobrze będzie spakować każdy główny katalog (czy też każdy katalog usera) w osobnym pliku i umieścić je w jednym katalogu. Nazwą może być np. data, nazwa dystrybucji czy cokolwiek innego; ważne abyśmy się nie pogubili w tym wszystkim.
Tyle tytułem wstępu, poniżej przedstawię skrypt do automatycznego backupu, który to dostarczył nam BeteNoire. Ogólnie rzecz biorąc najpierw musimy ustawić sobie wszelkie ścieżki w skrypcie, opcje mogą pozostać bez zmian (ew. zmiany wg osobistych preferencji). Skrypt jest bogato komentowany więc nie powinno być z tym problemów. W celu przywrócenia danych tworzymy odpowiednią partycję i rozpakowujemy po kolei pliki.

4.2 Przykładowy skrypt

Kod: Zaznacz cały

#!/bin/bash
# skrypt do backupu za pomocą tar i gzip
# koncept zaczerpnięty z gentoo-wiki - http://gentoo-wiki.com/HOWTO_Custom_Stage4

# DEFINIUJEMY KILKA ZMIENNYCH

# opcje dla tar (polecam man tar)
taropcje="--create --preserve --totals --gzip --ignore-failed-read --verbose --file"

# data potrzebna do nazwy
data=`date +%d.%m.%Y`

# katalog na backup - upewnijmy się, że partycja /mnt/backup jest zamontowana!
katbackup=/mnt/backup/$data/$(hostname)

# upewnijmy się, że katalog na backup istnieje
mkdir -p /mnt/backup/$data/$(hostname)

# co wyłączyć z backupu głównego systemu plików - /
# dopisujemy tu filesystemy, których nie chcemy zawrzeć w backupie głównego /

wylacz="
--exclude=/boot/*
--exclude=/home/*
--exclude=/proc/*
--exclude=/mnt/*
--exclude=/opt/*
--exclude=/sys/*
--exclude=/tmp/*
--exclude=/usr/*
--exclude=/usr/src/*
--exclude=/var/*"

# wyłączam z backupu różne śmieci w /home, zmienną $USER zastępujemy nazwą swojego użytkownika
wylacz_home="
--exclude=/home/$USER/tmp/*
--exclude=/home/$USER/.mozilla/firefox/*.default/Cache/*
--exclude=/home/$USER/.thumbnails/*"

# wyłączamy z backupu "wrażliwe" pliki np. ~/.bash_history, /root/.bash_history itp...
wylacz_pliki="--exclude-from /sciezka/do/pliku.z.lista"

# dla tych co mają oddzielny, niemontowany automatycznie /boot
#mount /boot
cd /boot
tar $taropcje $katbackup/boot-$data.tar.gz *
cd && umount /boot

# Zaczynamy backup głównego systemu plików
cd /
tar $taropcje $katbackup/root-$data.tar.gz / $wylacz $wylacz_pliki

# Pakujemy inne filesystemy (w kolejności alfabetycznej ;) )
cd /opt
tar $taropcje $katbackup/opt-$data.tar.gz *

cd /usr
tar $taropcje $katbackup/usr-$data.tar.gz *

cd /var
tar $taropcje $katbackup/var-$data.tar.gz *

# backupujemy katalogi domowe poszczególnych userów - elegancko będzie spakować je do osobnych archiwów, zatem każdy modyfikuje tu skrypt do swoich potrzeb
for user in /home/*; do
tar $taropcje $katbackup/home.`basename $user`-$data.tar.gz $user $wylacz_home $wylacz_pliki
done 

echo Zapisałem pliki:
ls -l $katbackup
# tworzymy sumy kontrolne archiwów (kiedyś zdarzyło mi się rozpakowywać 
# uszkodzony .tar.gz z zepsutej płyty dvd...)
for i in $katbackup/*; do md5sum >> $katbackup/sumy.md5 $i; done

#odkomentujmy poniższe linijki jeśli chcemy być jedynym użytkownikiem, który ma 
#dostęp do backupu - np. ze względu na zawarte w nim "wrażliwe dane":
#echo Zmieniam właściciela na $USER:$USER
#chown -R user:user $katbackup
#echo Zmieniam prawa do zawartości katalogu backupu na 600
#chmod -R 600 $katbackup/*

Autorzy: uzytkownicy forum
Ostatnio zmieniony 2006-11-20, 15:08 przez Radek_R, łącznie zmieniany 19 razy.
#358274
http://www.prook.net

ODPOWIEDZ