Sauvegarder automatiquement ses données sous Gnu Linux avec rdiff-backup

Ce tutoriel décrit les étapes nécessaires pour automatiser la sauvegarde de vos données importantes grâce à l’outil rdiff-backup. Les sauvegardes se font à travers le réseau via le protocole sécurisé SSH, personne ne sera donc en mesure d’intercepter vos fichiers car tout sera chiffré. rdiff-backup fait des sauvegardes incrémentales, c’est-à-dire qu’il ne sauvegarde que les fichiers qui ont été créés, modifiés ou supprimés depuis la dernière sauvegarde, ce qui permet de ne transférer que le strict minimum. rdiff-backup va permettre de récupérer un fichier tel qu’il était à un temps donné.

Principe

Pour effectuer les sauvegardes à travers le réseau, il faut disposer d’un compte sur la machine distante. Pour automatiser ces sauvegardes, il faudra utiliser cron et disposer d’une paire de clés sans phrase secrète afin qu’il ne soit pas nécessaire d’être présent devant l’écran au moment de la sauvegarde. Sans phrase secrète, votre clé privée peut alors être utilisée par quiconque la trouverait, donc il faut faire très attention à ne pas vous la faire voler. Vous pourriez utiliser ssh-agent et keychain pour éviter cela, il faudrait alors saisir la phrase secrète à chaque démarrage de la machine, mais ce ne sera pas le sujet du jour.

Pour tout le tutoriel, on nommera les machines home.mydomain.com et backup.mydomain.com qui sont respectivement la machine à sauvegarder et la machine recevant les sauvegardes. rdiff-backup doit être installé à la fois sur la machine home et sur la machine backup. Les deux machines doivent disposer d’un serveur et d’un client SSH.

Syntaxe de la commande rdiff-backup

rdiff-backup [options] [[[user@]host1.foo]::source_directory] [[[user@host2.foo]::destination_directory]

Bien qu’on puisse lancer cette commande d’un côté comme de l’autre, on l’exécutera depuis la machine à sauvegarder. Ici, on sauvegarde le répertoire /home/me de la machine locale home vers le répertoire /home/me/backup/home de la machine backup. L’option -v5 permet de voir l’avancement de la sauvegarde, pratique lorsqu’on fait une sauvegarde de taille importante. Le répertoire /home/me/backup de la machine backup doit exister avant de lancer la sauvegarde.

rdiff-backup -v5 /home/me me@backup.mydomain.com::/home/me/backup/home

Le me situé juste avant le caractère @ est le login de la machine backup. À l’exécution de cette commande, le mot de passe associé est demandé, ceci n’est pas très pratique surtout lorsque l’on souhaite automatiser tout ça, on n’est pas toujours devant son écran au moment de sauvegarder…

Création d’une paire de clés

On va donc ici créer une paire de clés RSA de 4096 bits sans phrase secrète depuis la machine home. Lorsque le programme nous demande de saisir une phrase secrète, on la laisse vide. La clé privée sera nommée backup_key et la clé publique backup_key.pub. Vous pouvez distribuer votre clé publique à qui vous voulez, par contre, vous devez garder secrète la clé privée.

ssh-keygen -b 4096 -t rsa -f ~/.ssh/backup_key

On ne conservera la clé privée backup_key que sur la machine home, elle sera située dans le répertoire ~/.ssh de l’utilisateur qui lancera la sauvegarde (surtout pas root). Depuis home, on installera la clé publique sur backup via la commande suivante :

ssh-copy-id -i ~/.ssh/backup_key.pub me@backup.mydomain.com

Ceci aura pour effet d’ajouter la clé publique au fichier /home/me/.ssh/authorized_keys de la machine backup. Ceci permet donc d’autoriser la connexion au compte me@backup.mydomain.com grâce à la clé privée backup_key.

Il est maintenant possible de se connecter en SSH sur backup avec le login me sans avoir à saisir le moindre mot de passe, simplement en tapant la commande suivante :

ssh -i ~/.ssh/backup_key me@backup.mydomain.com

Simplification de la connexion via SSH

C’est bien tout ça, mais rdiff-backup ne connait pas l’option -i de ssh, il va donc falloir modifier la configuration du client SSH. On crée donc le fichier ~/.ssh/config sur home et on y ajoute les lignes suivantes :

Host backup
User me
HostName backup.mydomain.com
Port 22
IdentityFile ~/.ssh/backup_key
Protocol 2

On donne les autorisations adéquates via :

chmod 600 ~/.ssh/config

On vient ainsi de créer un alias de connexion. Maintenant, au lieu de taper la longue commande ssh -i ~/.ssh/backup_key me@backup.mydomain.com on peut se contenter d’un simple ssh backup. Dorénavant, on pourra lancer notre sauvegarde simplement et sans mot de passe de cette manière :

rdiff-backup -v5 /home/me backup::/home/me/backup/home

Lancer la sauvegarde régulièrement

Maintenant, il ne reste plus qu’à lancer automatiquement votre sauvegarde. Pour cela, il suffit de créer un dossier ~/cron où on placera notre script. Il s’agit d’une préférence personnelle, vous pouvez bien sûr le mettre où bon vous semble. On appellera ce script backup.sh. On y ajoutera les lignes suivantes :

#!/bin/bash

BACKUP_HOST=backup
BACKUP_DIR=/home/me/backup

# création du répertoire de sauvegarde.
ssh ${BACKUP_HOST} "mkdir -m 700 -p ${BACKUP_DIR}"

# sauvegarde du /home/me vers vers le serveur de sauvegarde.
rdiff-backup -v5 /home/me ${BACKUP_HOST}::${BACKUP_DIR}/home

# ajoutez d'autres sauvegardes ici, si nécessaire.

Rendez le script de sauvegarde exécutable :

chmod 700 ~/cron/backup.sh

Ouvrez le planificateur de tâches, cron.

crontab -e

Cette commande ouvre un éditeur de texte. Il est possible de changer cet éditeur par défaut en faisant un export VISUAL=vim dans votre ~/.bash_profile. Il suffit alors, pour effectuer la sauvegarde toutes les nuits à 5h00 du matin, d’ajouter le texte suivant :

0 5 * * * /home/me/cron/backup.sh

Enregistrez et quittez, la sauvegarde est en place.

Restaurer les données sauvegardées

On a pu effectuer notre sauvegarde, c’est bien. Ce serait encore mieux si on était capable de récupérer les données sauvegardées en cas de problème, non ? Il faut savoir que rdiff-backup garde une copie exacte de la dernière sauvegarde dans le dossier de destination spécifié, dans notre cas backup::/home/me/backup/home. Un sous-répertoire nommé rdiff-backup-data contient des informations propres à rdiff-backup, notamment les incréments. Ces incréments permettent, à partir de la copie exacte, de revenir aux versions antérieures.

Lister les incréments et leur contenu

Combien y a t’il actuellement d’incréments dans notre sauvegarde ? La liste de ces incréments peut être utile dans le cas où l’on souhaite récupérer un fichier à une date donnée.

rdiff-backup --list-increments backup::/home/me/backup/home
Found 4 increments:
increments.2009-11-27T18:18:39+01:00.dir Fri Nov 27 18:18:39 2009
increments.2009-11-27T18:20:29+01:00.dir Fri Nov 27 18:20:29 2009
increments.2009-11-27T18:21:01+01:00.dir Fri Nov 27 18:21:01 2009
increments.2009-11-27T18:21:47+01:00.dir Fri Nov 27 18:21:47 2009
Current mirror: Fri Nov 27 18:22:40 2009

On peut alors lister les fichiers présents à un incrément donné, par exemple celui daté 2009-11-27T18:21:01+01:00.

rdiff-backup --list-at-time 2009-11-27T18:21:01+01:00 backup::/home/me/backup/home
.
cron
cron/backup.sh
my_file.txt
...

Ou bien il y a 5 jours (5D).

rdiff-backup --list-at-time 5D backup::/home/me/backup/home

On peut lister les fichiers qui ont changé durant les 5 derniers jours.

rdiff-backup --list-changed-since 5D backup::/home/me/BACKUP/home

On peut également comparer notre dossier à sauvegarder avec sa version sauvegardée pour savoir s’il y a des différences.

rdiff-backup --compare /home/me backup::/home/me/backup/home

Récupérer une version particulière

Comme dit précédemment, il est possible de récupérer un fichier tel qu’il était à un temps donné. Pour récupérer simplement la dernière version de notre sauvegarde, il suffit de faire :

rdiff-backup --restore-as-of now backup::/home/me/backup/home /tmp/home

Le tout est alors copié dans /tmp/home.

On peut également ne récupérer qu’un fichier plutôt que la sauvegarde complète.

rdiff-backup --restore-as-of now backup::/home/me/backup/home/my_file.txt /tmp/home/my_file.txt

Ou encore, récupérer le contenu de la sauvegarde à une date donnée, il y a 10 jours par exemple.

rdiff-backup --restore-as-of 10D backup::/home/me/backup/home /tmp/home

Faire un peu de ménage

Chaque incrément occupe de la place. Si vous n’avez plus besoin des incréments anciens, vous pourrez libérer de l’espace disque. Pour supprimer les incréments ayant plus d’un an d’ancienneté, il suffit de lancer cette commande.

rdiff-backup --force --remove-older-than 1Y backup::/home/me/backup/home

Notez qu’un fichier existant qui n’a jamais changé depuis le début sera toujours présent dans la sauvegarde. Par contre, si un fichier a été supprimé il y a un an et un jour, il ne sera plus possible de le restaurer puisqu’on n’aura conservé que les incréments datant de moins d’un an…

Conclusion

Voilà, votre sauvegarde automatique est en place. Consultez de temps en temps l’espace disponible sur le serveur de sauvegarde et lisez les journaux que cron vous enverra dans votre boite mail, consultable via la commande mail afin de déceler d’éventuelles erreurs.