Zacznijmy od omówienia założeń projektu. Potrzebny nam prosty skrypt, który ma być co rano albo co wieczór uruchamiany na serwerze po to, żeby zrobić backup plików. Jeśli co rano wykonywali byśmy pełny backup to nie starczyłoby nam pieniędzy na dyski twarde. Lepiej więc utrwalać tylko te pliki, które zostały zmienione.
Mamy na naszym serwerze kilka projektów, które potrzebujemy spakować do oddzielnych "paczek".
Backupy będziemy grupować ze względu na datę wykonania. Nic nie stoi na przeszkodzie, aby grupować je ze względu na projekt, ale ja nie chcę.
Skrypt może być wykonywany nie częściej niż raz dziennie. W przeciwnym przypadku może zastąpić backup wcześniejszy backupem późniejszym. Z czasem wyeliminujemy to ograniczenie, ale na razie nie ma po co.
Skrypt korzysta z programu rsync i to właściwie jedyne wymaganie wstępne. Używamy jeszcze kilku programików narzędziowych, ale są one zawarte chyba w każdej sensownej dystrybucji linuxa, więc nie będę ich tu wymieniał.
Wspomniany skrypt wygląda tak:
#!/bin/bash
backup_dir=/var/system_backup
backup_conf=/root/backup
source_dir=/home
data=`date +%F`
mkdir -p $backup_dir/daily/$data
for i in `cat $backup_conf'/dirs'`
do
if test -e $backup_conf/$i'.excludes'
then
exc='--exclude-from '$backup_conf/$i'.excludes';
else
exc=
fi
rsync -avz $exc $source_dir/$i $backup_dir/full > $backup_dir/logs/$data'_'$i
lc=(`wc -l $backup_dir/logs/$data'_'$i`)
if test $lc -gt 4
then
head -n$[lc-3] $backup_dir/logs/$data'_'$i | tail -n$[lc-4] | grep -v '.*/$' > $backup_dir/logs/$data'_'$i'.filelist'
cd $backup_dir/full
tar -jcpf $backup_dir/daily/$data/$data'_'$i'.tar.bz2' --files-from=$backup_dir/logs/$data'_'$i'.filelist'
rm $backup_dir/logs/$data'_'$i'.filelist'
fi
done
Nie jest to kurs programowania w bashu więc nie będę omawiał każdej linijki po kolei. Skupimy się tu na działaniu programu.
Linie 2, 3 oraz 4 to jedyna konfiguracja skryptu. Można ją zrobić za pomocą parametrów wywołania i pewnie kiedyś się tym zajmę, ale teram mi się nie chciało, bo - jak każdy informatyk - jestem leniwy. We wspomnianych linijkach deklarujemy kolejno:
- Miejsce, w którym trzymany jest backup.
- Miejsce, w którym znajdują się foldery do skopiowania. Ja foldery te nazwałem roboczo "projektami", ale może być to cokolwiek. Jak widać, w moim przypadku projekty trzymane są w katalogu home (to temat na osobny artykuł). Nic nie stoi przeszkodzie aby nie deklarować katalogu źródłowego.
Trzecia zmienna przechowuje ścieżkę do katalogu, w którym trzymana jest konfiguracja skryptu.
- Plik dirs przechowuje w osobnych liniach nazwy katalogów "projektów".
- Dla każdego z projektów możemy utworzyć plik o nazwie nazwa_projektu.excludes. Każda linia tego pliku będzi interpretowana jako element, który nie powinien znaleźć się w docelowej kopii. Można tam na przykład umieścić informacje o folderach cache aplikacji.
W katalogu tym powinny znajdować się trzy podkatalogi:
- katalog full będzie zawierać pełen backup systemu - przyda się nam to w dalszych backupowych planach,
- katalog dailybędzie zawiera pliki data_nazwa-projektu.tar.bzip2, w których znajdzie się wspomniany backup różnicowy,
- katalog logszawierać będzie logi dla każdego dnia i każdego projektu,
Pętla w skrypcie wykonuje się dla każdej linii pliku dirs. Pierwsza instrukcja warunkowa (if) nie jest szczególnie istotna dla zasady działania - sprawdza tylko, czy istnieje plik .excludes. Program rsync "odwala" prawie całą robotę. Druga instrukcja warunkowa sprawdza tylko, czy skopiowano jakieś pliki. Jeśli tak, to wyciąga je z pełnej kopii i pakuje do archiwum. Proste, prawda?
Przypominam jeszcze - program działa prawidłowo tylko, jeśli backup wykonujemy nie częściej niż raz dziennie. Poprawimy to kiedyś, ale na razie lenistwo mi na to nie pozwala.
Druga słuszna uwaga: skryptu dobrze używa się tylko dla backupu lokalnego. Wydajność systemu przy połączeniu z osobnym hostem znacząco spadnie a przy okazji wygenerujemy za dużo ruchu w sieci. Po co robić backup w tym samym systemie? Można go wepchać na nośnik podłączony np. pod USB, albo zrobiony backup ściągnąć/wysłać przez sieć.
Brak komentarzy:
Prześlij komentarz