Anacron + Tar = automat do robienia kopii zapasowych

Tagi: , , , , , ,
Kategoria:

backup.png

Czy zastanawiałeś się kiedyś jak za pomocą prostych narzędzi zrobić skrypt, który będzie automatycznie robił codziennie kopię zapasową wybranych przez Ciebie folderów na dysku? Taki automat można zrobić z prostych narzędzi dostępnych w każdej dystrybucji linuksowej: Tara i Anacrona. Trochę poszukałem i znalazłem posta na debian.linux.pl, trochę dodałem od siebie i wyszedł mi dość prosty i użyteczny skrypt.

Skrypt backup_full.sh powinien być uruchamiany co miesiąc. Robi on pełną kopię zapasową wybranych przez Ciebie folderów.


#!/bin/sh

# Katalog, w którym mają znajdować się kopie zapasowe
directory="/media/Kopie_Zapasowe/";

# Prefiksy, np. prefiks_full_home - przedrostek jaki ma pełna kopia zapasowa katalogu home, prefix_full_add - przedrostek jaki ma kopia przyrostowa katalogu home,
# prefix_stan_home - nazwa pliku, który zawiera stan katalogu home
prefix_full_home="home_full_";
prefix_add_home="home_add_";
prefix_stan_home="stan_home";
prefix_full_godlark="godlark_full_";
prefix_add_godlark="godlark_add_";
prefix_stan_godlark="stan_godlark";
nowdate=`date +"%Y-%m-%d"`;
success=true;

# nazwa pliku, w którym anacron zapisuje datę ostatniego wykonania skryptu
anacronfile="/var/spool/anacron/backup_full";

# etykieta partycji zawierającej kopie zapasowe
disk_label="Kopie_Zapasowe";
# montowanie partycji zawierającej kopie zapaoswe
mount -t ext3 -L $disk_label $directory;
if [ $? != 0 ]
then
	exit;
fi

_1=$1;
if [ $((_1)) = 0 ]
then
    _1=3;
fi

/bin/echo '=========================| /media/godlark  |=========================';
#2

echo $_1;

if [ $_1 -ge 2 ]
then
    rm $directory$prefix_stan_godlark;
    last_full_godlark=`find $directory -name $prefix_full_godlark*`;
    tar --listed-incremental=$directory$prefix_stan_godlark -cjpvf $directory$prefix_full_godlark$nowdate.tar.bz2 /media/godlark;
    if [ $? = 0 ]
    then
        rm $last_full_godlark;
        date=${last_full_godlark#*$prefix_full_godlark};
        date=${date%-*};
        find $directory ! -name $prefix_add_godlark$date"*" -name $prefix_add_godlark"*" -EXEC rm {} ;
    else
        echo "Utworzenie kopii zapasowej /media/godlark/ nie udało się" > /home/godlark/Desktop/WARNING2;
        success=false;
    fi
    _1=$(($_1-2));
fi

/bin/echo  '=========================|  /home  |=========================';
#1

if [ $_1 -ge 1 ]
then
	# Aby wykonać kopię zapasową trzeba usunąć plik ze stanem katalogu
    rm $directory$prefix_stan_home;
	# Nazwa pliku, który zawiera ostatnią pełną kopię
    last_full_home=`find $directory -name $prefix_full_home*`;
	# Robienie pełnej kopii zapasowej
    tar --listed-incremental=$directory$prefix_stan_home -cjpvf $directory$prefix_full_home$nowdate.tar.bz2 /home;
	# Jeśli stan jest zero to się powiodło, więc można usunąć nieprzydatne pliki (ostatnią pełną kopię zapasową, kopie przyrostowe sprzed 2 miesięcy)
    if [ $? = 0 ]
    then
        rm $last_full_home;
        date=${last_full_home#*$prefix_full_home};
        date=${date%-*};
        find $directory ! -name $prefix_add_home$date"*" -name $prefix_add_home"*" -EXEC rm {} ;
    else
		# Tutaj powinniśmy ustawić nazwę katalogu, gdzie utworzyć plik z ostrzeżeniem tak, żeby był widoczny
        echo "Utworzenie kopii zapasowej /home nie udało się" > /home/godlark/Desktop/WARNING1;
        success=false;
    fi
    _1=$(($_1-1));
fi

# Odmontowywanie partycji zawierającej kopie zapasowe
umount $directory;
while [ $? != 0 ]; do
	sleep 60;
	umount $directory;
done

# W przypadku powodzenia data ostatniego wykonania skryptu zawsze będzie ustawiona na pierwszy dzień danego miesiąca
year=`date +"%Y"`;
month=`date +"%m"`;
echo $year$month"01" > $anacronfile | at now + 1 minutes;

Skrypt backup_update.sh powinien być uruchamiany codziennie. Robi on pełną kopię przyrostowych wybranych przez Ciebie folderów.

#!/bin/sh 
directory="/media/Kopie_Zapasowe/";
prefix_full_home="home_full_";
prefix_add_home="home_add_";
prefix_stan_home="stan_home";
prefix_full_godlark="godlark_full_";
prefix_add_godlark="godlark_add_";
prefix_stan_godlark="stan_godlark";

disk_label="Kopie_Zapasowe";
mount -t ext3 -L $disk_label $directory;
if [ $? != 0 ]
then
	exit;
fi

echo '=========================| /media/godlark  |=========================' 

tar --listed-incremental=$directory$prefix_stan_godlark -cjpvf $directory$prefix_add_godlark`date +"%Y-%m-%d"`.tar.bz2 /media/godlark;

echo  '=========================|  /home  |=========================' 

# Robi kopię przyrostową katalogu /home
tar --listed-incremental=$directory$prefix_stan_home -cjpvf $directory$prefix_add_home`date +"%Y-%m-%d"`.tar.bz2 /home;

umount $directory;
while [ $? != 0 ]; do
	sleep 60;
	umount $directory;
done

Pierwszy skrypt, aby działał zgodnie z założeniami, powinien być uruchamiany co miesiąc, a drugi w okresach mniejszych od miesiąca, najlepiej codziennie. Najlepiej do tego celu użyc anacrona, bo cron nie gwarantuje nam, że skrypt zostanie w ogóle uruchumiony. Ja w tym skrypcie użyłem anacrona, jeśli ktoś nie chce go używać, będzie musiał usunąć wszystko powiązane ze zmienną anacronfile.
A o to część pliku /etc/anacrontab, która związana jest z moim skryptem.


@monthly        25      backup_full     /media/godlark/skrypty/backup_full.sh
1       5       backup_update   /media/godlark/skrypty/backup_update.sh
#nazwa zmiennej $anacronfile w skrypcie powinna być równa /var/spool/anacron/backup_full, lub w przypadku innej nazwy /var/spool/anacron/inna_nazwa

Nie muszę przypominać o odpowiednich prawach do skryptów – root powinien tylko móc je modyfikować. No i nasza partycja z kopiami zapasowymi nie powinna być montowana automatycznie, bo to cała zabawa z montowaniem i odmontowywaniem nie miałaby sensu.
A no i pasuje wspomnieć w przypadku, gdy otrzymamy informację z ostrzeżeniem, że nie udało się utworzyć kopii zapasowej, wtedy sprawdzamy przyczynę i uruchamiamy skrypt z odpowiednim paramtrem, np. dla katalogu /home jest to parametr "1".

Jeśli spodobał ci się wpis, zasubkrybuje kanał RSS

«Koniec blogfrog.pl
Czy polskie media nami manipulują?»
Podobne wpisy



1 komentarz»

godlark napisał 28 Marca 2010 o 11:12

Eeeh... artykuł jest już tak długo, a nikt go nie skomentował?
A Ty jaką masz opinię, o tym co napisałem?

Roznica szesc i jeden
Nick
Email (będzie ukryty)
Webpage