Rdiff-backup : Différence entre versions
De wikiGite
| Ligne 51 : | Ligne 51 : | ||
----------------- | ----------------- | ||
| + | Exemple de script rdbackup.sh | ||
| + | #!/bin/bash | ||
| + | # Script de sauvegarde des serveurs (RDIFF sur SSH) | ||
| + | # FSo 06/2010 | ||
| + | # v1.0 from sbackup.sh (RSYNC) v1.2 | ||
| + | # Changelog : | ||
| + | # | ||
| + | # svg_server.sh <hostname> <ip> <port> <user valide pour ssh> <duree retention> <fichier liste backup> <fichier exclusions> | ||
| + | # exemple cron.d : | ||
| + | #00 02 * * * root /backup/rdbackup.sh server.example.fr 123.123.12.123 22 root 1W /backup/server.list /backup/server.excl > /backup/log/svg_server.cron.err 2>&1 | ||
| + | # | ||
| + | SERVERNAME=$1 | ||
| + | SERVERIP=$2 | ||
| + | SERVERPORT=$3 | ||
| + | SERVERUSR=$4 | ||
| + | RETENTION="--remove-older-than $5" | ||
| + | LIST=$6 | ||
| + | EXCLUDE=$7 | ||
| + | BCK_DEV=/home | ||
| + | BCK_DIR=$BCK_DEV/backup/$SERVERNAME | ||
| + | LOG_FILE=rdiff_$SERVERNAME.log | ||
| + | STAT_FILE=rdiff_$SERVERNAME.stats | ||
| + | PID_FILE=/var/run/rdiff_$SERVERNAME.pid | ||
| + | RDIFF_OPTS="-v5 --force" | ||
| + | |||
| + | if [ $# -lt 6 ] | ||
| + | then | ||
| + | echo Usage : $0 serverFQDN serverIP serverSSHPORT SSHUSER RETENTION BACKUPLISTfile [EXCLUDEfile] | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | shift; shift; shift | ||
| + | while read line | ||
| + | do | ||
| + | REMOTE_DIR="$REMOTE_DIR $line" | ||
| + | shift | ||
| + | done < $LIST | ||
| + | |||
| + | if [ ! -e $PID_FILE ] | ||
| + | then | ||
| + | echo $$ > $PID_FILE | ||
| + | /usr/bin/logger "Sauvegarde rdiff $SERVERNAME" | ||
| + | if [ -e $BCK_DIR/$LOG_FILE ] | ||
| + | then | ||
| + | mv $BCK_DIR/$LOG_FILE $BCK_DIR/$LOG_FILE.0 | ||
| + | fi | ||
| + | if [ -e $BCK_DIR/$STAT_FILE ] | ||
| + | then | ||
| + | mv $BCK_DIR/$STAT_FILE $BCK_DIR/$STAT_FILE.0 | ||
| + | fi | ||
| + | echo "Sauvegarde rdiff $SERVERNAME" > $BCK_DIR/$LOG_FILE | ||
| + | #Boucle de backup | ||
| + | ERROR_FLAG=0 | ||
| + | ERROR=0 | ||
| + | ERRORS="ERREURS: " | ||
| + | for rdir in $(echo $REMOTE_DIR) | ||
| + | do | ||
| + | if [ ! -d ${BCK_DIR}${rdir} ] | ||
| + | then | ||
| + | mkdir -p ${BCK_DIR}${rdir} | ||
| + | fi | ||
| + | |||
| + | if [ ! "x$EXCLUDE" == "x" ] | ||
| + | then | ||
| + | EXCLUDE_OPT="" | ||
| + | while read line | ||
| + | do | ||
| + | if [[ $line =~ ^$rdir ]] | ||
| + | then | ||
| + | EXCLUDE_OPT="$EXCLUDE_OPT --exclude $line" | ||
| + | fi | ||
| + | shift | ||
| + | done < $EXCLUDE | ||
| + | fi | ||
| + | # rdiff | ||
| + | date >> $BCK_DIR/$LOG_FILE | ||
| + | echo >> $BCK_DIR/$LOG_FILE | ||
| + | echo RDIFF-BACKUP OF $rdir >> $BCK_DIR/$LOG_FILE | ||
| + | echo rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT $SERVERUSR@$SERVERIP::$rdir ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE | ||
| + | rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT $SERVERUSR@$SERVERIP::$rdir ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE 2>&1 | ||
| + | ERROR=$? | ||
| + | if [ $ERROR -ne 0 ] | ||
| + | then | ||
| + | ERRORS="$ERRORS $BASE=$ERROR:" | ||
| + | ERROR_FLAG=1 | ||
| + | fi | ||
| + | echo CLEANING BACKUPS OF $rdir >> $BCK_DIR/$LOG_FILE | ||
| + | echo rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE 2>&1 | ||
| + | rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE 2>&1 | ||
| + | ERROR=$? | ||
| + | if [ $ERROR -ne 0 ] | ||
| + | then | ||
| + | ERRORS="$ERRORS $BASE=$ERROR:" | ||
| + | ERROR_FLAG=1 | ||
| + | fi | ||
| + | echo Backup statistics of $rdir >> $BCK_DIR/$STAT_FILE | ||
| + | cat ${BCK_DIR}${rdir}/rdiff-backup-data/session_statistics.$(date "+%Y-%m-%d")* >> $BCK_DIR/$STAT_FILE | ||
| + | echo >> $BCK_DIR/$STAT_FILE | ||
| + | done | ||
| + | if [ $ERROR_FLAG -eq 1 ] | ||
| + | then | ||
| + | (echo $ERRORS | ||
| + | date | ||
| + | echo Voir $BCK_DIR/$LOG_FILE | ||
| + | grep -i warning $BCK_DIR/$LOG_FILE | ||
| + | grep -i error $BCK_DIR/$LOG_FILE | ||
| + | cat $BCK_DIR/$STAT_FILE | ||
| + | )| mail -s "ERREUR RDIFF SUR $SERVERNAME $(date +%d/%m)" fsoyer@systea.net | ||
| + | else | ||
| + | (date | ||
| + | ls -l $BCK_DIR/$LOG_FILE | ||
| + | df -k $BCK_DIR | ||
| + | cat $BCK_DIR/$STAT_FILE | ||
| + | )| mail -s "Sauvegarde $SERVERNAME $(date +%d/%m) terminee" fsoyer@systea.net | ||
| + | fi | ||
| + | date >> $BCK_DIR/$LOG_FILE | ||
| + | /usr/bin/logger "FIN rdiff $SERVERNAME" | ||
| + | rm -f $PID_FILE | ||
| + | else | ||
| + | (echo "$SERVERNAME:$PID_FILE existe : abandon de $0") | mail -s "Erreur sur backup $SERVERNAME" fsoyer@systea.net | ||
| + | fi | ||
Version du 30 juillet 2010 à 10:46
A AJOUTER : procédure Windows
Sur Debian 5 --> v1.2.5 (la différence de version mineure (.5 pour .8) ne provoque qu'un avertissement)
apt-get install rdiff-backup
Si on veut une version plus récente, il faut compiler :
apt-get install librsync-dev python-dev wget http://savannah.nongnu.org/download/rdiff-backup/rdiff-backup-1.2.8.tar.gz tar -xvzf rdiff-backup-1.2.8.tar.gz cd rdiff-backup-1.2.8 python setup.py install
Sur CentOS, installation repos RPMForge (http://wiki.centos.org/AdditionalResources/Repositories/RPMForge).
Sur CentOS4 :
wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el4.rf.i386.rpm
Sur CentOS5 :
wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.i386.rpm
Puis
rpm -i rpmforge-release-0.5.1-1.el*.rf.i386.rpm vi /etc/yum.repos.d/rpmforge.repo # --> mettre enabled à 0 yum --enablerepo=rpmforge install rdiff-backup
Test d'accès à un serveur :
rdiff-backup --test-server root@192.168.1.21::/home
Sauvegarde à partir d'un backup existant (cp ou rsync) : le répertoire destination existe mais n'est pas au format rdiff (manque les infos rdiff-data), il faut le forcer la première fois :
rdiff-backup --force -v5 root@192.168.1.2::/etc /backup/etc > rdiff_server1.log 2>&1
Ensuite on peut enlever le "--force".
Nettoyage Des incréments supérieurs à une fenêtre de rétention :
rdiff-backup -v5 --remove-older-than 4W /backup
Le "4W" signifie "4 weeks", soit 4 semaines à conserver. On peut donner un nombre de jours ("D") ou d'heures ("H"). Tous les incréments supérieurs à ce délai seront supprimés.
Liste des incréments :
Sur le serveur de sauvegarde :
rdiff-backup -l /home/backup/server1/home/
A partir du serveur sauvegardé (remote-schema n'est utile que si le port ssh n'est pas standard) :
rdiff-backup -l --remote-schema='ssh -p 225 -C %s rdiff-backup --server' root@192.168.1.250::/home/backup
Restore - Exemples
# /etc/hosts d'il y a 1 heure (--force si le fichier existe et qu'il faut l'écraser) rdiff-backup -v5 -r "1h" --force ./etc/hosts root@192.168.1.2::/etc/hosts
# /etc/ d'il y a 3 jours rdiff-backup -v5 -r "3D" --force ./etc root@192.168.1.2::/etc
Exemple de script rdbackup.sh
#!/bin/bash
# Script de sauvegarde des serveurs (RDIFF sur SSH)
# FSo 06/2010
# v1.0 from sbackup.sh (RSYNC) v1.2
# Changelog :
#
# svg_server.sh <hostname> <ip> <port> <user valide pour ssh> <duree retention> <fichier liste backup> <fichier exclusions>
# exemple cron.d :
#00 02 * * * root /backup/rdbackup.sh server.example.fr 123.123.12.123 22 root 1W /backup/server.list /backup/server.excl > /backup/log/svg_server.cron.err 2>&1
#
SERVERNAME=$1
SERVERIP=$2
SERVERPORT=$3
SERVERUSR=$4
RETENTION="--remove-older-than $5"
LIST=$6
EXCLUDE=$7
BCK_DEV=/home
BCK_DIR=$BCK_DEV/backup/$SERVERNAME
LOG_FILE=rdiff_$SERVERNAME.log
STAT_FILE=rdiff_$SERVERNAME.stats
PID_FILE=/var/run/rdiff_$SERVERNAME.pid
RDIFF_OPTS="-v5 --force"
if [ $# -lt 6 ]
then
echo Usage : $0 serverFQDN serverIP serverSSHPORT SSHUSER RETENTION BACKUPLISTfile [EXCLUDEfile]
exit 1
fi
shift; shift; shift
while read line
do
REMOTE_DIR="$REMOTE_DIR $line"
shift
done < $LIST
if [ ! -e $PID_FILE ]
then
echo $$ > $PID_FILE
/usr/bin/logger "Sauvegarde rdiff $SERVERNAME"
if [ -e $BCK_DIR/$LOG_FILE ]
then
mv $BCK_DIR/$LOG_FILE $BCK_DIR/$LOG_FILE.0
fi
if [ -e $BCK_DIR/$STAT_FILE ]
then
mv $BCK_DIR/$STAT_FILE $BCK_DIR/$STAT_FILE.0
fi
echo "Sauvegarde rdiff $SERVERNAME" > $BCK_DIR/$LOG_FILE
#Boucle de backup
ERROR_FLAG=0
ERROR=0
ERRORS="ERREURS: "
for rdir in $(echo $REMOTE_DIR)
do
if [ ! -d ${BCK_DIR}${rdir} ]
then
mkdir -p ${BCK_DIR}${rdir}
fi
if [ ! "x$EXCLUDE" == "x" ]
then
EXCLUDE_OPT=""
while read line
do
if $line =~ ^$rdir
then
EXCLUDE_OPT="$EXCLUDE_OPT --exclude $line"
fi
shift
done < $EXCLUDE
fi
# rdiff
date >> $BCK_DIR/$LOG_FILE
echo >> $BCK_DIR/$LOG_FILE
echo RDIFF-BACKUP OF $rdir >> $BCK_DIR/$LOG_FILE
echo rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT $SERVERUSR@$SERVERIP::$rdir ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE
rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT $SERVERUSR@$SERVERIP::$rdir ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE 2>&1
ERROR=$?
if [ $ERROR -ne 0 ]
then
ERRORS="$ERRORS $BASE=$ERROR:"
ERROR_FLAG=1
fi
echo CLEANING BACKUPS OF $rdir >> $BCK_DIR/$LOG_FILE
echo rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE 2>&1
rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE 2>&1
ERROR=$?
if [ $ERROR -ne 0 ]
then
ERRORS="$ERRORS $BASE=$ERROR:"
ERROR_FLAG=1
fi
echo Backup statistics of $rdir >> $BCK_DIR/$STAT_FILE
cat ${BCK_DIR}${rdir}/rdiff-backup-data/session_statistics.$(date "+%Y-%m-%d")* >> $BCK_DIR/$STAT_FILE
echo >> $BCK_DIR/$STAT_FILE
done
if [ $ERROR_FLAG -eq 1 ]
then
(echo $ERRORS
date
echo Voir $BCK_DIR/$LOG_FILE
grep -i warning $BCK_DIR/$LOG_FILE
grep -i error $BCK_DIR/$LOG_FILE
cat $BCK_DIR/$STAT_FILE
)| mail -s "ERREUR RDIFF SUR $SERVERNAME $(date +%d/%m)" fsoyer@systea.net
else
(date
ls -l $BCK_DIR/$LOG_FILE
df -k $BCK_DIR
cat $BCK_DIR/$STAT_FILE
)| mail -s "Sauvegarde $SERVERNAME $(date +%d/%m) terminee" fsoyer@systea.net
fi
date >> $BCK_DIR/$LOG_FILE
/usr/bin/logger "FIN rdiff $SERVERNAME"
rm -f $PID_FILE
else
(echo "$SERVERNAME:$PID_FILE existe : abandon de $0") | mail -s "Erreur sur backup $SERVERNAME" fsoyer@systea.net
fi
