Feladat:
Központosított mentési kiszolgáló kialakítása
Elvárások:
Mentendő szervereken elvégzendő beállítások:
RSYNC_ENABLE=true
RSYNC_CONFIG_FILE=/etc/rsyncd.conf
use chroot = yes
max connections = 1
uid = root
gid = root
timeout = 600
read only = yes
host allow = backupserver
ignore nonreadable = yes
refuse options = checksum
[etc]
path = /etc
[boot]
path = /boot
[varwww]
path = /var/www
[data]
path = /data
read only = no
Az rsync daemon elindítását (/etc/init.d/rsync start)követően a mentendő szerver beállításaival elkészültünk.
Backup server beállításai
Rsync segítségével teljes biztonsági mentést pl a következő paranccsal végzek:
rsync -avz --size-only szerver1::etc /backup/szerver1/etc
Teljes mentés, a backup szerveren töröljük azokat a fájlokat, amik a mentendő helyen már nem elérhetők:
rsync -avz --size-only --delete szerver1::etc /backup/szerver1/etc
Inkrementális mentés rsync- kel:
rsync -avzm --size-only --compare-dest=/backup/szerver1/etc szerver1::etc /backup/szerver1/diff/etc
Létrehoztam egy bash shell script- et, ami a fent leírt feladatot elvégzi. A script elején adatokat deklarálok:
TAVOLI_KONYVTAR[1]=szerver1::boot
HELYI_KONYVTAR[1]=/backup/szerver1/boot
DIFF_KONYVTAR[1]=/backup/szerver1/diff/boot
EXCLUDE[1]=""
LOG_FAJL[1]=/backup/log/szerver1.log
TAVOLI_KONYVTAR[2]=szerver1::samba
HELYI_KONYVTAR[2]=/backup/szerver1/samba
DIFF_KONYVTAR[2]=/backup/szerver1/diff/samba
EXCLUDE[2]=/etc/scripts/exclude-szerver1
LOG_FAJL[2]=/backup/log/szerver1.log
*.log
cache
Következzen maga mentést végző szkript:
cat /etc/scripts/rsync.sh
#!/bin/bash
TAVOLI_KONYVTAR[0]=szerver1::etc
HELYI_KONYVTAR[0]=/backup/szerver1/etc
DIFF_KONYVTAR[0]=/backup/szerver1/diff/etc
EXCLUDE[0]=""
LOG_FAJL[0]=/backup/log/szerver1.log
TAVOLI_KONYVTAR[1]=szerver1::boot
HELYI_KONYVTAR[1]=/backup/szerver1/boot
DIFF_KONYVTAR[1]=/backup/szerver1/diff/boot
EXCLUDE[1]=""
LOG_FAJL[1]=/backup/log/szerver1.log
TAVOLI_KONYVTAR[2]=szerver1::samba
HELYI_KONYVTAR[2]=/backup/szerver1/samba
DIFF_KONYVTAR[2]=/backup/szerver1/diff/samba
EXCLUDE[2]=/etc/scripts/exclude-szerver1
LOG_FAJL[2]=/backup/log/szerver1.log
TAVOLI_KONYVTAR[3]=szerver1::home
HELYI_KONYVTAR[3]=/backup/szerver1/imap
DIFF_KONYVTAR[3]=/backup/szerver1/diff/imap
EXCLUDE[3]=/etc/scripts/exclude-szerver1
LOG_FAJL[3]=/backup/log/szerver1.log
TAVOLI_KONYVTAR[4]=szerver2::etc
HELYI_KONYVTAR[4]=/backup/szerver2/etc
DIFF_KONYVTAR[4]=/backup/szerver2/diff/etc
EXCLUDE[4]=""
LOG_FAJL[4]=/backup/log/szerver2.log
TAVOLI_KONYVTAR[5]=szerver2::boot
HELYI_KONYVTAR[5]=/backup/szerver2/boot
DIFF_KONYVTAR[5]=/backup/szerver2/diff/boot
EXCLUDE[5]=""
LOG_FAJL[5]=/backup/log/szerver2.log
TAVOLI_KONYVTAR[6]=szerver2::samba
HELYI_KONYVTAR[6]=/backup/szerver2/samba
DIFF_KONYVTAR[6]=/backup/szerver2/diff/samba
EXCLUDE[6]=/etc/scripts/exclude-szerver2
LOG_FAJL[6]=/backup/log/szerver2.log
UTOLSO_MENTES_NAP=14
REGINAP=`date --date="$UTOLSO_MENTES_NAP day ago" +%Y%m%d`
MAINAP=`date +%Y%m%d`
LOGFAJL="/backup/log/rsync.log"
NAPSZAM=`date +%u`
DATUM_NAP=`date +%d`
ADMIN_EMAIL=info@linuxadm.hu
# A meg futo mentest megallitjuk:
pkill 'rsync -azv'
df -h /backup > $LOGFAJL
echo -e "\n`date` ============== Rsync Start ==============" >> $LOGFAJL
if [ $NAPSZAM -eq 7 ] && [ $DATUM_NAP -ne 01 ]
then
#Vasarnap van, nem elseje -> Teljes mentes
echo "`date` ============== Teljes mentes " >> $LOGFAJL
for ((i=0; i<${#TAVOLI_KONYVTAR[*]}; i++ )) do
SZAMLALO=$((i+1))
echo "`date` $SZAMLALO / ${#TAVOLI_KONYVTAR[*]} ============== ${TAVOLI_KONYVTAR[$i]}" >> $LOGFAJL
echo "`date` ============== ${TAVOLI_KONYVTAR[$i]}" >> ${LOG_FAJL[$i]}
if [ ${#EXCLUDE[$i]} -eq 0 ]
then
EXCLUDE_STRING=""
else
EXCLUDE_STRING="--exclude-from=${EXCLUDE[$i]}"
fi
rsync -azv --size-only $EXCLUDE_STRING= ${TAVOLI_KONYVTAR[$i]} ${HELYI_KONYVTAR[$i]} >> ${LOG_FAJL[$i]}
done
else
if [ $DATUM_NAP -eq 01 ]
then
#Elseje van -> Teljes mentes, torlessel
echo "`date` ============== Teljes mentes torlessel " >> $LOGFAJL
for ((i=0; i<${#TAVOLI_KONYVTAR[*]}; i++ )) do
SZAMLALO=$((i+1))
echo "`date` $SZAMLALO / ${#TAVOLI_KONYVTAR[*]} ============== ${TAVOLI_KONYVTAR[$i]}" >> $LOGFAJL
echo "`date` ============== ${TAVOLI_KONYVTAR[$i]}" >> ${LOG_FAJL[$i]}
#============== Regi mentes torlese
rm -rf ${DIFF_KONYVTAR[$i]}/$REGINAP
if [ ${#EXCLUDE[$i]} -eq 0 ]
then
EXCLUDE_STRING=""
else
EXCLUDE_STRING="--exclude-from=${EXCLUDE[$i]}"
fi
rsync -azv --size-only --delete $EXCLUDE_STRING ${TAVOLI_KONYVTAR[$i]} ${HELYI_KONYVTAR[$i]} >> ${LOG_FAJL[$i]}
done
else
#Hetfotol szombatig (nincs vasarnap, sem elseje ) -> Inkrementalis mentes
echo "`date` ============== Inkrementalis mentes " >> $LOGFAJL
for ((i=0; i<${#TAVOLI_KONYVTAR[*]}; i++ )) do
SZAMLALO=$((i+1))
echo "`date` $SZAMLALO / ${#TAVOLI_KONYVTAR[*]} ============== ${TAVOLI_KONYVTAR[$i]}" >> $LOGFAJL
echo "`date` ============== ${TAVOLI_KONYVTAR[$i]}" >> ${LOG_FAJL[$i]}
#============== Mai naphoz a konyvtar letrehozasa
if [ ! -d "${DIFF_KONYVTAR[$i]}/$MAINAP" ]
then
mkdir -p ${DIFF_KONYVTAR[$i]}/$MAINAP
fi
#============== Regi mentes torlese
if [ -d "${DIFF_KONYVTAR[$i]}/$REGINAP" ]
then
rm -rf ${DIFF_KONYVTAR[$i]}/$REGINAP
fi
#============== Mentunk
if [ ${#EXCLUDE[$i]} -eq 0 ]
then
EXCLUDE_STRING=""
else
EXCLUDE_STRING="--exclude-from=${EXCLUDE[$i]}"
fi
rsync -azvm --size-only $EXCLUDE_STRING --compare-dest=${HELYI_KONYVTAR[$i]} ${TAVOLI_KONYVTAR[$i]} ${DIFF_KONYVTAR[$i]}/$MAINAP >> ${LOG_FAJL[$i]} && find ${DIFF_KONYVTAR[$i]}/ -depth -type d -empty -exec rmdir {} \;
done
fi
fi
echo "`date` ============== Rsync Finished ==============" >> $LOGFAJL
echo "============== Mai mentes merete: ==============" >> $LOGFAJL
du -sh /backup/*/diff/*/$MAINAP/ | grep -v K >> $LOGFAJL
echo "============== Maradek hattertar : ==============" >> $LOGFAJL
df -h /backup >> $LOGFAJL
mail $ADMIN_EMAIL -s " Rsync mentes $MAINAP " < $LOGFAJL
# Logrotalas
mv $LOGFAJL $LOGFAJL.$MAINAP
rm $LOGFAJL.$REGINAP
A fenti shell script elvégzi a munkát, már csak a rendszeres futtatásról kell gondoskodni. Ehhez az alábbi sort kell beilleszteni a /etc/crontab- ba:
0 19 * * * root /etc/scripts/rsync.sh
Így a mentés minden nap 19:00- kor fog elindulni.