Rdiff-backup : Différence entre versions
De wikiGite
(→script rdbackup.sh) |
(→rdbackup.sh v2.6) |
||
Ligne 72 : | Ligne 72 : | ||
== script rdbackup.sh == | == script rdbackup.sh == | ||
=== rdbackup.sh v2.6 === | === rdbackup.sh v2.6 === | ||
− | #!/bin/bash | + | #!/bin/bash |
# Backup Script (RDIFF-BACKUP over SSH and RSYNC) | # Backup Script (RDIFF-BACKUP over SSH and RSYNC) | ||
# (C) FSo 06/2010 | # (C) FSo 06/2010 | ||
Ligne 87 : | Ligne 87 : | ||
# 2.0 - Moving variables in a .conf file | # 2.0 - Moving variables in a .conf file | ||
− | |||
ELAPSED=$(which time) | ELAPSED=$(which time) | ||
if [ ! -x $ELAPSED ] | if [ ! -x $ELAPSED ] | ||
Ligne 103 : | Ligne 102 : | ||
. $1 | . $1 | ||
else | else | ||
− | echo "$1 introuvable !" | + | echo "$1 introuvable !" |
exit 1 | exit 1 | ||
fi | fi | ||
Ligne 112 : | Ligne 111 : | ||
. $(dirname $0)/rdbackup.conf | . $(dirname $0)/rdbackup.conf | ||
else | else | ||
− | echo "$(dirname $0)/rdbackup.conf introuvable !" | + | echo "$(dirname $0)/rdbackup.conf introuvable !" |
exit 1 | exit 1 | ||
fi | fi | ||
fi | fi | ||
− | if [ - | + | if [ ! -f $LIST ] |
then | then | ||
− | + | echo "$LIST introuvable !" | |
− | echo " | + | exit 1 |
fi | fi | ||
− | + | while read line | |
+ | do | ||
+ | REMOTE_DIR="$REMOTE_DIR $line" | ||
+ | shift | ||
+ | done < $LIST | ||
+ | |||
if [ ! -e $APPLICATION_DIR/$PID_FILE ] | if [ ! -e $APPLICATION_DIR/$PID_FILE ] | ||
then | then | ||
− | + | if [ ! -d $BCK_DIR ] | |
− | if [ | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
then | then | ||
mkdir -p $BCK_DIR | mkdir -p $BCK_DIR | ||
if [ $? -ne 0 ] | if [ $? -ne 0 ] | ||
then | then | ||
− | echo "Creation $BCK_DIR impossible !" | + | echo "Creation $BCK_DIR impossible !" |
exit 1 | exit 1 | ||
fi | fi | ||
fi | fi | ||
+ | echo $$ > $APPLICATION_DIR/$PID_FILE | ||
# Script pre-backup | # Script pre-backup | ||
if [ -f $PRESCRIPT ] | if [ -f $PRESCRIPT ] | ||
then | then | ||
− | $PRESCRIPT | + | $PRESCRIPT |
if [ $? -ne 0 ] | if [ $? -ne 0 ] | ||
then | then | ||
+ | rm -f $APPLICATION_DIR/$PID_FILE | ||
exit 1 | exit 1 | ||
fi | fi | ||
Ligne 172 : | Ligne 157 : | ||
for DB in $MYDB | for DB in $MYDB | ||
do | do | ||
− | + | mv $APPLICATION_DIR/mysqldump.sql_$DB.gz $APPLICATION_DIR/mysqldump.sql_$DB.gz.0 2>> $APPLICATION_DIR/$LOG_FILE.0 | |
− | mv $APPLICATION_DIR/ | + | mysqldump $DB $MYSQLDUMP_OPTS --password=$MYSQL_PASSWORD > $APPLICATION_DIR/mysqldump_$DB.sql 2>> $APPLICATION_DIR/$LOG_FILE.0 |
− | + | gzip $APPLICATION_DIR/mysqldump_$DB.sql 2>> $APPLICATION_DIR/$LOG_FILE.0 | |
− | mysqldump $DB $MYSQLDUMP_OPTS --password=$MYSQL_PASSWORD > $APPLICATION_DIR/mysqldump_$DB.sql | ||
− | gzip $APPLICATION_DIR/mysqldump_$DB.sql 2>> $APPLICATION_DIR/$LOG_FILE | ||
done | done | ||
fi | fi | ||
Ligne 183 : | Ligne 166 : | ||
service httpd start | service httpd start | ||
fi | fi | ||
− | |||
/usr/bin/logger "Sauvegarde rdiff $SERVERNAME" | /usr/bin/logger "Sauvegarde rdiff $SERVERNAME" | ||
+ | if [ -e $APPLICATION_DIR/$LOG_FILE ] | ||
+ | then | ||
+ | mv $APPLICATION_DIR/$LOG_FILE $APPLICATION_DIR/$LOG_FILE.0 | ||
+ | fi | ||
if [ -e $APPLICATION_DIR/$STAT_FILE ] | if [ -e $APPLICATION_DIR/$STAT_FILE ] | ||
then | then | ||
mv $APPLICATION_DIR/$STAT_FILE $APPLICATION_DIR/$STAT_FILE.0 | mv $APPLICATION_DIR/$STAT_FILE $APPLICATION_DIR/$STAT_FILE.0 | ||
fi | fi | ||
+ | echo "Sauvegarde rdiff $SERVERNAME" > $APPLICATION_DIR/$LOG_FILE | ||
#Boucle de backup | #Boucle de backup | ||
ERROR_FLAG=0 | ERROR_FLAG=0 | ||
Ligne 205 : | Ligne 192 : | ||
while read line | while read line | ||
do | do | ||
− | if | + | if [[ $line =~ ^$rdir ]] |
then | then | ||
EXCLUDE_OPT="$EXCLUDE_OPT --exclude $line" | EXCLUDE_OPT="$EXCLUDE_OPT --exclude $line" | ||
Ligne 218 : | Ligne 205 : | ||
if [ $SLOCAL -eq 0 ] | if [ $SLOCAL -eq 0 ] | ||
then | then | ||
− | + | RSSCHEMA=--remote-schema | |
− | + | RSOPTION="\"ssh -p $SOURCEPORT %s rdiff-backup --server\"" | |
− | SDIR="$ | + | SDIR="$SOURCEUSR@$SOURCEIP::${rdir}" |
else | else | ||
− | + | RSSCHEMA="" | |
− | + | RSOPTION="" | |
SDIR="${rdir}" | SDIR="${rdir}" | ||
fi | fi | ||
if [ $DLOCAL -eq 0 ] | if [ $DLOCAL -eq 0 ] | ||
then | then | ||
− | + | RDSCHEMA=--remote-schema | |
− | + | RDOPTION="\"ssh -p $DESTINATIONPORT %s rdiff-backup --server\"" | |
− | DDIR="$ | + | DDIR="$DESTINATIONUSR@$DESTINATIONIP::${BCK_DIR}$rdir" |
else | else | ||
RDSCHEMA="" | RDSCHEMA="" | ||
Ligne 236 : | Ligne 223 : | ||
DDIR="${BCK_DIR}$rdir" | DDIR="${BCK_DIR}$rdir" | ||
fi | fi | ||
− | echo rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT $ | + | echo rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT $RSSCHEMA $RSOPTION $SDIR $DDIR >> $APPLICATION_DIR/$LOG_FILE |
− | # Note : "eval" is necessary to correctly keep the quotes in $RSOPTION | + | # Note : "eval" is necessary to correctly keep the quotes in $RSOPTION |
− | eval $ELAPSED rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT $ | + | eval $ELAPSED rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT $RSSCHEMA $RSOPTION $SDIR $DDIR >> $APPLICATION_DIR/$LOG_FILE 2>&1 |
ERROR=$? | ERROR=$? | ||
if [ $ERROR -ne 0 ] | if [ $ERROR -ne 0 ] | ||
Ligne 246 : | Ligne 233 : | ||
else | else | ||
echo CLEANING BACKUPS OF $rdir >> $APPLICATION_DIR/$LOG_FILE | echo CLEANING BACKUPS OF $rdir >> $APPLICATION_DIR/$LOG_FILE | ||
− | echo rdiff-backup $ | + | echo rdiff-backup $RDSCHEMA $RDOPTION $RETENTION $DDIR >> $APPLICATION_DIR/$LOG_FILE |
# Note : "eval" is necessary to correctly keep the quotes in $RDOPTION | # Note : "eval" is necessary to correctly keep the quotes in $RDOPTION | ||
− | eval rdiff-backup $ | + | eval rdiff-backup $RDSCHEMA $RDOPTION $RETENTION $DDIR >> $APPLICATION_DIR/$LOG_FILE 2>&1 |
ERROR=$? | ERROR=$? | ||
if [ $ERROR -ne 0 ] | if [ $ERROR -ne 0 ] | ||
Ligne 264 : | Ligne 251 : | ||
grep -i warning $APPLICATION_DIR/$LOG_FILE | grep -i warning $APPLICATION_DIR/$LOG_FILE | ||
grep -i error $APPLICATION_DIR/$LOG_FILE | grep -i error $APPLICATION_DIR/$LOG_FILE | ||
− | )| | + | )| mail -s "RDIFF ERROR ON $SERVERNAME $(date +%d/%m)" $MAIL_ADMIN |
else | else | ||
# Script post-backup | # Script post-backup | ||
if [ -f $POSTSCRIPT ] | if [ -f $POSTSCRIPT ] | ||
then | then | ||
− | $POSTSCRIPT | + | $POSTSCRIPT |
if [ $? -ne 0 ] | if [ $? -ne 0 ] | ||
then | then | ||
Ligne 279 : | Ligne 266 : | ||
ls -l $APPLICATION_DIR/$LOG_FILE | ls -l $APPLICATION_DIR/$LOG_FILE | ||
df -k $APPLICATION_DIR | df -k $APPLICATION_DIR | ||
− | )| | + | )| mail -s "Backup $SERVERNAME $(date +%d/%m) successfull" $MAIL_ADMIN |
fi | fi | ||
date >> $APPLICATION_DIR/$LOG_FILE | date >> $APPLICATION_DIR/$LOG_FILE | ||
Ligne 285 : | Ligne 272 : | ||
rm -f $APPLICATION_DIR/$PID_FILE | rm -f $APPLICATION_DIR/$PID_FILE | ||
else | else | ||
− | (echo "$HOSTNAME:$APPLICATION_DIR/$PID_FILE existe : abandon de $0") | | + | (echo "$HOSTNAME:$APPLICATION_DIR/$PID_FILE existe : abandon de $0") | mail -s "BACKUP ERROR ON $SERVERNAME [on $(hostname)]" $MAIL_ADMIN |
fi | fi | ||
Version du 18 avril 2012 à 13:37
Sommaire
- 1 Linux
- 2 Windows
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".
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.
# fichier /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
# répertoire /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", 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.
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.
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 !).
script rdbackup.sh
rdbackup.sh v2.6
#!/bin/bash # Backup Script (RDIFF-BACKUP over SSH and RSYNC) # (C) FSo 06/2010 # V 2.6 # from sbackup.sh (RSYNC) # Changelog : # 2.6 - Some optimizations on directional options # 2.5 - Ehanced directional options (local/remote choice for source and destination) # 2.4 - Stop if necessary Apache service before dumping MySQL # 2.3 - Added backup sens (local to local or local to remote) # - Added backup destination in .conf file : LOCAL or REMOTE # 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 ELAPSED=$(which time) if [ ! -x $ELAPSED ] then unset ELAPSED else ELAPSED="$ELAPSED -fElapsed:%E" fi if [ $# -gt 0 ] then # let use the given full path config (.conf) file if [ -f $1 ] then . $1 else echo "$1 introuvable !" exit 1 fi else # Application specific if [ -f $(dirname $0)/rdbackup.conf ] then . $(dirname $0)/rdbackup.conf else echo "$(dirname $0)/rdbackup.conf introuvable !" exit 1 fi fi if [ ! -f $LIST ] then echo "$LIST introuvable !" exit 1 fi while read line do REMOTE_DIR="$REMOTE_DIR $line" shift done < $LIST
if [ ! -e $APPLICATION_DIR/$PID_FILE ] then if [ ! -d $BCK_DIR ] then mkdir -p $BCK_DIR if [ $? -ne 0 ] then echo "Creation $BCK_DIR impossible !" exit 1 fi fi echo $$ > $APPLICATION_DIR/$PID_FILE # Script pre-backup if [ -f $PRESCRIPT ] then $PRESCRIPT if [ $? -ne 0 ] then rm -f $APPLICATION_DIR/$PID_FILE exit 1 fi fi if [ $STOPAPACHE -eq 1 ] then service httpd stop fi if [ $MYSQLDUMP -eq 1 ] then for DB in $MYDB do mv $APPLICATION_DIR/mysqldump.sql_$DB.gz $APPLICATION_DIR/mysqldump.sql_$DB.gz.0 2>> $APPLICATION_DIR/$LOG_FILE.0 mysqldump $DB $MYSQLDUMP_OPTS --password=$MYSQL_PASSWORD > $APPLICATION_DIR/mysqldump_$DB.sql 2>> $APPLICATION_DIR/$LOG_FILE.0 gzip $APPLICATION_DIR/mysqldump_$DB.sql 2>> $APPLICATION_DIR/$LOG_FILE.0 done fi if [ $STOPAPACHE -eq 1 ] then service httpd start fi /usr/bin/logger "Sauvegarde rdiff $SERVERNAME" if [ -e $APPLICATION_DIR/$LOG_FILE ] then mv $APPLICATION_DIR/$LOG_FILE $APPLICATION_DIR/$LOG_FILE.0 fi if [ -e $APPLICATION_DIR/$STAT_FILE ] then mv $APPLICATION_DIR/$STAT_FILE $APPLICATION_DIR/$STAT_FILE.0 fi echo "Sauvegarde rdiff $SERVERNAME" > $APPLICATION_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 if [ ! -f $EXCLUDE ] then echo "$EXCLUDE introuvable !" exit 1 fi EXCLUDE_OPT="" while read line do if $line =~ ^$rdir then EXCLUDE_OPT="$EXCLUDE_OPT --exclude $line" fi shift done < $EXCLUDE fi # rdiff date >> $APPLICATION_DIR/$LOG_FILE echo >> $APPLICATION_DIR/$LOG_FILE echo RDIFF-BACKUP OF $rdir >> $APPLICATION_DIR/$LOG_FILE if [ $SLOCAL -eq 0 ] then RSSCHEMA=--remote-schema RSOPTION="\"ssh -p $SOURCEPORT %s rdiff-backup --server\"" SDIR="$SOURCEUSR@$SOURCEIP::${rdir}" else RSSCHEMA="" RSOPTION="" SDIR="${rdir}" fi if [ $DLOCAL -eq 0 ] then RDSCHEMA=--remote-schema RDOPTION="\"ssh -p $DESTINATIONPORT %s rdiff-backup --server\"" DDIR="$DESTINATIONUSR@$DESTINATIONIP::${BCK_DIR}$rdir" else RDSCHEMA="" RDOPTION="" DDIR="${BCK_DIR}$rdir" fi echo rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT $RSSCHEMA $RSOPTION $SDIR $DDIR >> $APPLICATION_DIR/$LOG_FILE # Note : "eval" is necessary to correctly keep the quotes in $RSOPTION eval $ELAPSED rdiff-backup $RDIFF_OPTS $EXCLUDE_OPT $RSSCHEMA $RSOPTION $SDIR $DDIR >> $APPLICATION_DIR/$LOG_FILE 2>&1 ERROR=$? if [ $ERROR -ne 0 ] then ERRORS="$ERRORS $BASE=$ERROR:" ERROR_FLAG=1 else echo CLEANING BACKUPS OF $rdir >> $APPLICATION_DIR/$LOG_FILE echo rdiff-backup $RDSCHEMA $RDOPTION $RETENTION $DDIR >> $APPLICATION_DIR/$LOG_FILE # Note : "eval" is necessary to correctly keep the quotes in $RDOPTION eval rdiff-backup $RDSCHEMA $RDOPTION $RETENTION $DDIR >> $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 "RDIFF ERROR ON $SERVERNAME $(date +%d/%m)" $MAIL_ADMIN else # Script post-backup if [ -f $POSTSCRIPT ] then $POSTSCRIPT if [ $? -ne 0 ] then ERRORS="$ERRORS - Script POST-BACKUP error" fi fi (date echo $ERRORS ls -l $APPLICATION_DIR/$LOG_FILE df -k $APPLICATION_DIR )| mail -s "Backup $SERVERNAME $(date +%d/%m) successfull" $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 "BACKUP ERROR ON $SERVERNAME [on $(hostname)]" $MAIL_ADMIN fi
Fichier rdbackup.conf v2.6
A positionner dans le même répertoire que le script
# Rdbackup configuration file - v2.6 MAIL_ADMIN=admin@domain.fr SERVERNAME=server.domain.fr SUFFIX=_server # # NOTE : BACKUP *MUST* HAVE AT LEAST A LOCAL SOURCE OR DESTINATION # both can't be remote, rdiff-backup can't handle that. # If SLOCAL=0 then DLOCAL MUST be equal to 1, and vice versa # # Backup source # SLOCAL=0 : backup FROM a remote server (via SSH) # SLOCAL=1 : backup FROM a local directory (or NFS mount or SMB mount) SLOCAL=0 # Backup destination # DLOCAL=0 : backup TO a remote server (via SSH) # DLOCAL=1 : backup TO a local directory (or NFS mount or SMB mount) DLOCAL=1 # IP, port, user if source or destination is remote REMOTEIP=192.168.1.1 REMOTEPORT=22 REMOTEUSR=root # BACKUP DESTINATION DIRECTORY (local or on remote server) BCK_DIR=/media/backups/$SERVERNAME # Path where are rdbackup.sh, .conf, .list and .exclude SCRIPT_DIR=$(dirname $0) # Specific application path, for log/pid files, mysqldump destination and df APPLICATION_DIR=$SCRIPT_DIR # Or : #APPLICATION_DIR=</path/to/application> LIST=$SCRIPT_DIR/rdbackup${SUFFIX}.list EXCLUDE=$SCRIPT_DIR/rdbackup${SUFFIX}.exclude # LOG and other files LOG_FILE=rdbackup${SUFFIX}.log STAT_FILE=rdbackup${SUFFIX}.stats PID_FILE=rdbackup${SUFFIX}.pid # Backup options RDIFF_OPTS="-v5 --force --create-full-path --exclude-fifos --exclude-sockets" # Cleanup options (default : 1 week) RETENTION="--remove-older-than 1W --force" # Script to launch BEFORE backup. # Example for BlueOnyx : PRESCRIPT=$SCRIPT_DIR/cmuBackup.sh PRESCRIPT= # Script to launch AFTER backup POSTSCRIPT= # DUMP MYSQL # Stop Apache before dumping MySQL ? Yes if STOPAPACHE=1 STOPAPACHE=0 # Dump disabled if MYSQLDUMP=0 MYSQLDUMP=0 MYSQL_PASSWORD=Mot_de_passe_MySQL # MYDB=<mysql_db_name> # Or : if [ $MYSQLDUMP -eq 1 ] then MYDB=$(mysql --execute "show databases\G" --password=$MYSQL_PASSWORD | grep -v row | sed -e 's/Database: //g' | grep -v mysql | grep -v information_schema | grep -v performance_schema) fi MYSQLDUMP_OPTS="--routines"
Point à vérifier pour l'ajout d'un serveur
Pour une sauvegarde lancée à partir d'un serveur de backup central, vers les serveur à sauvegarder :
- configurer les fichiers .conf, .list et .backup sur le serveur de backup
- Copier la clé /root/.ssh/id_dsa.pub du serveur de backup dans /root/.ssh/authorized_keys du serveur sauvegardé
- vérifier que le serveur de backup se connecte sans mot de passe au serveur à sauvegarder par ssh root@serveur_a_sauvegarder (profiter de ce test pour enregistrer la clé publique du serveur à sauvegarder)
- Vérifier que rdiff-backup est bien installé et à la bonne version sur le serveur à sauvegarder !
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électionner "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, en une seule ligne, 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
Tests de connexion
Tester la connexion avec plink (ce qui permet d'enregistrer localement la clé du serveur à la première connexion) :
c:\backup\plink.exe -i C:\Users\<utilisateur windows>\privatekey.ppk utilisateur_cible@server.systea.net
la connexion doit se faire sans demande de mot de passe.
Tester rdiff-backup :
c:\backup\rdiff-backup -v5 --test-server --remote-schema "c:\backup\plink.exe -P 22 -i C:\Users\<utilisateur windows>\privatekey.ppk %s rdiff-backup --server" utilisateur_cible@server.systea.net::/tmp
Test de Blat
Tester un envoi (le nom de fichier qui constituera le corps du mail est obligatoire, sinon blat reste "en attente" et ne rend jamais la main).
blat c:\backup\fichier.txt -to destinataire@server.systea.net -server smtp.orange.fr -f expediteur@serveur.com -s "SUJET DU MAIL"
Script de sauvegarde
NOTE : le "%s" doit être transformé en "%%s" pour être reconnu par l'interpréteur DOS.
rem @echo off set ERROR=0 set MAILOPTS=-server smtp.orange.fr -f expediteur@serveur.com copy c:\backup\backup.log c:\backup\backup.log.0 c:\backup\rdiff-backup\rdiff-backup.exe -v5 --remote-schema "c:\backup\plink -P 22 -i c:\Users\<Utilisateur Windows>\privatekey.ppk %%s rdiff-backup --server" "c:/partage/" USER@SERVER.systea.net::/home/backup/partage > c:\backup\backup.log 2>&1 IF NOT "%ERRORLEVEL%"=="0" ( set ERROR=1) REM le LOG n'est pas relaché tout de suite, on doit simuler une pause de 5 secondes... ping -n 5 127.0.0.1 c:\backup\rdiff-backup\rdiff-backup.exe -v5 --remote-schema "c:\backup\plink -P 22 -i c:\Users\<Utilisateur Windows>\privatekey.ppk %%s rdiff-backup --server" --remove-older-than 4W USER@SERVER.systea.net::/home/backup/partage >> c:\backup\backup.log 2>&1 IF NOT "%ERRORLEVEL%"=="0" ( set ERROR=1) ping -n 5 127.0.0.1 IF "%ERROR%"=="0" ( c:\backup\blat\full\blat c:\backup\backup.log -to destinataire@systea.net %MAILOPTS% -s "Sauvegarde terminee" > c:\backup\blat.log 2>&1 ) 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 )