Sauvegardes : Rsync + script shell
Les sauvegardes sont importantes pour tous les administrateurs en herbe, beaucoup de solutions existent, il faut donc trouver celle qui est la mieux adaptée à ses besoins. Les plus connues sont les sauvegardes différentielles et incrémentales, elles sont toutes les deux intéressantes et à mon avis complémentaires. Alors comment les utiliser ensemble ? Vous le saurez dans cet article après un petit tour de la question ! ![]()
- Tar & cie
C'est bien quand on a trois fichiers mais ça devient vite fastidieu et cela demande beaucoup d'espace disque puisque tout le contenu des répertoires que vous voulez sauvegarder est compressé et envoyé à chaque fois. Sans compter que cela utilise du temps processeur pour la compression, et des ressources physiques (lecture/écriture).- Avantages :
- Solution relativement simple à mettre en place.
- Possibilité de mettre les archives sur des bandes magnétiques/CDs/etc séparés.
- Inconvénients :
- Demande beaucoup de ressources : Peu être assez long.
- Demande aussi beaucoup d'espace disque puisque la source est sauvegardée entièrement à chaque fois
- Peu pratique pour naviguer dans les sauvegardes si on ne sait pas où chercher.
- Outils :
- Tar
- zip
- gzip
- ...
tar -cjvf `hostname`-home-`date --date=yesterday "+%Y-%m-%d"`.tar.bz2 /home/
Ceci permet de compresser le dossier /home avec l'algorithme bzip2 qui est un des meilleurs. Cela devrait donner en sortie un fichier qui devrait ressembler à "host-home-2009-05-02.tar.bz2".
- Avantages :
- Sauvegarde différentielle
Cette méthode effectue une sauvegarde complète la première fois que vous la lancez. A J+1 seul les fichiers qui auront été modifiés depuis le jour J seront sauvegardé et remplacé dans la sauvegarde. Au jour J+2, il fera la différence entre la sauvegarde J+1 et J+2 (actuelle) et ainsi de suite.- Avantages :
- Il est facile de remettre une sauvegarde quand un système a crashé, vous aurez une "capture" de votre partition (ou autre) du jour précédent, il suffit de la copier.
- Prend peu de place en général puisque c'est une copie de votre disque, peu être un peu plus volumineux si vous choisissez ou non de garder les fichiers supprimés.
- Inconvénients :
- Si vous voulez récupérer un fichier qui date de J-3, là vous aurez un soucis s'il a été modifié/effacé depuis.
- Outils :
- Rsync
- rdiff-backup
rsync -az --stats --filter "- *~" /home/ login:passwd@server:/backup/home
Rsync va envoyer tout le contenu de /home sur le serveur distant, au jour J+1 il enverra seulement les fichiers modifiés depuis et supprimera ceux que vous avez supprimé si vous spécifiez l'argument --del. Remplacez bien sûr les informations par les vôtres. Si vous avez un système de clés publiques/privées enlevez "login:passwd@" et si jamais le port d'écoute de ssh est différent de 22, rajoutez ceci : -e "ssh -p PORT" (n'enlevez pas les guillemets).
- Avantages :
- Sauvegarde Incrémentale
La sauvegarde incrémentale - on peut aussi l'appeler incrémentielle - a le principe de base que la sauvegarde différentielle : Elle effectue une sauvegarde complète le jour J, puis le jour J+1 elle va envoyer seulement les fichiers qui auront été modifiés, à J+2 ceux qui ont été modifiés depuis J+1, etc. Mais contrairement à la sauvegarde différentielle, elle ne va pas tout envoyer dans un seul et même répertoire et remplacer les fichiers modifiés : Elle va créer des dossiers chaque jour qui contiendront les nouveaux fichiers.- Avantages :
- Vous pouvez retrouver un fichier supprimé ou effacé depuis x jours.
- Prend peu de place : environ 1,5x la taille de la source
- Inconvénients :
- Il est fastidieux de restaurer tout un système puis qu'il faut aller chercher la dernière sauvegarde complète et copier tous les fichiers qui ont été modifiés depuis dans les dossiers J+1, J+2, etc.
- Outils :
- Reoback (nfs/ftp)
- Rsync, en changeant le répertoire distant chaque jour, mais peu optimisé.
- Avantages :
Pour ma part je voulais faire de la sauvegarde incrémentielle tout en ayant chaque jour une image complète du système. Alors oui comme dit plus haut on peut faire ceci en utilisant Rsync et en lui changeant son répertoire distant chaque jour, mais il fera une copie complète à chaque fois, mais bon, ça prend de la place tout ça.
J'avais trouvé un outils qui pouvait être pas mal : Dirvish, une surcouche de Rsync. Mais je n'arrivais pas à le configurer pour qu'il utilise des clés et lui dire d'utiliser ssh sur un port différent. Comme il y avait peu ou pas de tutos sur le net et que la doc était plus que basique, je suis revenus à Rsync.
Pour faire simple, j'utilise rsync pour envoyer (depuis A) sur un serveur distant (B) des dossiers (/etc, /home, ..). Commençons par A :
#!/bin/bash REMOTE_DIR="/home/backup/" echo -n "#################### " echo -n `date` echo " ####################" echo # Sauvegarde de HOME rsync -az --stats --filter "- *~" /home/ -e "ssh -p PORT" REMOTE_HOST:$REMOTE_DIR/home/current #Sauvegarde de ETC rsync -az --stats --filter "- *~" /etc/ -e "ssh -p PORT" REMOTE_HOST:$REMOTE_DIR/etc/current # Sauvegarde de VAR #rsync -az --stats /var/ --exclude="log" --exclude="*~" -e "ssh -p PORT" REMOTE_HOST:$REMOTE_DIR/var/current # Sauvegarde de ROOT rsync -az --stats /root/ --filter "- *~" -e "ssh -p PORT" REMOTE_HOST:$REMOTE_DIR/root/current echo echo "##################################################"
Ce script va sauvegarder tous les dossiers sur B dans des répertoires "current". L'option "-e" permet de spécifier la commande a exécuter, en l'occurrence là "ssh -p PORT" car mon port est différent du port 22, cette commande est entourée de guillemets pour que ça ne compte comme un seul argument et non 3. Pour les arguments a et z je vous laisse lire le man.
Jusque là nous devrions avoir sur le serveur distant ceci :
ls -R /home /home/backup/: etc home root /home/backup/etc: current /home/backup/home: current /home/backup/root: current
J'ai enlevé les parties qui lisaient le contenu des fichiers current.
Si nous relançons le lendemain la même commande, il enverra sur B seulement les fichiers modifiés et supprimera ceux qui l'ont été sur le serveur A : C'est le comportement par défaut de Rsync et des sauvegardes différentielles.
Pour que cela devienne de l'incrémentale, nous allons faire un petit script sur le serveur distant B qui tournera après Rsync (c'est à vous de dosez les heures dans le fichier crontab). Je me suis inspiré d'un script trouvé sur Lea-Linux :
#!/bin/bash
DIR=($(ls -d /home/backup/*))
KEEP=10
DATE=`date --date=yesterday "+%Y-%m-%d"`
echo "################### SAVE-ROTATE DU $DATE ####################"
echo
for line in "${DIR[@]}"
do
# arborescence :
# /home/backup/xxxx/xx-xx-xx
# /home/backup/xxxx/current
# calcule date du jour
echo -n "Sauvegarde du dossier "
echo -n `echo $line | cut -d / -f 5`
echo " en cours..."
# supprime les vieilles sauvegardes
ls -d $line/2* | sort | head --lines=-$KEEP | xargs rm -rf
# crée le répertoire pour les backups de la veille s'il n'exite pas déjà
if [ -d $DATE ]; then
echo "Erreur: le dossier de sauvegarde existe deja"
echo
continue
fi
mkdir $line/$DATE
# copie (hard links) les données
cp -al $line/current/* $line/$DATE
echo
# on fait le rsync ensuite
done
echo "##################################################################"
Le script va donc faire des hard links entre le dossier current et le dossier du J-1 chaque jour. J'ai essayé de faire un petit schéma :

Cette rotation permet d'avoir une "photo" de son système pendant X jours ce qui permet de faire une restauration rapide en cas de besoin. La sauvegarde, grâce aux hardlinks, prend un minimum de place puisque si un fichier n'est pas modifié pendant 10 jours, les 10 fichiers que l'on voit dans les dossiers pointent en fait vers le même contenu, en clair cela prend la place d'un seul fichier.
Je pense avoir fait le tour, j'éditerai peut être pour y rajouter des infos complémentaires.
A vos sauvegardes !
Content de cet article?
Aucun trackbacks pour l'instant