Mettre en place une sauvegarde incrémentale avec rsync
rsync est un outil très puissant de sauvegarde qu’on peut utiliser tel quel. On va automatiser ici une sauvegarde sur, alternativement, deux disques externes, en fonction des jours de la semaine. De plus, on sauvegardera les éventuelles anomalies trouvées dans un fichier dédié. Nous n’utiliserons ici que le « mode local » de rsync
.
Nous n’approfondirons pas les nombreuses possibilités de rsync
, qui est un logiciel libre en lignes de commandes, porté sur plusieurs systèmes d’exploitation.
Surtout pratiqué dans le monde Linux, on en trouve facilement des tutoriels sur Internet, comme cette présentation sur le wiki d’Ubuntu.fr ou celle-ci sur Debian Facile.
Un point important pour ne pas se perdre dans des travaux inutiles (voir par exemple ces échanges) : rsync
s’utilise pour les sauvegardes (notamment via SSH), pas pour les mises à jour des sites internets (par synchronisation via FTP). Ces dernières peuvent se faire, de manière incrémentale à la manière de rsync, avec le logiciel weex que nous avons présenté dans notre article « Hugo 2 - on continue nos premiers pas (chapô, RSS, métadonnées, images, tables des matières et mise en ligne avec weex) ».
Ce qu’on veut réaliser :
- sauvegarder sur un disque dur externe des répertoires et fichiers déterminés de mon répertoire utilisateur (
/home/moi/
) - garder trace des éventuelles anomalies trouvées lors de la réalisation de cette sauvegarde incrémentale
- améliorer le processus de sauvegarde en alternant les sauvegardes sur deux disques, en fonction des jours de la semaine
1 Sauvegarder sur un disque dur externe
Si j’appelle mon disque dur de sauvegarde BIB
, il va être monté sur /media/moi/BIB/
. Je vais y créer, la toute première fois, un répertoire mes_docs
. La commande rsync pour sauvegarder l’ensemble de mes fichiers utilisateurs va être
rsync -av /home/moi/ /media/moi/BIB/mes_docs
Ici on a demandé que les fichiers soient sauvegardés en mode archive (« -a ») qui assure que les liens, permissions et autres attributs soient préservés dans le transfert. Le v
(dans « -av ») est pour « verbeux ». Le mode archive embarque la sauvegarde récursive, c’est-à-dire que le logiciel va parcourir l’arborescence complète des répertoires et fichiers contenus dans le répertoire à sauvegarder.
Tout ça va se retrouver dans le répertoire mes_docs
de mon disque BIB.
Je veux aussi que ce que j’ai supprimé sur mon répertoire utilisateur le soit aussi sur ma sauvegarde, ce qui donne :
rsync -av --delete /home/moi/ /media/moi/BIB/mes_docs
Synchronisation unidirectionnelle avec rsync
figure 1
Mais, en fait, j’ai seulement trois répertoires très spécifiques que je veux sauvegarder, et pas tout mon disque utilisateur. Ces trois répertoires sont :
- le répertoire caché contenant ma messagerie (messages, paramètres, etc.) qui est
.icedove
, icedove étant la version libre (au sens de Debian) de Thunderbird - le répertoire
Documents
- le répertoire
Téléchargements
Donc maintenant j’ai trois commandes à passer :
rsync -av --delete /home/moi/.icedove/ /media/moi/BIB/mes_docs/icedove
rsync -av --delete /home/moi/Documents/ /media/moi/BIB/mes_docs/documents
rsync -av --delete /home/moi/Téléchargements/ /media/moi/BIB/mes_docs/telechargement
2 Mémoriser des éventuelles anomalies de sauvegarde
Comme ma sortie est verbeuse, s’affichent sur le terminal le nom des répertoires balayés, les sauvegardes effectuées et les éventuelles anomalies de sauvegarde. J’aurais pu n’afficher que les anomalies avec l’option « -q » pour quiet. Cela aurait donné, par exemple :
rsync -aq --delete /home/moi/.icedove/ /media/moi/BIB/mes_docs/icedove
Mais je n’ai peut-être pas envie de traiter immédiatement les problèmes rencontrés. Il m’est plus utile de les sauvegarder dans un fichier pour y revenir plus tard. De plus l’option verbeuse me convient bien car je peux toujours jeter un coup d’oeil sur ce qui se passe.
Il me faut donc rediriger la sortie d’erreur standard. Comme le décrit très bien l’article de Wikipedia sur les flux standards des systèmes UNIX (dont Linux), « L’erreur standard est le flux de sortie permettant aux programmes d’émettre des messages d’erreurs et des diagnostics. Il s’agit d’un flux distinct de la sortie standard, qui peut être redirigé indépendamment. Le descripteur de fichier de l’erreur standard est 2. »
Voici ce que cela donne :
rsync -av --delete /home/moi/.icedove/ /media/moi/BIB/mes_docs/icedove 2> mes_erreurs
Il faut noter que « 2 » et « > » se touchent dans la commande de redirection. Cela va créer un fichier que j’ai appelé mes_erreurs
. Chaque anomalie détectée sera retranscrite comme une ligne de ce fichier. S’il n’y a pas d’anomalie, le fichier sera donc vide à l’issue du traitement.
Redirection de la sortie d'erreur standard de rsync vers un fichier
figure 2
Je n’ai pas envie, à chaque sauvegarde, d’aller regarder dans un fichier pour voir si je n’ai pas d’anomalie. C’est ici qu’on va réaliser un peu de programmation en bash.
On va utiliser une structure classique if then else fi
précédée d’un test pour savoir si le fichier contient au moins une ligne d’anomalie.
test -s FICHIER
va donner une réponse logique à VRAI si le fichier existe et à une taille non nulle. Donc si le test est VRAI, cela veut dire que j’ai une ou plusieurs anomalies, sinon je n’en ai pas et je peux supprimer (avec la commande bash rm
) le fichier des erreurs.
Ce qui va donner
if test -s 'mes_erreurs'
then echo "ATTENTION des erreurs ont été trouvées"
else
echo "Aucune anomalie lors de la sauvegarde"
# on peut donc supprimer le fichier mes_erreurs car il est vide
rm mes_erreurs
fi
On a encore deux autres répertoires (le répertoire Documents
et le répertoire Téléchargements
) à sauvegarder. Et on peut encore trouver des anomalies lors de ce traitement. On pourrait créer d’autres fichiers pour mémoriser les erreurs. La technique serait alors identique à ce qu’on a déjà vu plus haut. Ici, on a choisi simplement d’ajouter les éventuelles anomalies supplémentaires dans le fichier mes_erreurs déjà existant. Pour cela on utilise la redirection >>
.
Organigramme du programme de synchronisation avec suppression automatique du fichier d'anomalies lorsqu'il est vide
figure 3
On obtient finalement :
rsync -av --delete /home/moi/.icedove/ /media/moi/BIB/mes_docs/icedove 2> mes_erreurs
rsync -av --delete /home/moi/Documents/ /media/moi/BIB/mes_docs/documents 2>> mes_erreurs
rsync -av --delete /home/moi/Téléchargements/ /media/moi/BIB/mes_docs/telechargement 2>> mes_erreurs
if test -s 'mes_erreurs'
then echo "ATTENTION des erreurs ont été trouvées"
else
echo "Aucune anomalie lors de la sauvegarde"
# on peut donc supprimer le fichier mes_erreurs car il est vide
rm mes_erreurs
fi
On met tout ça dans un petit fichier texte de notre choix. Il suffira d’en recopier le contenu dans un terminal pour exécuter le programme. Ouf.
3 Réaliser une sauvegarde en alternance pour les vrais paranoïaques
Maintenant, je décide d’utiliser deux disques externes pour réaliser mes sauvegardes. Le premier s’appelle BIB1
et le second BIB2
.
Les sauvegardes des lundi, mercredi, vendredi et dimanche seront effectuées sur BIB1
, celles de mardi, jeudi et samedi sur BIB2
.
Pour obtenir le jour de la semaine, il suffit d’utiliser la commande date
en y ajoutant le paramètre "%A"
:
date +"%A"
(Attention à bien accoler le +
au "%A"
sinon le système ne reconnaît pas la commande.)
Pour mettre le jour de la semaine dans la variable jour
, on tape :
jour=$(date +"%A")
Maintenant, en fonction du contenu de la variable jour, on utilisera soit le disque BIB1
soit le disque BIB2
. Pour ce faire on a utiliser la structure classique case ... esac
:
case $jour in
lundi ) disque="BIB1";;
mardi ) disque="BIB2";;
mercredi ) disque="BIB1";;
jeudi ) disque="BIB2";;
vendredi ) disque="BIB1";;
samedi ) disque="BIB2";;
dimanche ) disque="BIB1";;
* ) echo "ATTENTION erreur - arrêt du programme";
exit;;
esac
Donc en fonction du jour de la semaine, la variable disque contiendra soit BIB1 soit BIB2. On peut le vérifier en tapant :
echo "le disque de sauvegarde est $disque"
Maintenant notre disque externe ou fichier media (on est sur Linux où tout est fichier) est de la forme /media/moi/BIB1
ou /media/moi/BIB2
.
On va créer une variable disque_sauvegarde
avec l’adresse exacte du fichier media. Puis on va vérifier si le fichier media existe, en d’autres termes si le bon disque externe est monté. Si c’est le cas, on procède à la sauvegarde, sinon on arrête tout.
Pour la création de la variable contenant l’adresse du fichier media :
disque_sauvegarde="/media/moi/$disque/"
Et pour vérifier si le bon disque externe est monté, on tapera :
if [ ! -e "$disque_sauvegarde" ]
then
echo "ATTENTION erreur - le média $disque_sauvegarde n'est pas monté"
exit;
fi
Ce qui se traduit par « si le bon disque de sauvegarde n’existe pas (le « ! -e
» du if
), alors il y a une erreur et j’arrête le programme ».
Organigramme du programme de synchronisation en fonction du jour de la semaine
figure 4
Maintenant on va mettre tout ça dans un petit fichier identifiable comme un script bash, que nous intitulerons sauvegarde.sh
et qui contiendra :
#!/bin/bash
# programme de sauvegarde
#
# le jour de la semaine
jour=$(date +"%A")
# détermination du disque à utiliser
case $jour in
lundi ) disque="BIB1";;
mardi ) disque="BIB2";;
mercredi ) disque="BIB1";;
jeudi ) disque="BIB2";;
vendredi ) disque="BIB1";;
samedi ) disque="BIB2";;
dimanche ) disque="BIB1";;
* ) echo "ATTENTION erreur sur le jour - arrêt du programme";
exit;;
esac
echo "le disque de sauvegarde est $disque"
# vérification que le disque est bien monté
# sinon on arrête tout
disque_sauvegarde="/media/moi/$disque/"
if [ ! -e "$disque_sauvegarde" ]
then
echo "ATTENTION erreur - le média $disque_sauvegarde n'est pas monté"
exit;
fi
# on lance la sauvegarde sur le bon disque
rsync -av --delete /home/moi/.icedove/ $disque_sauvegarde"mes_docs/icedove" 2> mes_erreurs
rsync -av --delete /home/moi/Documents/ $disque_sauvegarde"mes_docs/documents" 2>> mes_erreurs
rsync -av --delete /home/moi/Téléchargements/ $disque_sauvegarde"mes_docs/telechargement" 2>> mes_erreurs
# on vérifie si des anomalies ont été trouvées
if test -s 'mes_erreurs'
then echo "ATTENTION des erreurs ont été trouvées lors de la sauvegarde"
else
echo "Aucune anomalie lors de la sauvegarde"
# on peut donc supprimer le fichier mes_erreurs car il est vide
rm mes_erreurs
fi
# le programme est maintenant terminé
echo "Penser à démonter le disque $disque_sauvegarde"
Bien sûr, ce serait bien d’intégrer ce script aux sauvegardes, par exemple en le mettant sous le répertoire Documents
. Pour lancer le script, il suffira alors de taper dans un terminal :
bash Documents/sauvegarde.sh
C’est tout pour aujourd’hui.
———- La citation :
Elle guette, l’Ombre de la Neige
Son Œil,
Illégitimité inaltérable
Affleurement utopiqueElle guette, le Pli de l’Eau
Sa Pupille,
Reflet boréal
Drogues polairesElle guette, le Désir testamentaire
Sa Main,
Fjord ivre
Assomption minéraleElle guette, la Langue naufragée
Son Nom,
Mouvante précision
Voyages à rebours
Marjorie Micucci
Premiers vers du poème « Elle guette, l’Ombre de la Neige » dont je n’ai pu, malheureusement, reprendre la forme typographique.