Outils personnels

Rdiff-backup : Différence entre versions

De wikiGite

Ligne 36 : Ligne 36 :
 
  rdiff-backup -v5 --remove-older-than 4W /backup
 
  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.
 
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 :<br/>
 
Liste des incréments :<br/>
Ligne 42 : Ligne 43 :
 
A partir du serveur sauvegardé (remote-schema n'est utile que si le port ssh n'est pas standard) :
 
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
 
  rdiff-backup -l --remote-schema='ssh -p 225 -C %s rdiff-backup --server' root@192.168.1.250::/home/backup
 +
 
------------------
 
------------------
 
Restore - Exemples
 
Restore - Exemples
Ligne 49 : Ligne 51 :
 
  # /etc/ d'il y a 3 jours
 
  # /etc/ d'il y a 3 jours
 
  rdiff-backup -v5 -r "3D" --force ./etc root@192.168.1.2::/etc
 
  rdiff-backup -v5 -r "3D" --force ./etc root@192.168.1.2::/etc
 +
 +
-----------------
 +
'''DEPANNAGE'''
 +
Si après un problème de sauvegarde (disque plein, coupure de session ssh, etc...), les backups suivants se terminent en erreur (erreurs checksum ou autres), il faut '''supprimer le répertoire rdiff-backup-data''' et relancer un backup avec --force pour repartir à zéro (on perd l'historique des incréments !).
  
 
-----------------
 
-----------------
Ligne 57 : Ligne 63 :
 
  # v1.0 from sbackup.sh (RSYNC) v2
 
  # v1.0 from sbackup.sh (RSYNC) v2
 
  # Changelog :
 
  # Changelog :
 +
# - Added handle for a pre-backup script (if pre-backup script ended with error <> 0, main script stops)
 
  # - Moving variables in a .conf file
 
  # - Moving variables in a .conf file
 
  #  Variables :
 
  #  Variables :
Ligne 66 : Ligne 73 :
 
  #LIST=$6
 
  #LIST=$6
 
  #EXCLUDE=$7
 
  #EXCLUDE=$7
 +
#PRESCRIPT=$8
 
  #BCK_DEV=/home
 
  #BCK_DEV=/home
 
  #BCK_DIR=$BCK_DEV/backup/$SERVERNAME
 
  #BCK_DIR=$BCK_DEV/backup/$SERVERNAME
 
  #RDIFF_OPTS="-v5 --force"
 
  #RDIFF_OPTS="-v5 --force"
 
   
 
   
  . /home/sites/phototheque.odyssea.local/rdbackup.conf
+
  . ./rdbackup.conf
 
   
 
   
 
  # Fix variables
 
  # Fix variables
Ligne 85 : Ligne 93 :
 
  if [ ! -e $BCK_DIR/$PID_FILE ]
 
  if [ ! -e $BCK_DIR/$PID_FILE ]
 
  then
 
  then
 +
  # Script pre-backup
 +
    if [ -f $PRESCRIPT ]
 +
    then
 +
      $PRESCRIPT
 +
      if [ $? -ne 0 ]
 +
      then
 +
          exit 1
 +
      fi
 +
    fi
 +
 
     echo $$ > $BCK_DIR/$PID_FILE
 
     echo $$ > $BCK_DIR/$PID_FILE
 
     /usr/bin/logger "Sauvegarde rdiff $SERVERNAME"
 
     /usr/bin/logger "Sauvegarde rdiff $SERVERNAME"
Ligne 130 : Ligne 148 :
 
           ERRORS="$ERRORS $BASE=$ERROR:"
 
           ERRORS="$ERRORS $BASE=$ERROR:"
 
           ERROR_FLAG=1
 
           ERROR_FLAG=1
       fi
+
       else
      echo CLEANING BACKUPS OF $rdir >> $BCK_DIR/$LOG_FILE
+
          echo CLEANING BACKUPS OF $rdir >> $BCK_DIR/$LOG_FILE
      echo rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE 2>&1
+
          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
+
          rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE 2>&1
      ERROR=$?
+
          ERROR=$?
      if [ $ERROR -ne 0 ]
+
          if [ $ERROR -ne 0 ]
      then
+
          then
          ERRORS="$ERRORS $BASE=$ERROR:"
+
            ERRORS="$ERRORS $BASE=$ERROR:"
          ERROR_FLAG=1
+
            ERROR_FLAG=1
 +
          fi
 
       fi
 
       fi
 
       echo Backup statistics of $rdir >> $BCK_DIR/$STAT_FILE
 
       echo Backup statistics of $rdir >> $BCK_DIR/$STAT_FILE
Ligne 166 : Ligne 185 :
 
     (echo "$HOSTNAME:$BCK_DIR/$PID_FILE existe : abandon de $0") | mail -s "Erreur sur backup $HOSTNAME" $MAIL_ADMIN
 
     (echo "$HOSTNAME:$BCK_DIR/$PID_FILE existe : abandon de $0") | mail -s "Erreur sur backup $HOSTNAME" $MAIL_ADMIN
 
  fi
 
  fi
 +
 +
 
-------------
 
-------------
 
Fichier rdbackup.conf
 
Fichier rdbackup.conf
Ligne 175 : Ligne 196 :
 
  MAIL_ADMIN=root
 
  MAIL_ADMIN=root
 
  RETENTION="--remove-older-than 1W"
 
  RETENTION="--remove-older-than 1W"
  LIST=/home/sites/phototheque.odyssea.local/rdbackup.list
+
  LIST=./rdbackup.list
  EXCLUDE=/home/sites/phototheque.odyssea.local/rdbackup.exclude
+
  EXCLUDE=./rdbackup.exclude
 +
PRESCRIPT=
 +
# ou : PRESCRIPT=./server_pre_backup.sh
 
  BCK_DIR=/home/backup
 
  BCK_DIR=/home/backup
 
  RDIFF_OPTS="-v5 --force"
 
  RDIFF_OPTS="-v5 --force"

Version du 15 septembre 2010 à 09:10

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

DEPANNAGE Si après un problème de sauvegarde (disque plein, coupure de session ssh, etc...), les backups suivants se terminent en erreur (erreurs checksum ou autres), il faut supprimer le répertoire rdiff-backup-data et relancer un backup avec --force pour repartir à zéro (on perd l'historique des incréments !).


Exemple de script rdbackup.sh

#!/bin/bash
# Script de sauvegarde des serveurs (RDIFF sur SSH)
# FSo 06/2010
# v1.0 from sbackup.sh (RSYNC) v2
# Changelog :
# - Added handle for a pre-backup script (if pre-backup script ended with error <> 0, main script stops)
# - Moving variables in a .conf file
#   Variables :
#SERVERNAME=$1
#SERVERIP=$2
#SERVERPORT=$3
#SERVERUSR=$4
#RETENTION="--remove-older-than $5"
#LIST=$6
#EXCLUDE=$7
#PRESCRIPT=$8
#BCK_DEV=/home
#BCK_DIR=$BCK_DEV/backup/$SERVERNAME
#RDIFF_OPTS="-v5 --force"

. ./rdbackup.conf

# Fix variables
LOG_FILE=rdiff_ephoto.log
STAT_FILE=rdiff_ephoto.stats
PID_FILE=rdiff_ephoto.pid

while read line
do
   REMOTE_DIR="$REMOTE_DIR $line"
   shift
done < $LIST

if [ ! -e $BCK_DIR/$PID_FILE ]
then
 # Script pre-backup
   if [ -f $PRESCRIPT ]
   then
      $PRESCRIPT
      if [ $? -ne 0 ]
      then
         exit 1
      fi
   fi

   echo $$ > $BCK_DIR/$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 $EXCLUDE_OPT $rdir ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE
      rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT $rdir ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE 2>&1
      ERROR=$?
      if [ $ERROR -ne 0 ]
      then
         ERRORS="$ERRORS $BASE=$ERROR:"
         ERROR_FLAG=1
      else
         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
      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)" $MAIL_ADMIN
   else
      (date
       ls -l $BCK_DIR/$LOG_FILE
       df -k $BCK_DIR
       cat $BCK_DIR/$STAT_FILE
      )| mail -s "Sauvegarde $HOSTNAME $(date +%d/%m) terminee" $MAIL_ADMIN
   fi
   date >> $BCK_DIR/$LOG_FILE
   /usr/bin/logger "FIN rdiff $HOSTNAME"
   rm -f $BCK_DIR/$PID_FILE
else
    (echo "$HOSTNAME:$BCK_DIR/$PID_FILE existe : abandon de $0") | mail -s "Erreur sur backup $HOSTNAME" $MAIL_ADMIN
fi



Fichier rdbackup.conf

# Configuration rdbackup
SERVERNAME=localhost
SERVERIP=127.0.0.1
SERVERPORT=22
SERVERUSR=admin
MAIL_ADMIN=root
RETENTION="--remove-older-than 1W"
LIST=./rdbackup.list
EXCLUDE=./rdbackup.exclude
PRESCRIPT=
# ou : PRESCRIPT=./server_pre_backup.sh
BCK_DIR=/home/backup
RDIFF_OPTS="-v5 --force"



Pour mémoire, script v1 sans rdbackup.conf

#!/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