Outils personnels

Rdiff-backup : Différence entre versions

De wikiGite

(rdbackup2.2.sh : lancé du serveur A SAUVEGARDER vers le serveur de backup)
(Restore par "-r")
 
(134 révisions intermédiaires par 4 utilisateurs non affichées)
Ligne 10 : Ligne 10 :
 
  python setup.py install
 
  python setup.py install
  
Sur '''CentOS''', installation repos RPMForge (http://wiki.centos.org/AdditionalResources/Repositories/RPMForge).<br/>
+
Sur '''CentOS''', si ça n'a pas déjà été fait (pour munin par exemple), installation repos RPMForge (-> [[Dépôts complémentaires]]).
'''CentOS4''' :
 
wget <nowiki>http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el4.rf.i386.rpm</nowiki>
 
'''CentOS5''' :
 
wget <nowiki>http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.i386.rpm</nowiki>
 
  
 
Puis
 
Puis
rpm -i rpmforge-release-0.5.1-1.el*.rf.i386.rpm
 
cat /etc/yum.repos.d/rpmforge.repo | sed "s/enabled = 1/enabled = 0/" > /root/install/rpmforge.repo
 
cp /root/install/rpmforge.repo /etc/yum.repos.d/rpmforge.repo
 
 
  yum --enablerepo=rpmforge install rdiff-backup
 
  yum --enablerepo=rpmforge install rdiff-backup
  
Ligne 38 : Ligne 31 :
  
 
Ensuite on peut enlever le "--force".
 
Ensuite on peut enlever le "--force".
 +
 +
Eventuellement, si on veut sauvegarder plusieurs répertoires de la même machine, on sauvegarde avec des inclusions :
 +
rdiff-backup --force -v5 --include /etc --include /home --exclude "**" root@192.168.1.2::/ /backup/ > rdiff_server1.log 2>&1
 +
On aura alors à l'arrivée /backup/etc et /backup/home, et un seul répertoire de metadonnées rdiff-backup-datas pour les 2. Le --exclude "**" est là pour éviter que rdiff n'essaie de sauvegarder toute l'arborescence (le "/" qu'on lui donne après les ::) et ne s'occupe que des "--include".
 +
  
 
------------------
 
------------------
 +
 
== Nettoyage ==
 
== Nettoyage ==
 
des incréments supérieurs à une fenêtre de rétention :
 
des incréments supérieurs à une fenêtre de rétention :
Ligne 45 : Ligne 44 :
 
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.
  
------------------
+
== Informations sur les sauvegardes ==
 
Liste des incréments :<br/>
 
Liste des incréments :<br/>
 
Sur le serveur de sauvegarde :
 
Sur le serveur de sauvegarde :
  rdiff-backup -l /home/backup/server1/home/
+
  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) :
 
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
Ligne 54 : Ligne 53 :
 
  rdiff-backup --list-increment-sizes /home/backup/server1/home/
 
  rdiff-backup --list-increment-sizes /home/backup/server1/home/
 
------------------
 
------------------
 +
 
== Restore - Exemples ==
 
== Restore - Exemples ==
 
'''<span style="color:red">NOTE</span> :''' le restore '''NE FONCTIONNE PAS SUR LES LIENS'''. Il faut indiquer le "vrai" répertoire ou fichier physique à restorer.
 
'''<span style="color:red">NOTE</span> :''' le restore '''NE FONCTIONNE PAS SUR LES LIENS'''. Il faut indiquer le "vrai" répertoire ou fichier physique à restorer.
  # fichier /etc/hosts d'il y a 1 heure (--force si le fichier existe et qu'il faut l'écraser)
+
 
 +
'''<span style="color:red">NOTE 2</span> :''' VERIFIER LES '''DROITS DES REPERTOIRES''' APRES UNE RESTAURATION, ils peuvent avoir changé.
 +
 
 +
=== Restore par fichier diff ===
 +
[EDIT 03/2019] Autre façon de restaurer, plus simple si on rencontre des problèmes de caractères spéciaux dans les noms qui empêchent la restauration par "-r"
 +
Repérer le fichier différentiel du fichier à restaurer pour la date voulue. Ex :
 +
ls /repertoire_de_backup/rdiff-backup-data/increments/chemin_complet/fichier.tld.'''2019-03-22'''T02\:55\:35+01\:00'''.diff.gz'''
 +
Restaurer simplement par (exemple vers /tmp local) :
 +
rdiff-backup /repertoire_de_backup/rdiff-backup-data/increments/chemin_complet/fichier.tld.'''2019-03-22'''T02\:55\:35+01\:00'''.diff.gz''' /tmp/fichier.tld
 +
=== Restore par "-r" ===
 +
  # fichier /etc/hosts d'il y a 1 heure (--force si le fichier ou répertoire existe et qu'il faut l'écraser)
 
  rdiff-backup -v5 -r "1h" --force ./etc/hosts root@192.168.1.2::/etc/hosts
 
  rdiff-backup -v5 -r "1h" --force ./etc/hosts root@192.168.1.2::/etc/hosts
 
+
'''NOTE :''' le nom du fichier doit être indiqué à la source COMME A LA DESTINATION, sinon rdiff remonte TOUT LE REPERTOIRE (/etc dans l'exemple) !
 
  # répertoire /etc d'il y a 3 jours
 
  # répertoire /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
'''NOTE :''' le "-r" est obligatoire, on peut mettre "'''-r now'''", ou mieux: " '''-r "1B"''' " pour remonter la dernière sauvegarde. D'autres solutions sont "1D" (comme pour le backup) pour remonter la veille, ou 5m3s, ou 2010-12-21.
+
<span style="color: red;">'''NOTE :''' pour remonter un répertoire complet, il faut l'indiquer la source comme à la destination '''SANS "/" APRES''', sinon il restaure les fichiers dans le répertoire supérieur sans recréer ou écraser le répertoire (/etc dans l'exemple)</span>
 +
 
 +
'''NOTE :''' le "-r" signifie "restore at", on peut mettre "'''-r now'''", ou mieux: " '''-r "1B"''' " pour remonter la dernière sauvegarde. D'autres solutions sont "1D" (comme pour le backup) pour remonter la veille, ou 5m3s, ou 2010-12-21. <br/>
 +
 
 +
Exemple plus complet :
 +
# rdiff-backup -l /mnt/backup/server1
 +
Found 5 increments:
 +
    increments.'''2013-04-12'''T01:28:44+02:00.dir  Fri Apr 12 01:28:44 2013
 +
    increments.2013-04-13T01:29:00+02:00.dir  Sat Apr 13 01:29:00 2013
 +
    increments.2013-04-15T01:27:16+02:00.dir  Mon Apr 15 01:27:16 2013
 +
    increments.2013-04-16T01:29:06+02:00.dir  Tue Apr 16 01:29:06 2013
 +
    increments.2013-04-17T01:31:23+02:00.dir  Wed Apr 17 01:31:23 2013
 +
Current mirror: Thu Apr 18 01:29:44 2013
 +
 
 +
# rdiff-backup -v5 -r "'''2013-04-12'''" --force /mnt/backup/server1/home/web root@server1.localdomain::/home/web
  
 +
== NOTE : partages CIFS/SMBFS ==
 +
Documentation rdiff-backup :
 +
rdiff-backup fails to run, printing an exception about "assert not upper_a.lstat()" failing. This can be resolved by unmounting the share, running the following command as root:
 +
$ echo 0 > /proc/fs/cifs/LookupCacheEnabled
 +
and then remounting the CIFS share.
 +
Penser à ajouter cette ligne à /etc/rc.local pour qu'elle soit exécutée au démarrage du serveur.
  
-----------------
+
De plus, si Windows est la destination des backups (par un montage samba sur une machine linux par exemple), il faut penser que le système cible '''ne connait pas les ACL unix''' (droits sur les fichiers, propriétaires, etc...). Il faut donc dire à rdiff-backup de ne pas essayer de faire des "chmod" et "chown". Windows ne sait pas non plus interpréter les liens, qu'ils soient hards ou symboliques.
'''<span style="color:red">DEPANNAGE</span>'''<br>
+
 
 +
Lancer rdiff-backup avec les options suivantes (en plus d'éventuelles autres options qui semblent utiles):
 +
--no-hard-links --exclude-symbolic-links --no-acls --no-eas
 +
Dans le fichier de configuration du script rdbackup ci-dessous, le paramètre RDIFF_OPTS serait donc:
 +
RDIFF_OPTS="-v5 --force --create-full-path --exclude-fifos --exclude-sockets --no-hard-links --exclude-symbolic-links --no-acls --no-eas"
 +
 
 +
== '''<span style="color:red">DEPANNAGE</span>''' ==
 
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 !).
 
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 !).
  
-----------------
+
= Rdiff-backup-web =
 +
Installer rdiff-backup-web sur un serveur apache/php/mysql ayant accès aux répertoires de backup.
 +
apt-get install apache2 php5 php-mysql mysql-server
 +
cd /var/www
 +
wget http://sourceforge.net/projects/rdiffbackupweb/files/rdiffbackupweb/0.09/rdiff-backup-web.0.09.tar.gz
 +
tar -xvzf rdiff-backup-web.0.09.tar.gz
 +
Déclarer un virtualhost Apache avec comme DocumentRoot le répertoire rdiff-backup-web ainsi créé.
 +
 
 +
Créer une base mysql (par convention nommée "rdiff"). Créer un utilisateur rdiff ayant tous les droits sur cette base.
 +
mysql -p
 +
mysql> create database rdiff;
 +
mysql> grant all privileges on rdiff.* to rdiff identified by 'mot_de_passe';
 +
mysql> exit
 +
Charger la base
 +
mysql -p rdiff < /var/www/rdiff-backup-web/rdiff.sql
 +
Configurer cette base et l'utilisateur dans /var/www/rdiff-backup-web/config.php, ainsi que l'arborescence de la destination des backups.
 +
 
 +
Se connecter à l'interface dans un navigateur, connexion avec "admin"/"admin" par défaut. Supprimer l'utilisateur "test" inutil et changer tout de suite le mot de passe admin.
 +
 
 +
= rdiffweb =
 +
rdiffWeb est une interface web avec un backend en python pour naviguer et restaurer les backups fait avec rdiff-backup.
 +
<!--
 +
http://www.rdiffweb.org/wiki/index.php?title=Installation <br/>
 +
http://open.nshare.de/wiki/setup/rdiffweb-behind-apache-reverse-proxy
 +
-->
 +
== Installation sur Centos ==
 +
Nouvelle version 0.7 http://www.patrikdufresne.com/en/rdiffweb/
  
== Exemple de script rdbackup.sh ==
+
=== Installer Python 2.7 si nécessaire ===
'''<span style="color:red">TODO</span> : fusionner les scripts v2.1 et v2.2 avec un choix du sens de sauvegarde'''
+
Sur CentOS (6 ou 7), on a que Python 2.6.6. On installe la 7 en alternative.
=== rdbackup.sh v2.1 : Lancé du serveur de backup ===
+
yum --enablerepo=epel install wget gcc zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libffi-devel libxslt libxslt-devel libxml2 libxml2-devel openldap-devel libjpeg-turbo-devel openjpeg-devel libtiff-devel git libpng libXext libz.so.1 xorg-x11-fonts-Type1 curl cabextract
  #!/bin/bash
+
wget http://python.org/ftp/python/2.7.8/Python-2.7.8.tgz
  # Backup Script (RDIFF-BACKUP on SSH)
+
tar -xzf Python-2.7.8.tgz
  # FSo 06/2010
+
cd Python-2.7.8
  # V 2.1
+
./configure --prefix=/usr/local --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
  # from sbackup.sh (RSYNC)
+
make
  # Changelog :
+
make altinstall
  # 2.1 - Added handle for a pre-backup script (if pre-backup script ended with error <> 0, main script stops)
+
'''ATTENTION AU "ALTINSTALL" !'''
  # 2.0 - Moving variables in a .conf file
+
 
  #   Variables :
+
Le temps de l'installation, on passe sur python 2.7
  #SERVERNAME=$1
+
alias python=python2.7
  #SERVERIP=$2
+
python -V
  #SERVERPORT=$3
+
wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | /usr/local/bin/python2.7
  #SERVERUSR=$4
+
pip install babel
  #RETENTION="--remove-older-than $5"
+
 
  #LIST=$6
+
=== Installation de rdiffweb ===
  #EXCLUDE=$7
+
  wget --no-check-certificate -O rdiffweb.tar.gz https://github.com/ikus060/rdiffweb/archive/master.tar.gz
  #PRESCRIPT=$8
+
  tar zxf rdiffweb.tar.gz
  #BCK_DEV=/home
+
cd rdiffweb-master/
  #BCK_DIR=$BCK_DEV/backup/$SERVERNAME
+
  python setup.py build
  #RDIFF_OPTS="-v5 --force"
+
  python setup.py install
 +
On peut revenir à python 2.6 sur la machine pour éviter les problèmes
 +
  unalias python
 +
 
 +
Le script d'init n'est pas adapté à CentOS. Le remplacer par celui-ci, repris de la v0.6:
 +
  #!/bin/sh
 +
  # rdiffWeb, A web interface to rdiff-backup repositories
 +
# Copyright (C) 2012 rdiffWeb contributors
 +
  #
 +
  # This program is free software: you can redistribute it and/or modify
 +
  # it under the terms of the GNU General Public License as published by
 +
  # the Free Software Foundation, either version 3 of the License, or
 +
  # (at your option) any later version.
 +
  #
 +
  # This program is distributed in the hope that it will be useful,
 +
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
 +
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +
  # GNU General Public License for more details.
 +
  #
 +
  # You should have received a copy of the GNU General Public License
 +
  # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
   
 
   
  # Fix variables
+
  # Basic support for the Linux Standard Base Specification 3.1.0
  LOG_FILE=rdiff.log
+
### BEGIN INIT INFO
  STAT_FILE=rdiff.stats
+
# Provides: rdiff_web
  PID_FILE=rdiff.pid
+
# Required-Start: $network $local_fs
 +
  # Required-Stop: $network
 +
# Default-Start: 2 3 5
 +
# Default-Stop: 0 6
 +
  # Description: Manages the rdiffWeb daemon
 +
  ### END INIT INFO
 
   
 
   
  if [ $# -gt 0 ]
+
  DAEMON=/usr/local/bin/rdiffweb
  then
+
  PIDFILE="/var/run/rdiffweb"
  # let use the given full path .conf file
+
  LOGFILE="/var/log/rdiffweb.log"
    . $1
+
  else
+
SUCCESS_MSG="^[[71G done"
  # default .conf file must be placed in the same directory than .sh
+
ERROR_MSG="^[[71Gfailed"
    . $(dirname $0)/rdbackup.conf
+
   
 +
  if [ -f /etc/init.d/functions ]; then
 +
  . /etc/init.d/functions
 
  fi
 
  fi
 
   
 
   
  while read line
+
  # This script won't be able to run without root privileges.
  do
+
  if [ `id -u` -ne 0 ]; then
     REMOTE_DIR="$REMOTE_DIR $line"
+
     echo "Error: this script must be run as root."
     shift
+
     exit 1
  done < $LIST
+
  fi
 
   
 
   
  if [ ! -e $BCK_DIR/$PID_FILE ]
+
  # See how we were called.
  then
+
  case "$1" in
  # Script pre-backup
+
    start)
    if [ -f $PRESCRIPT ]
+
      if [ ! -f /etc/rdiffweb/rdw.conf ]; then
    then
+
          echo -n "rdiffWeb is not configured!  Please run 'rdiff-web-config'."
      $PRESCRIPT
+
          echo $ERROR_MSG
      if [ $? -ne 0 ]
 
      then
 
 
           exit 1
 
           exit 1
 
       fi
 
       fi
     fi
+
      echo -n "Starting rdiffWeb..."
 +
      $DAEMON --pid-file="$PIDFILE" \
 +
      --log-file="$LOGFILE" \
 +
      --background > /dev/null 2>&1
 +
      echo $SUCCESS_MSG
 +
      exit 0
 +
     ;;
 
   
 
   
     echo $$ > $BCK_DIR/$PID_FILE
+
     stop)
    /usr/bin/logger "Sauvegarde rdiff $SERVERNAME"
+
      if [ -e "$PIDFILE" ]; then
    if [ -e $BCK_DIR/$LOG_FILE ]
+
          echo -n "Stopping rdiffWeb..."
    then
+
          kill `cat "$PIDFILE" 2>/dev/null` > /dev/null 2>&1
        mv $BCK_DIR/$LOG_FILE $BCK_DIR/$LOG_FILE.0
+
          rm $PIDFILE > /dev/null 2>&1
    fi
+
          echo $SUCCESS_MSG
    if [ -e  $BCK_DIR/$STAT_FILE ]
+
          exit 0
    then
+
      else
        mv $BCK_DIR/$STAT_FILE $BCK_DIR/$STAT_FILE.0
+
          echo -n "rdiffWeb is not running"
    fi
+
          echo $ERROR_MSG
    echo "Sauvegarde rdiff $SERVERNAME" > $BCK_DIR/$LOG_FILE
+
           exit 1
    #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
 
       fi
 +
    ;;
 
   
 
   
      if [ ! "x$EXCLUDE" == "x" ]
+
    status)
      then
+
       echo -n "rdiffWeb "
          EXCLUDE_OPT=""
+
       if [ -e "$PIDFILE" ]; then
          while read line
+
           echo "is running."
          do
+
           exit 0
            if  <nowiki>[[ $line =~ ^$rdir ]]</nowiki>
 
            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
 
 
       else
 
       else
           echo CLEANING BACKUPS OF $rdir >> $BCK_DIR/$LOG_FILE
+
           echo "is not running."
          echo rdiff-backup $RDIFF_OPTS $RETENTION ${BCK_DIR}${rdir} >> $BCK_DIR/$LOG_FILE 2>&1
+
          exit 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
 
       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 $SERVERNAME $(date +%d/%m) terminee" $MAIL_ADMIN
 
    fi
 
    date >> $BCK_DIR/$LOG_FILE
 
    /usr/bin/logger "FIN rdiff $SERVERNAME"
 
    rm -f $BCK_DIR/$PID_FILE
 
else
 
    (echo "$HOSTNAME:$BCK_DIR/$PID_FILE existe : abandon de $0") | mail -s "Erreur sur backup $SERVERNAME" $MAIL_ADMIN
 
fi
 
 
 
-------------
 
==== Fichier rdbackup.conf v2.1 ====
 
# Configuration rdbackup
 
SERVERNAME=server.example.net
 
SERVERIP=192.168.1.10
 
SERVERPORT=22
 
SERVERUSR=root
 
MAIL_ADMIN='''<Mail Admin>'''
 
RETENTION="--remove-older-than 1W"
 
LIST=/opt/systools/backup/server.list
 
EXCLUDE=/opt/systools/backup/server.excl
 
PRESCRIPT=
 
# ou : PRESCRIPT=./server_pre_backup.sh
 
BCK_DIR=/home/backup/$SERVERNAME
 
RDIFF_OPTS="-v5 --force"
 
 
 
=== rdbackup2.2.sh : lancé '''du serveur A SAUVEGARDER''' vers le serveur de backup ===
 
Comme on est sur le serveur de prod, le script inclut aussi un dump MySQL avant de lancer rdiff-backup<br>
 
Le dump peut-être désactivé s'il n'est pas utile.
 
#!/bin/bash
 
# Backup Script (RDIFF-BACKUP over SSH and RSYNC)
 
# FSo 06/2010
 
# V 2.2
 
# from sbackup.sh (RSYNC)
 
# Changelog :
 
# 2.2 - Reverse backup from client to backup server
 
# 2.1 - Added handle for a pre-backup script (if pre-backup script ended with error <> 0, main script stops)
 
# 2.0 - Moving variables in a .conf file
 
 
   
 
   
# Fix variables
+
    restart)
APPLICATION_DIR=</home/sites/application>
+
      "$0" stop && "$0" start
LOG_FILE=rdiff.log
+
    ;;
STAT_FILE=rdiff.stats
 
PID_FILE=rdiff.pid
 
MYDB=<mysql_db_name>
 
 
   
 
   
if [ $# -gt 0 ]
+
    *)
then
+
      echo "Usage: `basename "$0"` {start|stop|status|restart}"
# let use the given full path .conf file
+
      exit 1
    . $1
+
  esac
  else
 
# Application specific
 
    . $APPLICATION_DIR/rdbackup.conf
 
fi
 
 
   
 
   
  while read line
+
  exit 0
do
+
 
    REMOTE_DIR="$REMOTE_DIR $line"
+
Il ne reste plus qu'à :
    shift
+
  service rdiffweb start
  done < $LIST
+
 
+
<!-- Pour archive: ancienne version avant reprise par http://www.patrikdufresne.com
if [ ! -e $APPLICATION_DIR/$PID_FILE ]
+
Ajouter le dépôt rpmforge
  then
+
 
  # Script pre-backup
+
Installer les dépendances:
    if [ -f $PRESCRIPT ]
+
  yum install sqlite-devel
    then
+
yum install --enablerepo=rpmforge python-cherrypy
      $PRESCRIPT
+
 
      if [ $? -ne 0 ]
+
* Installer le rpm :
      then
+
yum install http://www.rdiffweb.org/releases/rdiffWeb-0.6.3-1.noarch.rpm
          exit 1
+
wget http://www.rdiffweb.org/releases/rdiffWeb-0.6.3-1.noarch.rpm
      fi
+
rpm --nodeps -ivh rdiffWeb-0.6.3-1.noarch.rpm
    fi
+
* Installer le rpm source :
    if [ $MYSQLDUMP -eq 1 ]
+
wget http://www.rdiffweb.org/releases/rdiffWeb-0.6.3-1.src.rpm
    then
+
yum install rpmdevtools yum-utils
      mysqldump $MYDB $MYSQLDUMP_OPTS --password=$MYSQL_PASSWORD > $APPLICATION_DIR/mysqldump.sql
+
rpmbuild --rebuild rdiffWeb-0.6.3-1.src.rpm
    fi
+
  yum install /root/rpmbuild/RPMS/noarch/rdiffWeb-0.6.3-1.noarch.rpm
    echo $$ > $APPLICATION_DIR/$PID_FILE
+
 
    /usr/bin/logger "Sauvegarde rdiff $SERVERNAME"
+
lancer cette commande permet de configurer rdiff-web :
    if [ -e $APPLICATION_DIR/$LOG_FILE ]
+
  rdiff-web-config
    then
+
 
        mv $APPLICATION_DIR/$LOG_FILE $APPLICATION_DIR/$LOG_FILE.0
+
Éditer le fichier de configuration :
    fi
+
vim /etc/rdiffweb/rdw.conf
    if [ -e $APPLICATION_DIR/$STAT_FILE ]
+
 
    then
+
Ajouter ceci
        mv $APPLICATION_DIR/$STAT_FILE $APPLICATION_DIR/$STAT_FILE.0
+
ServerName=localhost
    fi
+
ServerPort=8080
    echo "Sauvegarde rdiff $SERVERNAME" > $APPLICATION_DIR/$LOG_FILE
+
'''ServerHost=0.0.0.0'''
    #Boucle de backup
+
 
    ERROR_FLAG=0
+
Mettre 0.0.0.0 permet d’accéder à l'interface web depuis un autre ordinateur sur le port 8080. Le port peut également être modifié.
    ERROR=0
+
ATTENTION : La configuration automatique de rdw.conf met 'ServerName'. Il faut le remplacer par 'ServerHost'.
    ERRORS="ERREURS: "
+
 
    for rdir in $(echo $REMOTE_DIR)
+
Problème de lancement de rdiffweb :
    do
+
cherrypy.engine.on_stop_engine_list.append(lambda: killEvent.set())
      if [ ! "x$EXCLUDE" == "x" ]
+
AttributeError: 'Bus' object has no attribute 'on_stop_engine_list'
      then
+
 
          EXCLUDE_OPT=""
+
Il faut lancer rdiff-web avec l'option -d : rdiffweb -d .
          while read line
+
 
          do
+
L'option "-d" peut aussi manquer dans le script de démarrage. Éditer /etc/init.d/rdiff-web et modifier la ligne :
            if  <nowiki>[[ $line =~ ^$rdir ]]</nowiki>
+
/usr/bin/rdiff-web --pid-file="$PIDFILE" \
            then
+
par
                EXCLUDE_OPT="$EXCLUDE_OPT --exclude $line"
+
/usr/bin/rdiff-web '''-d''' --pid-file="$PIDFILE" \
            fi
+
 
            shift
+
 
          done < $EXCLUDE
+
== Installation sur CentOS 7 ==
      fi
+
 
      # rdiff
+
Installer le dépôt
      date >> $APPLICATION_DIR/$LOG_FILE
+
  rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
      echo >> $APPLICATION_DIR/$LOG_FILE
+
 
      echo RDIFF-BACKUP OF $rdir >> $APPLICATION_DIR/$LOG_FILE
+
Installer yum-utils et désactiver le dépôt par défaut
      echo rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT ${rdir} $SERVERUSR@$SERVERIP::${BCK_DIR}$rdir >> $APPLICATION_DIR/$LOG_FILE
+
  yum install yum-utils
      rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT ${rdir} $SERVERUSR@$SERVERIP::${BCK_DIR}$rdir >>  $APPLICATION_DIR/$LOG_FILE 2>&1
+
  yum-config-manager --disable epel
      ERROR=$?
+
 
      if [ $ERROR -ne 0 ]
+
Installer les paquets avec l'option --enablerepo=epel
      then
+
  yum --enablerepo=epel -y install rdiff-backup -->
          ERRORS="$ERRORS $BASE=$ERROR:"
 
          ERROR_FLAG=1
 
      else
 
          echo CLEANING BACKUPS OF $rdir >> $APPLICATION_DIR/$LOG_FILE
 
          echo rdiff-backup $RDIFF_OPTS $RETENTION $SERVERUSR@$SERVERIP::${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
 
          rdiff-backup $RDIFF_OPTS $RETENTION $SERVERUSR@$SERVERIP::${BCK_DIR}${rdir} >> $APPLICATION_DIR/$LOG_FILE 2>&1
 
          ERROR=$?
 
          if [ $ERROR -ne 0 ]
 
          then
 
            ERRORS="$ERRORS $BASE=$ERROR:"
 
            ERROR_FLAG=1
 
          fi
 
      fi
 
    done
 
    if [ $ERROR_FLAG -eq 1 ]
 
    then
 
      (echo $ERRORS
 
        date
 
        echo Voir $APPLICATION_DIR/$LOG_FILE
 
        grep -i warning $APPLICATION_DIR/$LOG_FILE
 
        grep -i error $APPLICATION_DIR/$LOG_FILE
 
      )| mail -s "ERREUR RDIFF SUR $SERVERNAME $(date +%d/%m)" $MAIL_ADMIN
 
    else
 
      (date
 
        ls -l $APPLICATION_DIR/$LOG_FILE
 
        df -k $APPLICATION_DIR
 
      )| mail -s "Sauvegarde $SERVERNAME $(date +%d/%m) terminee" $MAIL_ADMIN
 
    fi
 
    date >> $APPLICATION_DIR/$LOG_FILE
 
    /usr/bin/logger "FIN rdiff $SERVERNAME"
 
    rm -f $APPLICATION_DIR/$PID_FILE
 
else
 
    (echo "$HOSTNAME:$APPLICATION_DIR/$PID_FILE existe : abandon de $0") | mail -s "Erreur sur backup $SERVERNAME" $MAIL_ADMIN
 
fi
 
  
-----------------------
+
== Installation sur Debian ==
==== Fichier rdbackup.conf v2.2====
 
# Configuration rdbackup
 
SERVERNAME=$(hostname)
 
# IP DU SERVEUR DE SAUVEGARDE
 
SERVERIP=192.168.1.10
 
SERVERPORT=22
 
SERVERUSR=root
 
MAIL_ADMIN='''<Mail de l'admin>'''
 
RETENTION="--remove-older-than 1W"
 
LIST=$EPHOTO_DIR/rdbackup.list
 
EXCLUDE=$EPHOTO_DIR/rdbackup.excl
 
PRESCRIPT=
 
# REPERTOIRE DE DESTINATION
 
BCK_DIR=/home/backup
 
RDIFF_OPTS="-v5 --force"
 
# Passer MYSQLDUMP à 0 pour désactiver le dump MySQL
 
MYSQLDUMP=1
 
MYSQLDUMP_OPTS="--routines"
 
MYSQL_PASSWORD='''<Mot de passe MySQL>'''
 
  
 +
exécuter le script se trouvant sur le dépôt git :
 +
https://indefero.systea.fr/p/rdiffweb/source/file/master/rdiffweb-install-debian.sh
 +
Le script original se trouve sur http://www.timedicer.co.uk/programs/help/rdiffweb-install.sh.php . le script précédant est allégé par rapport à celui-ci.
  
-------------------------------
+
= Script bash =
 +
== script rdbackup.sh ==
 +
Un dépot git contenant les sources est disponible ici : https://indefero.systea.fr/p/rdbackup/source/tree/master/
  
=== ''Pour mémoire, script v1 sans rdbackup.conf'' ===
+
Pour récupérer directement la derniere version disponible avec wget :  
#!/bin/bash
+
  wget --content-disposition --no-check-certificate https://indefero.systea.fr/p/rdbackup/source/download/master/
# 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 <nowiki>[[ $line =~ ^$rdir ]]</nowiki>
 
            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)" mail_admin@example.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" mail_admin@example.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" mail_admin@example.net
 
fi
 
  
 
= Windows =
 
= Windows =
 +
Ici, on sauvegarde un serveur (ou poste) Windows à partir d'un serveur linux qui lance rdiff-backup. A adapter si on veut le contraire.
 +
== Cygwin ==
 +
On installe d'abord Cygwin sur Windows (la version .exe de rdiff semble plutôt bugguée), dans lequel on installera un serveur OpenSSH et rdiff-backup.
 +
 +
Naviguer sur http://www.cygwin.com/ pour charger le setup*.exe correspondant à la version de Windows.
 +
 +
Lancer le setup, et pendant l'installation ajouter les paquets :
 +
Devel/
 +
autoconf
 +
automake
 +
binutils
 +
gcc-g++
 +
make
 +
patchutils
 +
Interpreters/
 +
python
 +
Net/
 +
openssh
 +
Web/
 +
wget
 +
Lancer une console cygwin
 +
 +
== Librsync dans Cygwin ==
 +
Dans la console, installer librsync
 +
wget http://sourceforge.net/projects/librsync/files/latest/download?source=files -O librsync-0.9.7.tar.gz
 +
tar xzf librsync-0.9.7.tar.gz
 +
cd librsync-0.9.7
 +
./configure --prefix=/usr --bindir=/bin --libdir=/lib
 +
En cas de message "unable to guess system type", repérer la version d'automake et récupérer un config.guess à jour :
 +
automake --version
 +
    .... 1.14.1 ....
 +
cp  /usr/share/automake-1.14/config.guess .
 +
relancer ./configure. Puis :
 +
make all
 +
make install
 +
cd ..
 +
== Rdiff-backup dans Cygwin ==
 +
Télécharger le source et installer rdiff-backup
 +
wget http://savannah.nongnu.org/download/rdiff-backup/rdiff-backup-1.2.8.tar.gz
 +
tar -xzf rdiff-backup-1.2.8.tar.gz
 +
cd rdiff-backup-1.2.8
 +
python setup.py install
 +
 +
== Configurer openSSH ==
 +
ssh-host-config
 +
Répondre "yes" à tout jusqu'à "value of CYGWIN for the daemon" auquel on répond "ntsec", puis "no" pour garder le nom de compte service par défaut, et "yes" pour le créer, tout le reste est par défaut.
 +
 +
Démarrer le service CYGWIN sshd, par la MMC ou par :
 +
"net start sshd"
 +
Créer un répertoire ".ssh". Sur le serveur linux de sauvegarde, générer si nécessaire les clé SSH, et copier la clé public dans ".ssh/authorized_keys" dans la console Cygwin.
 +
 +
Ouvrir l'accès au port 22 (SSH), sur les firewalls, routeurs, box, etc... entre le Windows et internet, et dans le firewall Windows lui-même. A partir du serveur linux, tester une connexion ssh vers le Windows, qui ne doit pas demander de mot de passe.
 +
 +
== Exemple de backup, à partir du serveur linux, qui lit les données distante du poste Windows ==
 +
rdiff-backup -v5 --force --create-full-path --print-statistics --no-hard-links --include "/cygdrive/c/Données utilisateurs" --include "/cygdrive/d/Logiciels" --include "/cygdrive/d/Work" --exclude /cygdrive/** --remote-schema "ssh -p 22 %s rdiff-backup --server" Administrateur@serveurWindows.no-ip.org::/cygdrive/ /backup/serveurWindows
 +
On aura à l'arrivée /backup/serveurWindows/c/Données utilisateurs, /backup/serveurWindows/d/Logiciels et/backup/serveurWindows/d/Work.
 +
 +
L'exclusion "/cygdrive/**" a la même fonction que "**" entre serveurs linux.
 +
 +
<!-- Pour archive : installation à partir de l'EXE
 
== Installation ==
 
== Installation ==
 
Télécharger :
 
Télécharger :
Ligne 554 : Ligne 446 :
 
  IF NOT "%ERROR%"=="0" (
 
  IF NOT "%ERROR%"=="0" (
 
     c:\backup\blat\full\blat c:\backup\backup.log -to ''destinataire@systea.net'' %MAILOPTS% -s "Probleme sauvegarde" > c:\backup\blat.log 2>&1 )
 
     c:\backup\blat\full\blat c:\backup\backup.log -to ''destinataire@systea.net'' %MAILOPTS% -s "Probleme sauvegarde" > c:\backup\blat.log 2>&1 )
 +
-->

Version actuelle datée du 10 avril 2019 à 15:08

Linux

Installation

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, si ça n'a pas déjà été fait (pour munin par exemple), installation repos RPMForge (-> Dépôts complémentaires).

Puis

yum --enablerepo=rpmforge install rdiff-backup

Echanger les clés DSA entre les serveurs

Afin que la connexion de Rdiff-backup via SSH ne demande pas de mot de passe, la clé ~/.ssh/id_dsa.pub de l'utilisateur qui se connecte à partir du "client" rdiff-backup doit être copiée "en une seule ligne" dans ~/.ssh/authorized_keys de l'utilisateur cible sur le serveur à sauvegarder. (se reporter à une procédure d'échange de clés pour SSH)


Test d'accès à un serveur

rdiff-backup --test-server root@192.168.1.21::/home

Sauvegardes

à 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".

Eventuellement, si on veut sauvegarder plusieurs répertoires de la même machine, on sauvegarde avec des inclusions :

rdiff-backup --force -v5 --include /etc --include /home --exclude "**" root@192.168.1.2::/ /backup/ > rdiff_server1.log 2>&1

On aura alors à l'arrivée /backup/etc et /backup/home, et un seul répertoire de metadonnées rdiff-backup-datas pour les 2. Le --exclude "**" est là pour éviter que rdiff n'essaie de sauvegarder toute l'arborescence (le "/" qu'on lui donne après les ::) et ne s'occupe que des "--include".



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.

Informations sur les sauvegardes

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

On peut lister aussi les tailles des différents incréments

rdiff-backup --list-increment-sizes /home/backup/server1/home/

Restore - Exemples

NOTE : le restore NE FONCTIONNE PAS SUR LES LIENS. Il faut indiquer le "vrai" répertoire ou fichier physique à restorer.

NOTE 2 : VERIFIER LES DROITS DES REPERTOIRES APRES UNE RESTAURATION, ils peuvent avoir changé.

Restore par fichier diff

[EDIT 03/2019] Autre façon de restaurer, plus simple si on rencontre des problèmes de caractères spéciaux dans les noms qui empêchent la restauration par "-r" Repérer le fichier différentiel du fichier à restaurer pour la date voulue. Ex :

ls /repertoire_de_backup/rdiff-backup-data/increments/chemin_complet/fichier.tld.2019-03-22T02\:55\:35+01\:00.diff.gz

Restaurer simplement par (exemple vers /tmp local) :

rdiff-backup /repertoire_de_backup/rdiff-backup-data/increments/chemin_complet/fichier.tld.2019-03-22T02\:55\:35+01\:00.diff.gz /tmp/fichier.tld

Restore par "-r"

# fichier /etc/hosts d'il y a 1 heure (--force si le fichier ou répertoire existe et qu'il faut l'écraser)
rdiff-backup -v5 -r "1h" --force ./etc/hosts root@192.168.1.2::/etc/hosts

NOTE : le nom du fichier doit être indiqué à la source COMME A LA DESTINATION, sinon rdiff remonte TOUT LE REPERTOIRE (/etc dans l'exemple) !

# répertoire /etc d'il y a 3 jours
rdiff-backup -v5 -r "3D" --force ./etc root@192.168.1.2::/etc

NOTE : pour remonter un répertoire complet, il faut l'indiquer la source comme à la destination SANS "/" APRES, sinon il restaure les fichiers dans le répertoire supérieur sans recréer ou écraser le répertoire (/etc dans l'exemple)

NOTE : le "-r" signifie "restore at", on peut mettre "-r now", ou mieux: " -r "1B" " pour remonter la dernière sauvegarde. D'autres solutions sont "1D" (comme pour le backup) pour remonter la veille, ou 5m3s, ou 2010-12-21.

Exemple plus complet :

# rdiff-backup -l /mnt/backup/server1
Found 5 increments:
   increments.2013-04-12T01:28:44+02:00.dir   Fri Apr 12 01:28:44 2013
   increments.2013-04-13T01:29:00+02:00.dir   Sat Apr 13 01:29:00 2013
   increments.2013-04-15T01:27:16+02:00.dir   Mon Apr 15 01:27:16 2013
   increments.2013-04-16T01:29:06+02:00.dir   Tue Apr 16 01:29:06 2013
   increments.2013-04-17T01:31:23+02:00.dir   Wed Apr 17 01:31:23 2013
Current mirror: Thu Apr 18 01:29:44 2013
# rdiff-backup -v5 -r "2013-04-12" --force /mnt/backup/server1/home/web root@server1.localdomain::/home/web

NOTE : partages CIFS/SMBFS

Documentation rdiff-backup :

rdiff-backup fails to run, printing an exception about "assert not upper_a.lstat()" failing. This can be resolved by unmounting the share, running the following command as root:
$ echo 0 > /proc/fs/cifs/LookupCacheEnabled
and then remounting the CIFS share.

Penser à ajouter cette ligne à /etc/rc.local pour qu'elle soit exécutée au démarrage du serveur.

De plus, si Windows est la destination des backups (par un montage samba sur une machine linux par exemple), il faut penser que le système cible ne connait pas les ACL unix (droits sur les fichiers, propriétaires, etc...). Il faut donc dire à rdiff-backup de ne pas essayer de faire des "chmod" et "chown". Windows ne sait pas non plus interpréter les liens, qu'ils soient hards ou symboliques.

Lancer rdiff-backup avec les options suivantes (en plus d'éventuelles autres options qui semblent utiles):

--no-hard-links --exclude-symbolic-links --no-acls --no-eas

Dans le fichier de configuration du script rdbackup ci-dessous, le paramètre RDIFF_OPTS serait donc:

RDIFF_OPTS="-v5 --force --create-full-path --exclude-fifos --exclude-sockets --no-hard-links --exclude-symbolic-links --no-acls --no-eas"

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 !).

Rdiff-backup-web

Installer rdiff-backup-web sur un serveur apache/php/mysql ayant accès aux répertoires de backup.

apt-get install apache2 php5 php-mysql mysql-server
cd /var/www
wget http://sourceforge.net/projects/rdiffbackupweb/files/rdiffbackupweb/0.09/rdiff-backup-web.0.09.tar.gz
tar -xvzf rdiff-backup-web.0.09.tar.gz

Déclarer un virtualhost Apache avec comme DocumentRoot le répertoire rdiff-backup-web ainsi créé.

Créer une base mysql (par convention nommée "rdiff"). Créer un utilisateur rdiff ayant tous les droits sur cette base.

mysql -p
mysql> create database rdiff;
mysql> grant all privileges on rdiff.* to rdiff identified by 'mot_de_passe';
mysql> exit

Charger la base

mysql -p rdiff < /var/www/rdiff-backup-web/rdiff.sql

Configurer cette base et l'utilisateur dans /var/www/rdiff-backup-web/config.php, ainsi que l'arborescence de la destination des backups.

Se connecter à l'interface dans un navigateur, connexion avec "admin"/"admin" par défaut. Supprimer l'utilisateur "test" inutil et changer tout de suite le mot de passe admin.

rdiffweb

rdiffWeb est une interface web avec un backend en python pour naviguer et restaurer les backups fait avec rdiff-backup.

Installation sur Centos

Nouvelle version 0.7 http://www.patrikdufresne.com/en/rdiffweb/

Installer Python 2.7 si nécessaire

Sur CentOS (6 ou 7), on a que Python 2.6.6. On installe la 7 en alternative.

yum --enablerepo=epel install wget gcc zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libffi-devel libxslt libxslt-devel libxml2 libxml2-devel openldap-devel libjpeg-turbo-devel openjpeg-devel libtiff-devel git libpng libXext libz.so.1 xorg-x11-fonts-Type1 curl cabextract
wget http://python.org/ftp/python/2.7.8/Python-2.7.8.tgz
tar -xzf Python-2.7.8.tgz
cd Python-2.7.8
./configure --prefix=/usr/local --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
make
make altinstall

ATTENTION AU "ALTINSTALL" !

Le temps de l'installation, on passe sur python 2.7

alias python=python2.7
python -V
wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | /usr/local/bin/python2.7
pip install babel

Installation de rdiffweb

wget --no-check-certificate -O rdiffweb.tar.gz https://github.com/ikus060/rdiffweb/archive/master.tar.gz
tar zxf rdiffweb.tar.gz
cd rdiffweb-master/
python setup.py build
python setup.py install

On peut revenir à python 2.6 sur la machine pour éviter les problèmes

unalias python

Le script d'init n'est pas adapté à CentOS. Le remplacer par celui-ci, repris de la v0.6:

#!/bin/sh
# rdiffWeb, A web interface to rdiff-backup repositories
# Copyright (C) 2012 rdiffWeb contributors
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Basic support for the Linux Standard Base Specification 3.1.0
### BEGIN INIT INFO
# Provides: rdiff_web
# Required-Start: $network $local_fs
# Required-Stop: $network
# Default-Start: 2 3 5
# Default-Stop: 0 6
# Description: Manages the rdiffWeb daemon
### END INIT INFO

DAEMON=/usr/local/bin/rdiffweb
PIDFILE="/var/run/rdiffweb"
LOGFILE="/var/log/rdiffweb.log"

SUCCESS_MSG="^[[71G done"
ERROR_MSG="^[[71Gfailed"

if [ -f /etc/init.d/functions ]; then
 . /etc/init.d/functions
fi

# This script won't be able to run without root privileges.
if [ `id -u` -ne 0 ]; then
   echo "Error: this script must be run as root."
   exit 1
fi

# See how we were called.
case "$1" in
   start)
      if [ ! -f /etc/rdiffweb/rdw.conf ]; then
         echo -n "rdiffWeb is not configured!  Please run 'rdiff-web-config'."
         echo $ERROR_MSG
         exit 1
      fi
      echo -n "Starting rdiffWeb..."
      $DAEMON --pid-file="$PIDFILE" \
      --log-file="$LOGFILE" \
      --background > /dev/null 2>&1
      echo $SUCCESS_MSG
      exit 0
   ;;

   stop)
      if [ -e "$PIDFILE" ]; then
         echo -n "Stopping rdiffWeb..."
         kill `cat "$PIDFILE" 2>/dev/null` > /dev/null 2>&1
         rm $PIDFILE > /dev/null 2>&1
         echo $SUCCESS_MSG
         exit 0
      else
         echo -n "rdiffWeb is not running"
         echo $ERROR_MSG
         exit 1
      fi
   ;;

   status)
      echo -n "rdiffWeb "
      if [ -e "$PIDFILE" ]; then
         echo "is running."
         exit 0
      else
         echo "is not running."
         exit 1
      fi
   ;;

   restart)
      "$0" stop && "$0" start
   ;;

   *)
      echo "Usage: `basename "$0"` {start|stop|status|restart}"
      exit 1
esac

exit 0

Il ne reste plus qu'à :

service rdiffweb start


Installation sur Debian

exécuter le script se trouvant sur le dépôt git :

https://indefero.systea.fr/p/rdiffweb/source/file/master/rdiffweb-install-debian.sh

Le script original se trouve sur http://www.timedicer.co.uk/programs/help/rdiffweb-install.sh.php . le script précédant est allégé par rapport à celui-ci.

Script bash

script rdbackup.sh

Un dépot git contenant les sources est disponible ici : https://indefero.systea.fr/p/rdbackup/source/tree/master/

Pour récupérer directement la derniere version disponible avec wget :

wget --content-disposition --no-check-certificate https://indefero.systea.fr/p/rdbackup/source/download/master/

Windows

Ici, on sauvegarde un serveur (ou poste) Windows à partir d'un serveur linux qui lance rdiff-backup. A adapter si on veut le contraire.

Cygwin

On installe d'abord Cygwin sur Windows (la version .exe de rdiff semble plutôt bugguée), dans lequel on installera un serveur OpenSSH et rdiff-backup.

Naviguer sur http://www.cygwin.com/ pour charger le setup*.exe correspondant à la version de Windows.

Lancer le setup, et pendant l'installation ajouter les paquets :

Devel/
autoconf
automake
binutils
gcc-g++
make
patchutils
Interpreters/
python
Net/
openssh
Web/
wget

Lancer une console cygwin

Librsync dans Cygwin

Dans la console, installer librsync

wget http://sourceforge.net/projects/librsync/files/latest/download?source=files -O librsync-0.9.7.tar.gz
tar xzf librsync-0.9.7.tar.gz
cd librsync-0.9.7
./configure --prefix=/usr --bindir=/bin --libdir=/lib

En cas de message "unable to guess system type", repérer la version d'automake et récupérer un config.guess à jour :

automake --version
   .... 1.14.1 ....
cp  /usr/share/automake-1.14/config.guess .

relancer ./configure. Puis :

make all
make install
cd ..

Rdiff-backup dans Cygwin

Télécharger le source et installer rdiff-backup

wget http://savannah.nongnu.org/download/rdiff-backup/rdiff-backup-1.2.8.tar.gz
tar -xzf rdiff-backup-1.2.8.tar.gz
cd rdiff-backup-1.2.8
python setup.py install

Configurer openSSH

ssh-host-config

Répondre "yes" à tout jusqu'à "value of CYGWIN for the daemon" auquel on répond "ntsec", puis "no" pour garder le nom de compte service par défaut, et "yes" pour le créer, tout le reste est par défaut.

Démarrer le service CYGWIN sshd, par la MMC ou par :

"net start sshd"

Créer un répertoire ".ssh". Sur le serveur linux de sauvegarde, générer si nécessaire les clé SSH, et copier la clé public dans ".ssh/authorized_keys" dans la console Cygwin.

Ouvrir l'accès au port 22 (SSH), sur les firewalls, routeurs, box, etc... entre le Windows et internet, et dans le firewall Windows lui-même. A partir du serveur linux, tester une connexion ssh vers le Windows, qui ne doit pas demander de mot de passe.

Exemple de backup, à partir du serveur linux, qui lit les données distante du poste Windows

rdiff-backup -v5 --force --create-full-path --print-statistics --no-hard-links --include "/cygdrive/c/Données utilisateurs" --include "/cygdrive/d/Logiciels" --include "/cygdrive/d/Work" --exclude /cygdrive/** --remote-schema "ssh -p 22 %s rdiff-backup --server" Administrateur@serveurWindows.no-ip.org::/cygdrive/ /backup/serveurWindows

On aura à l'arrivée /backup/serveurWindows/c/Données utilisateurs, /backup/serveurWindows/d/Logiciels et/backup/serveurWindows/d/Work.

L'exclusion "/cygdrive/**" a la même fonction que "**" entre serveurs linux.