Sauvegarder avec rsync

De Wiki de la communauté Mandriva.


Cet article présente la mise en place d'une solution de sauvegardes avec l'outil rsync.
Cette page est une ébauche. Elle mérite des améliorations.
Si vous voulez contribuer, cliquez simplement sur l'onglet modifier. Consultez également les autres pages dont le contenu est à réviser.

Sommaire

Public visé

Cet article sur rsync ne s'adresse pas aux personnes débutantes. J'entends par là les personnes :

  • ne manipulant pas la console
  • n'ayant pas d'expérience en programmation BASH

Mais de nombreux outils graphiques faciles sont disponibles.

  • grsync interface graphique facile basée sur rsync
  • rsnapshot basé justement sur rsync

Mandriva en propose d'aussi dans le Centre de Contrôle Mandriva

Maintenant, si vous êtes prêt à vous amuser ou si vous voulez gérer vos sauvegardes à 100 %, c'est article est fait pour vous.

Brève présentation de rsync


Le lecteur pourra voir avec profit la page sur Unison.

Solution de sauvegarde sur disque local

Objectifs

Les objectifs sont les suivant :

  • Réaliser des sauvegardes automatiques à l'aide de cron.
  • Protection contre le double lancement.
  • Avoir une copie conforme des fichiers actuels. Ceci est utile en cas de crash du disque ou en cas de perte massive de données.
  • Avoir une sauvegarde incrémentielle. Ceci nous assure un historique des changements. Si un fichier corrompu s'est déjà propagé dans la copie conforme, on doit pouvoir le retrouver dans cette sauvegarde.

En plus de cela, pour le confort :

  • Compression des sauvegardes incrémentielles au format bz2 afin d'économiser l'espace disque.
  • Suppression des sauvegardes incrémentielles les plus anciennes.

Le script

Le script que je propose pour effectuer cela est le suivant : Attention, cette page est en cours de rédaction, n'utilisez pas encore ce script

#!/bin/sh

###########################################################
# This script uses rsync to backup directories on a media 
# (ex: USB disk) with a copy and incremental method. 
###########################################################
#     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 2 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, write to the Free Software
#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
############################################################
#
# Written by Spip <unpeudescience at gmail dot com>
# Version 1.0
#
############################################################

#to be nice...
ionice -c3 -p$$
renice +15 -p $$

THEDATE=`date +%F_%Hh%M`
FILE='/media/disk/sauvegarde'
LOGFILE='/var/log/sauvegarde'
SPLIT='====================================================================='

#check logfile directory
if ! [ -e $LOGFILE ]
then
	/bin/mkdir -p $LOGFILE
fi

#check if the media is mounted
if ! [ -e $FILE ]
then
	echo "$THEDATE : péripherique non connecté. Pas de sauvegarde possible" >> "$LOGFILE/save.log"
	echo $SPLIT >> "$LOGFILE/save.log"
	exit 0
fi

#prevent a second task
LOCKFILE="/var/lock/sauvegarde.lock"
[ -f $LOCKFILE ] && exit 0
#if the script are stoped, remove lockfile
trap "rm -f $LOCKFILE" EXIT
touch $LOCKFILE

echo "$THEDATE : Début de sauvegarde" >> "$LOGFILE/save.log"

# $1:time to keep files; $2: name of the backup; $3: target
function save() {
	
	echo "$SPLIT" >> "$LOGFILE/$2.log"
	echo "$THEDATE" >> "$LOGFILE/$2.log"

	#Incremental & copie
	INC="$FILE/$2/INC/$THEDATE"
	BAK="$FILE/$2/BAK"
	TOSAVE="$3"
	
	/bin/mkdir -p "$INC"
	if ! [ -e "$BAK" ]
	then
	/bin/mkdir -p "$BAK"
	fi
#a: archivage :recurcif, preserve dates, persmissions, groupes...
#v: verbose mode
#delete : supprime les fichiers n'etant plus chez l'émeteur >> copie conforme.

	/usr/bin/rsync -av --stats --delete --backup --backup-dir="$INC" "$TOSAVE" "$BAK" >> "$LOGFILE/$2.log"
#bz2 compression & remove files	
	cd $FILE/$2/INC
	tar -cjvf "$INC.tar.bz2" "$THEDATE"
	rm -rf "$THEDATE"
#Mr Proper with tmpwatch: 3d indicates 3 days, time before cleaning 
	/usr/sbin/tmpwatch -a $1 "$FILE/$2/INC" >> "$LOGFILE/save.log"

}

#List here all repositories to backup

save 20d thunderbird_gnu /home/gnu/.thunderbird/
save 7d firefox_gnu /home/gnu/.mozilla/ 

save 40d source_code /home/gnu/Bureau/source_code/

#to log the end of the backup
THEDATE=`date +%F_%Hh%M`
echo "$THEDATE : Sauvegarde effectuée" >> "$LOGFILE/save.log"


exit 0


Le script est largement commenté, ajoutons tout de même quelques précisions :

Automatisation

Le script est placé dans /opt/script. Je crée ensuite un lien symbolique dans le dossier /etc/cron.daily

Image:Konsole.png
[root@ordi ~]# ln -s /opt/script/sauvegarde.sh /etc/cron.daily/sauvegarde.sh

Remarque sur le système de fichier

J'ai effectué mes premiers essais avec un disque formaté en FAT. Cependant, j'avais un problème avec ce format. Les fichiers possédant des majuscules étaient sauvegardés avec des minuscules, d'où un nouveau transfert à chaque sauvegarde. Ceci vient d'une option dans le montage du disque : shortname KDE3 met cette option sur none. Je n'ai pas réussi à contourner le problème (GNOME semble proposer une option pour modifier cela). l'utilisation de fstab avec la bonne option shortname=mixed a provoqué d'autres erreurs sur les liens symboliques. Je suis donc passé à un format ext3 plus rapidement que prévu. Celui-ci fonctionne parfaitement.

Solution de sauvegarde à travers SSH


Solutions alternatives

  • LuckyBackup une application de sauvegardes/synchronisation s'appuyant sur la technologie rsync