Konk_Gwin

Mettre en place une sauvegarde incrémentale avec rsync

Citation finale de:
Logiciels évoqués:

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
Figure 1 : Synchronisation unidirectionnelle avec rsync

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 :

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.

Figure 2 : Redirection de la sortie d'erreur standard de rsync vers un fichier

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 >>.

Figure 3 : Organigramme du programme de synchronisation avec suppression automatique du fichier d'anomalies lorsqu'il est vide

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 ».

Figure 4 : Organigramme du programme de synchronisation en fonction du jour de la semaine

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 utopique

Elle guette, le Pli de l’Eau
Sa Pupille,
Reflet boréal
Drogues polaires

Elle guette, le Désir testamentaire
Sa Main,
Fjord ivre
Assomption minérale

Elle 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.


Menu