Backup incrementale con rsync

Inserito da il 5 December 2006, 3045 visite totali

Nell’epoca dell’informatica i dati hanno sempre rappresentato una questione fondamentale e da diversi anni ormai si investono fonti in sistemi di back-up dei dati

Questo script vuole essere un punto di partenza per creare un sistema di back-up veloce e facile da mantenere sfruttando la potenza di rsync. Lo script in uscita invia una mail con il log dell’oprerazione di salvataggio.

L’uso dello script è molto semplice, basta salvare il code sottostante in un file di testo e dargli i pernessi di esecuzione.

#!/bin/sh

#Piccolo sistema di backup
#Richiede rsync e un server mail tipo sendmail
#usa mail per inviare l email di notifica
#Ver 0.1

######## SETTINGS ########

MAKER=`whoami`

# Destinatario mail di backup, i destinatari vanno separati da virgola (,)
DEST="user1@dominio1,user2@dominio1" 

# FORMATO DATA
DATE=`date +"%d-%m-%y"` 

#Device e dir dove salvare il back_up
DEV="/mnt/dati" 
DIR_BACKUP="backup"

BIN_NAME="rsync"
BIN=`which $BIN_NAME`

#elenco directory del quale si vuole fare il basckup, + directory vanno separate a spazio
#NB và inserito il path completo
BKPATH="/boot /root /home/user"

#File di log
LOG="$DEV/$DIR_BACKUP/backup-$DATE.txt"

#File che contiene il corpo della mail
MLF="/tmp/mlbackup"

#monta, nel caso sia necessario il device dove eseguire il device
#la regola di montaggio deve essere contenuta in /etc/fstab
#esegue controlli su montaggio corretto ed esistenza dir di backup
MNT(){
	
    TEST=`mount | grep $DEV 2>/dev/null`
    echo -e "\nVerifico se il device ($DEV) è già montato! \n" >>$MLF
    if [ -z "$TEST" ];then  #restituisce vero se $TEST è vuoto
		mount $DEV  2>/dev/null
		RMT=`echo $?` #se il mount và a buon fine restituisce 0
		if [ "$RMT"=="0" ];then
    		echo -e "Device montato, proseguo! \n" >>$MLF
			MNTR=0
		else
			echo -e "Non sono riuscito a montare $DEV \n" >>$MLF
			MNTR=1
		fi
    else
		echo -e "Il device $DEV risulta già montato, proseguo \n" >>$MLF
		MNTR=0
    fi

	if [ "$MNTR"=="0" ];then
		if [ ! -d $DEV/$DIR_BACKUP ]; then
			mkdir -p $DEV/$DIR_BACKUP 2>/dev/null
			RMD=`echo $?` #se il mkdir và a buon fine restituisce 0
			if [ "$RMD"=="0" ];then
				echo -e "Dir $DEV/$DIR_BACKUP creta. \n" >>$MLF
				MNTR=0
			else
				echo -e "No sono riuscito a creare $DEV/$DIR_BACKUP. \n" >>$MLF
				MNTR=1
			fi
		else
			echo -e "$DEV/$DIR_BACKUP esiste già.\n" >>$MLF
			MNTR=0
		fi
	else
		echo -e "Non posso creare $DEV/$DIR_BACKUP:\n\t - $DEV non montato" >>$MLF
		MNTR=1
	fi
	
}

#Funzione nel caso non serva montare il device
NOMNT(){
	
	if [ ! -d $DEV/$DIR_BACKUP ]; then
		mkdir -p $DEV/$DIR_BACKUP 2>/dev/null
		RMD=`echo $?` #se il mkdir và a buon fine restituisce 0
		if [ "$RMD"=="0" ];then
			echo -e "Dir $DEV/$DIR_BACKUP creta. \n" >>$MLF
			NMNTR=0
		else
			echo -e "No sono riuscito a creare $DEV/$DIR_BACKUP.\n" >>$MLF
			NMNTR=1
		fi
	fi
	
} 

#Funzione che esegue il backup
RSYNC(){
	
	DIR="`echo $DEV | sed -e 's/\/$//'`"
	echo -e "\t Attendi....backup in corso";
	$BIN -av $BKPATH \
		$DIR/$DIR_BACKUP/ \
		--progress --delete --links &> $LOG
	RSR=`echo $?`
	if [ "$RSR"=="0" ];then
		echo -e "\nBackup eseguito con sucesso \n">>$MLF
	else
		echo -e "\n Backup non riuscito \n">>$MLF
	fi
	
}

#Funzion che controlla l'esistenza del file $LOG
RSLOG(){
	
	if [ -f $LOG ];then
		RSLR=0
	else
		echo -e "Il file $LOG non è stato trovato in $LOG \n" >>$MLF
		RSLR=1
	fi
	
}

#Funzione per l'invio della mail
MAIL(){ 
	
	case $RSLR in
		0)
			less $MLF | mail -s "Back-up server del $DATE" -a $LOG $DEST
			;;
		*)
			less $MLF | mail -s "Back-up server del $DATE" $DEST
			;;
	esac
	#rimuove il file $MLF
	rm $MLF
	
}


#MAIN
if [ "$MAKER" == "root" ]; then
	echo -e "Ecco i log del backup del $DATE \n" >>$MLF
	case $1 in
		mount)
			echo -e "$0 utilizzato con il parametro mount \n" >>$MLF
			MNT
			if [ "$MNTR"=="0" ];then
				RSYNC
				if [ "$RSR"=="0" ];then
					RSLOG
					MAIL
					exit 0
				else
					RSLOG
					MAIL
					exit 1
				fi
			else
				RSLOG
				MAIL
				exit 1
			fi
			;;
		nomount)
			echo -e "$0 utilizzato con il parametro nomount \n" >>$MLF
			NOMNT
			if [ "$NMNTR"=="0" ];then
				RSYNC
				if [ "$RSR"=="0" ];then
					RSLOG
					MAIL
					exit 0
				else
					RSLOG
					MAIL
					exit 1
				fi
			else
				RSLOG
				MAIL
				exit 1
			fi
			;;
		*)
			echo "Devi usare $0 {mount|nomount} "
			exit 1
			;;
	esac		
else
	echo "\tDevi essere root per eseguire $0 "
	exit 1
fi

Lo script deve essere eseguito con il paramentro mount o nomount che servono a montare o non montare il device dove deve essere salvato il back-up ($DEV). NB: affinchè l’opzione di mantaggio vada a buon fine è necesario che il file /etc/fstab sia ben configurato.

Prima di essere lanciato è necessario personalizzare alcune variabili: $DEST, $DEV, $DIR, $BKPATH. Queste contengono rispettivamente i destinatari della mail, il device e la directory dove verranno salvati i file e le directory delle quli eseguire il back-up.

Segnalate pure eventuali consigli e migliorie.

Lo script è disponibile per il download sul server FTP.

5 commenti per “Backup incrementale con rsync”

  1. Massimo scrive:

    Aiuto!!!
    Non mi funziona! Quando digito ./nome.sh dello script di backup opportunamente configurato, mi da:
    bash: ./copia.sh: /bin/sh^M: interprete errato: Nessun file o directory

    Non riesco a capire perchè!
    Saluti e buon lavoro

  2. Matteo Mattei scrive:

    Quella ^M mi sa tanto di windows… non è che per caso hai provato a incollare il file da windows e poi l’hai portato su linux? Copia e incolla direttamente da linux oppure riformatta il file utilizzando dos2unix e riprova…

  3. RedWiz scrive:

    ciao
    prendendo spunto da questo articolo:
    http://sblov.blogspot.com/2007/04/backup-incrementale-con-rsync-e-crontab.html

    potresti anche tu prevedere un meccanismo di esclusione di determinati files/directory.

    ad esempio in un backup potrebbero non servire tutte le directory relative al concurrent versioning (.cvs, .svn, etc…)

  4. Matteo Mattei scrive:

    Si, lo script che utilizzo io gia’ lo ha, solo che non ho mai avuto il tempo materiale per correggere l’articolo e aggiornarlo all’ultima versione. Appena trovo un attimo lo faro’ comunque! 😉

    Grazie per avermelo ricordato…

Lascia una risposta

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *