Backup incrementale con rsync tramite ssh

Inserito da il 9 April 2008, 2371 visite totali

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 – *.

2 commenti per “Backup incrementale con rsync tramite ssh”

  1. malex scrive:

    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.

Lascia una risposta

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