Rdiff-backup : Différence entre versions
De wikiGite
Ligne 1 : | Ligne 1 : | ||
− | == TODO : Fusionner v2.1 et v2.2 == | + | == TODO : Fusionner v2.1 et v2.2 (avec conf) == |
= Linux = | = Linux = | ||
Ligne 22 : | Ligne 22 : | ||
vi /etc/yum.repos.d/rpmforge.repo # --> mettre enabled à 0 | vi /etc/yum.repos.d/rpmforge.repo # --> mettre enabled à 0 | ||
yum --enablerepo=rpmforge install rdiff-backup | 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" doit être copiée "en une seule ligne" dans ~/.ssh/authorized_keys de l'utilisateur cible sur le serveur. | ||
------------------ | ------------------ | ||
Ligne 490 : | Ligne 494 : | ||
= Windows = | = Windows = | ||
+ | == Installation == | ||
+ | Télécharger : | ||
+ | # Rdiff (rdiff-backup-1.2.8-win32.zip) | ||
+ | http://www.nongnu.org/rdiff-backup/ | ||
+ | # putty, plink et puttygen | ||
+ | http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html | ||
+ | # Blat (blat262.full.sip) | ||
+ | http://sourceforge.net/projects/blat/files/ | ||
+ | |||
+ | == Préparation de la connexion SSH == | ||
+ | ''Note : on considère ici que la sauvegarde est lancée d'un poste Windows vers un serveur linux'' | ||
+ | |||
+ | Lancer puttygen. Sélections "SSH-2 DSA" en bas, cliquer sur "Generate" et bouger la souris dans l'espace blanc au milieu de la fenêtre. | ||
+ | |||
+ | '''Copier''' la clé DSA qui s'affiche en haut de la fenêtre (sans oublier aucun caractère !), la passer telle quelle vers le serveur linux (via un fichier par scp/ftp, ou mail, ou copier/coller dans une console putty) dans le fichier ~/.ssh/authorized_keys du serveur. | ||
+ | |||
+ | Sauvegarder les clés dans le répertoire Documents and Setting (Win XP/2003) ou Users (Win 7/2008) de l'utilisateur qui lancera rdiff-backup. | ||
+ | # Clé publique : | ||
+ | en cliquant sur "save public key" | ||
+ | nommer le fichier privatekey.pub | ||
+ | |||
+ | # Clé privée : | ||
+ | en cliquant sur "save private key" | ||
+ | nommer le fichier privatekey.ppk |
Version du 28 octobre 2010 à 13:14
Sommaire
TODO : Fusionner v2.1 et v2.2 (avec conf)
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, installation repos RPMForge (http://wiki.centos.org/AdditionalResources/Repositories/RPMForge).
CentOS4 :
wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el4.rf.i386.rpm
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
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" doit être copiée "en une seule ligne" dans ~/.ssh/authorized_keys de l'utilisateur cible sur le serveur.
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".
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
NOTE : le "-r" est obligatoire, on peut mettre "-r now" pour remonter la version la plus récente
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
rdbackup.sh v2.1 : Lancé du serveur de backup
#!/bin/bash # Backup Script (RDIFF-BACKUP on SSH) # FSo 06/2010 # V 2.1 # from sbackup.sh (RSYNC) # Changelog : # 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 # 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" # Fix variables LOG_FILE=rdiff_ephoto.log STAT_FILE=rdiff_ephoto.stats PID_FILE=rdiff_ephoto.pid if [ $# -gt 0 ] then # let use the given full path .conf file . $1 else # default .conf file must be placed in the same directory than .sh . $(dirname $0)/rdbackup.conf fi 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 --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 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 $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
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 EPHOTO_DIR=/home/.sites/28/site1 LOG_FILE=rdiff_ephoto.log STAT_FILE=rdiff_ephoto.stats PID_FILE=rdiff_ephoto.pid if [ $# -gt 0 ] then # let use the given full path .conf file . $1 else # ePhoto specific . $EPHOTO_DIR/rdbackup.conf fi while read line do REMOTE_DIR="$REMOTE_DIR $line" shift done < $LIST if [ ! -e $EPHOTO_DIR/$PID_FILE ] then # Script pre-backup if [ -f $PRESCRIPT ] then $PRESCRIPT if [ $? -ne 0 ] then exit 1 fi fi if [ $MYSQLDUMP -eq 1 ] then mysqldump ephoto $MYSQLDUMP_OPTS --password=$MYSQL_PASSWORD > $EPHOTO_DIR/mysqldump.sql fi echo $$ > $EPHOTO_DIR/$PID_FILE /usr/bin/logger "Sauvegarde rdiff $SERVERNAME" if [ -e $EPHOTO_DIR/$LOG_FILE ] then mv $EPHOTO_DIR/$LOG_FILE $EPHOTO_DIR/$LOG_FILE.0 fi if [ -e $EPHOTO_DIR/$STAT_FILE ] then mv $EPHOTO_DIR/$STAT_FILE $EPHOTO_DIR/$STAT_FILE.0 fi echo "Sauvegarde rdiff $SERVERNAME" > $EPHOTO_DIR/$LOG_FILE #Boucle de backup ERROR_FLAG=0 ERROR=0 ERRORS="ERREURS: " for rdir in $(echo $REMOTE_DIR) do 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 >> $EPHOTO_DIR/$LOG_FILE echo >> $EPHOTO_DIR/$LOG_FILE echo RDIFF-BACKUP OF $rdir >> $EPHOTO_DIR/$LOG_FILE echo rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT ${rdir} $SERVERUSR@$SERVERIP::${BCK_DIR}$rdir >> $EPHOTO_DIR/$LOG_FILE rdiff-backup $RDIFF_OPTS --remote-schema "ssh -p $SERVERPORT %s rdiff-backup --server" $EXCLUDE_OPT ${rdir} $SERVERUSR@$SERVERIP::${BCK_DIR}$rdir >> $EPHOTO_DIR/$LOG_FILE 2>&1 ERROR=$? if [ $ERROR -ne 0 ] then ERRORS="$ERRORS $BASE=$ERROR:" ERROR_FLAG=1 else echo CLEANING BACKUPS OF $rdir >> $EPHOTO_DIR/$LOG_FILE echo rdiff-backup $RDIFF_OPTS $SERVERUSR@$SERVERIP::$RETENTION ${BCK_DIR}${rdir} >> $EPHOTO_DIR/$LOG_FILE 2>&1 rdiff-backup $RDIFF_OPTS $RETENTION $SERVERUSR@$SERVERIP::${BCK_DIR}${rdir} >> $EPHOTO_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 $EPHOTO_DIR/$LOG_FILE grep -i warning $EPHOTO_DIR/$LOG_FILE grep -i error $EPHOTO_DIR/$LOG_FILE )| mail -s "ERREUR RDIFF SUR $SERVERNAME $(date +%d/%m)" $MAIL_ADMIN else (date ls -l $EPHOTO_DIR/$LOG_FILE df -k $EPHOTO_DIR )| mail -s "Sauvegarde $SERVERNAME $(date +%d/%m) terminee" $MAIL_ADMIN fi date >> $EPHOTO_DIR/$LOG_FILE /usr/bin/logger "FIN rdiff $SERVERNAME" rm -f $EPHOTO_DIR/$PID_FILE else (echo "$HOSTNAME:$EPHOTO_DIR/$PID_FILE existe : abandon de $0") | mail -s "Erreur sur backup $SERVERNAME" $MAIL_ADMIN fi
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>
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)" 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
Installation
Télécharger :
- Rdiff (rdiff-backup-1.2.8-win32.zip)
http://www.nongnu.org/rdiff-backup/
- putty, plink et puttygen
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
- Blat (blat262.full.sip)
http://sourceforge.net/projects/blat/files/
Préparation de la connexion SSH
Note : on considère ici que la sauvegarde est lancée d'un poste Windows vers un serveur linux
Lancer puttygen. Sélections "SSH-2 DSA" en bas, cliquer sur "Generate" et bouger la souris dans l'espace blanc au milieu de la fenêtre.
Copier la clé DSA qui s'affiche en haut de la fenêtre (sans oublier aucun caractère !), la passer telle quelle vers le serveur linux (via un fichier par scp/ftp, ou mail, ou copier/coller dans une console putty) dans le fichier ~/.ssh/authorized_keys du serveur.
Sauvegarder les clés dans le répertoire Documents and Setting (Win XP/2003) ou Users (Win 7/2008) de l'utilisateur qui lancera rdiff-backup.
- Clé publique :
en cliquant sur "save public key" nommer le fichier privatekey.pub
- Clé privée :
en cliquant sur "save private key" nommer le fichier privatekey.ppk