Backup incrementale con rsync tramite ssh
Il seguente script lo stiamo attualmente utilizzando per backuppare dump, siti web, repository subversion, file di configurazione ecc… per spaghettilinux.org su di un server dedicato ai backup.
Innanzi tutto occorre preparare la macchina dedicata ai backup installando rsync e openssh di cui per adesso ne ometto le installazioni per motivi di tempo.
La macchina in questione occorre che sia possibilmente collegata 24 ore su 24, 7 giorni su 7 ad una linea veloce e disponga di un discreto spazio a disposizione (a seconda della quantita’ da backuppare). Una volta installato openssh e creata la coppia di chiavi sulla macchina dei backup è necessario copiare la chiave pubblica nell’authorized_keys dell’utente root del server. (Per maggiori informazioni sull’utilizzo di openssh senza l’utilizzo di password si rimanda alla guida per usare ssh senza password per gestire un server remoto.
Fatto ciò, create uno script simile a quello rappresentato qui sotto e mettetelo in crontab sul vostro server dedicato ai backup.
#!/bin/bash # # Incremental Backup Script 0.1 # Copyrigth by Matteo Mattei# This software is relased under the GPL license and so # you can modify or distribuite this in your freedom ###################### # START CONFIGURAZTION ###################### DEV=”/backup” # DESTINATION DIRECTORY (must exists) DST_NAME=”backup” # FINAL ARCHIVE NAME (backup_1, backup_2 ecc..) N_SNAPSHOT=7 # NUMBER OF SAVED ARCHIVES BACKUP_PATH=”-e ssh root@spaghettilinux.org:/” # SOURCE PATH DESTINATION=”matteo.mattei@gmail.com” # E-MAIL DESTINATION RSYNC_OPTIONS=”-avz –progress –delete –delete-after –exclude-from=/root/backupexclude” # RSYNC OPTIONS ###################################################################### # DON’T MODIFY ANYTHING BEHIND HERE ###################################################################### ###################### # VAR INIZIATLIZATION ###################### i=$N_SNAPSHOT DATE=`date +”%y-%m-%d”` BIN=`which rsync` DIR=”`echo $DEV | sed -e ’s//$//’`” LOG=”$DIR/backup-$DATE.txt” MLF=”/tmp/mlbackup” ###################### # MOUNT FUNCTION ##################### MNT() { TEST=`mount | grep $DIR 2>/dev/null` echo -e “nVerify if ($DIR) is mounted…n” >>$MLF if [ -z “$TEST” ]; then mount $DIR 2>/dev/null RMT=`echo $?` # return 0 if mount is gone ok if [ “$RMT”==”0″ ]; then echo -e “Device mounted, go next!n” >>$MLF MNTR=0 else echo -e “Can’t mount device ${DIR}!n” >>$MLF MNTR=1 fi else echo -e “Device $DIR already mounted, go next!n” >>$MLF MNTR=0 fi } ###################### # NOMOUNT FUNCTION ###################### NOMNT() { if [ ! -d ${DIR}/${DST_NAME} ]; then mkdir -p ${DIR}/${DST_NAME} 2>/dev/null RMD=`echo $?` # return 0 if mkdir is gone ok if [ “$RMD”==”0″ ]; then echo -e “Dir ${DIR}/${DST_NAME} creted.n” >>$MLF NMNTR=0 else echo -e “Can’t create ${DIR}/${DST_NAME}.n” >>$MLF NMNTR=1 fi fi } ###################### # LOG FUNCTION ###################### RSLOG() { if [ -f $LOG ]; then RSLR=0 else echo -e “File LOG not found in $LOG n” >>$MLF RSLR=1 fi } ###################### # MAIL FUNCTION ###################### MAIL() { case $RSLR in 0) less $MLF | mail -s “Back-up server on $DATE” $DESTINATION < $LOG ;; *) less $MLF | mail -s "Back-up server on $DATE" $DESTINATION ;; esac rm $MLF } ###################### # BACKUP FUNCTION ###################### RSYNC() { echo -e "Wait please..." $BIN $RSYNC_OPTIONS --link-dest=${DIR}/${DST_NAME}_2/ $BACKUP_PATH ${DIR}/${DST_NAME}_1/ &> $LOG RSR=`echo $?` if [ “$RSR”==”0″ ];then echo -e “nBackup successfully done.n”>>$MLF else echo -e “nBackup aborted.n”>>$MLF fi } ###################### # RENAME DIR FUNCTION ###################### RENDIR() { while [ $i -ne 0 ] do TMPDIR=”${DIR}/${DST_NAME}_${i}” if [ $i != $N_SNAPSHOT ] then if [ -d $TMPDIR ] then TMPDST=${DIR}/${DST_NAME}_`expr $i + 1` echo “mv $TMPDIR $TMPDST” >> $MLF mv $TMPDIR $TMPDST fi else if [ -d $TMPDIR ] then # TMPDST=”${DIR}/${DST_NAME}_1″ rm -rf $TMPDIR # echo “mv $TMPDIR $TMPDST” >> $MLF # mv $TMPDIR $TMPDST fi fi i=`expr $i - 1` done } ###################### # MAIN ###################### # make sure to be root if (( `id -u` != 0 )); then { echo “Sorry, must be root. Exiting…”; exit; } fi echo -e “Star backup log of $DATE n” >>$MLF MNT if [ “$MNTR”==”0″ ]; then RENDIR RSYNC if [ “$RSR”==”0″ ]; then RSLOG MAIL exit 0 else RSLOG MAIL exit 1 fi else RSLOG MAIL exit 1 fi
Adesso inserisco in /root lo script per i file da includere/escludere dal backup. Tale script dovra’ essere chiamato backupexclude.
# backup dei websites + /websites/ - /websites/alex_palex/ - /websites/crossbones/ - /websites/dotnetfireball/ - /websites/etc/ - /websites/lordalbert/ - /websites/mio/ - /websites/pennega/ - /websites/phoenix/ - /websites/polgames/ - /websites/stabe/ + /websites/** # backup dell'ftp + /pub/ + /pub/spaghettilinux/ - /pub/spaghettilinux/projects/ + /pub/spaghettilinux/** # backup /etc + /etc/ + /etc/** # backup subversion + /svn/ + /svn/** - *
Come potete vedere la sintassi per i file da includere/escludere è abbastanza semplice… In pratica si tratta di marcare con il simbolo + le directory da prendere in considerazione e quindi con + /directory/** per indicare di prendere tutti i file per quella specifica directory. Analogamente, per escludere alcune directory utilizzeremo il simbolo -.
Ricordatevi che le regole vengono lette dalla prima all’ultima, quindi, in base al tipo di policy che intedete adottare sarebbe opportuno che l’ultima regola termini con un + * o con un - *.
il 8 Maggio 2008 alle 13:32
Lodevole il lavoro per realizzare un script per il backup incrementale, ma esiste già un pacchetto standard che questo ed altro ed disponibile su tutte le distribuzioni linux: rdiff-backup.