Anacron + Tar = automat do robienia kopii zapasowych

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
- Jak zmusić użytkowników do wylogowania się, w Linuksie?
- Rodzina języków C
- Konkord na Windowsie - MinGW, Boost
- Programy, które używam
- Wuala - sieciowy disk wirtualny
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?