To jest główny skrypt do backupów rsyncem.
Wystarczy go uruchamiać cyklicznie co jeden dzień i sam zatroszczy się o backup i trzymanie kopii przez 3 miesiące.
Użycie jest proste:
Kod:
_backup katalog_źródłowy katalog_docelowy [FSL]
Trzeci parametr FSL (follow symbolic links) - powoduje że kopiowane są docelowe obiekty dowiązań symbolicznych, czasem się może przydać
W katalogu docelowym tworzone są katalogi na kopie oraz trzy pliki "timestampy" które zawierają informację kiedy był ostatni backup.
Skrypt sam "postarza" kopie i usuwa najstarszą.
W sekcjach exclude dla rsynca trzeba wypisać katalogi których nie chcemy backupować (u mnie np. /a, /nas itp).
Kod jest może nieoptymalny i brzydki ale przecież nigdy nie miał być prezentowany
Kod:
#!/bin/bash
DIR="$2";
#parametry
if [ -z "$1" ];
then
echo "Brak katalogu źródłowego";
exit;
fi;
if [ -z "$2" ];
then
echo "Brak katalogu docelowego";
exit;
fi;
if [ "$3" == "FSL" ];
then
PAR="--copy-dirlinks";
fi;
#utwórz katalogi
if [ ! -d $DIR/D3 ];
then
mkdir $DIR/D0;
mkdir $DIR/D1;
mkdir $DIR/D2;
mkdir $DIR/D3;
mkdir $DIR/T0;
mkdir $DIR/T1;
mkdir $DIR/T2;
mkdir $DIR/T3;
mkdir $DIR/M0;
mkdir $DIR/M1;
mkdir $DIR/M2;
mkdir $DIR/M3;
fi;
#dzienny
CD=$(date +%y%m%d);
GO='NIE';
if [ ! -e $DIR/daystamp ];
then
GO='TAK';
else
LD=$(cat $DIR/daystamp | head -1);
if [ "$CD" \> "$LD" ];
then GO='TAK'
fi;
fi;
if [ "$GO" == "TAK" ];
then
mv $DIR/D3 $DIR/DX
mv $DIR/D2 $DIR/D3
mv $DIR/D1 $DIR/D2
mv $DIR/D0 $DIR/D1
mv $DIR/DX $DIR/D0
cp -al $DIR/D1/. $DIR/D0
rsync -aAX --delete --exclude={/dev,/proc,/sys,/tmp,/run,/var/run,/mnt,/media,/lost+found,/home,/a,/b,/c,/d,/e,/f,/nas,/siec,.gvfs} $PAR $1 $DIR/D0
echo $CD > $DIR/daystamp
fi;
#tygodniowy
CD=$(date --date="tomorrow" +%Y%W);
GO='NIE';
if [ ! -e $DIR/weekstamp ];
then
GO='TAK';
else
LD=$(cat $DIR/weekstamp | head -1);
if [ "$CD" \> "$LD" ];
then GO='TAK'
fi;
fi;
if [ "$GO" == "TAK" ];
then
mv $DIR/T3 $DIR/TX
mv $DIR/T2 $DIR/T3
mv $DIR/T1 $DIR/T2
mv $DIR/T0 $DIR/T1
mv $DIR/TX $DIR/T0
cp -al $DIR/D0/. $DIR/T0
rsync -aAX --delete --exclude={/dev,/proc,/sys,/tmp,/run,/var/run,/mnt,/media,/lost+found,/home,/a,/b,/c,/d,/e,/f,/nas,/siec,.gvfs} $PAR $1 $DIR/T0
echo $CD > $DIR/weekstamp
fi;
#miesieczny
CD=$(date --date="tomorrow" +%Y%m);
GO='NIE';
if [ ! -e $DIR/monthstamp ];
then
GO='TAK';
else
LD=$(cat $DIR/monthstamp | head -1);
if [ "$CD" \> "$LD" ];
then GO='TAK'
fi;
fi;
if [ "$GO" == "TAK" ];
then
mv $DIR/M3 $DIR/MX
mv $DIR/M2 $DIR/M3
mv $DIR/M1 $DIR/M2
mv $DIR/M0 $DIR/M1
mv $DIR/MX $DIR/M0
cp -al $DIR/D0/. $DIR/M0
rsync -aAX --delete --exclude={/dev,/proc,/sys,/tmp,/run,/var/run,/mnt,/media,/lost+found,/home,/a,/b,/c,/d,/e,/f,/nas,/siec,.gvfs} $PAR $1 $DIR/T0
echo $CD > $DIR/monthstamp
fi;
_temp i _untemp są prostsze.
"/d/.backup/qbit/#temp" to mój katalog do trzymania kopii, trzeba to zmienić na coś swojego, podobnie jak usera w /home i swoje wyjątki w rsync
PS. nie testujcie tego na maszynie roboczej, u mnie działa ale u Was od razu nie musi .
_untemp ma rsync z delete na / i teretycznie gdyby coś poszło źle może wszystko ładnie skasować... ja testowałem to początkowo na virtualboxie.
Kod:
#!/bin/bash
#SRC1 - katalog ze zrodlem do skopiowania
#DST1 - podstawowy katalog do trzymania danych
#DST2 - katalog docelowy dla danej akcji czyli DST1+(root/home)
DST1="/d/.backup/qbit/#temp"
GO="NIE"
if [ -z "$1" ];
then
echo "Brak źródła";
exit;
fi;
if [ "$1" == "root" ]
then
SRC1="/";
DST2=$DST1"/root";
GO="TAK";
fi;
if [ "$1" == "home" ]
then
SRC1="/home/user";
DST2=$DST1"/home";
GO="TAK";
fi;
if [ $GO == "NIE" ]
then
echo "Niepoprawny parametr";
exit;
fi;
if [ $GO == "TAK" ]
then
mkdir $DST2;
rsync -aAX --delete --exclude={/dev,/proc,/sys,/tmp,/run,/var/run,/mnt,/media,/lost+found,/home,/a,/b,/c,/d,/e,/f,/nas,/siec,.gvfs} $SRC1 $DST2
fi;
_untemp
Kod:
#!/bin/bash
SRC1="/d/.backup/qbit/#temp";
if [ -z "$1" ];
then
echo "Brak źródła";
exit;
fi;
if [ "$1" == "root" ]
then
DST="/";
SRC2=$SRC1"/root/*";
fi;
if [ "$1" == "home" ]
then
DST="/home/user";
SRC2=$SRC1"/home/user/*";
fi;
rsync -aAX --delete $SRC2 $DST
if [ "$1" == "root" ]
then
update-grub;
fi;