Backup incrémental avec rsync

Il existe des centaines de méthodes pour faire des bakups dont une bonne dizaine avec rsync. Rsync étant un outil merveilleux et très puissant, dans ce billet je vais vous expliquer une méthode que j’aime bien qui l’utilise.

Pour l’exemple on va prendre pour acquis que la sauvegarde se fait tous les jours, mais ça pourrait aussi bien être toutes les semaines, tous les deux jours, etc… Cette méthode permet donc de garder une sauvegarde des trois derniers jours mais sans utiliser trois fois l’espace.

Quelques avantages de cette méthode:

  • On ne copie que les fichiers qui ont changés donc utilisation moindre d’espace et un backup beaucoup plus rapide.
  • On peut remonter trois jours en arrière sans se casser la tête (Souvent les backups incrémentaux garde juste les fichiers qui ont changé, donc pour restaurer un backup on doit tout reconstruire en partant du backup le plus ancien au plus récent…. Nous on va tricher, on va faire semblant que chaque backup est une image complète du dossier source :) )

Tout d’abord voici de quoi aurait l’air le script bash:

#!/bin/sh
TARGET=/mnt/sda2/backups
SOURCE=/home/
/bin/rm -Rf $TARGET/backup.2
/bin/mv $TARGET/backup.1 $TARGET/backup.2
/bin/mv $TARGET/backup.0 $TARGET/backup.1
/usr/bin/rsync -a --no-o --delete --safe-links --link-dest=$TARGET/backup.1 $SOURCE $TARGET/backup.0/

Explication:

SOURCE est le dossier que vous désirez sauvegarder.

TARGET est la destination des sauvegardes (de préférence un disquedur différent ou, au moins, une partition différente).

Dans le dossier $TARGET vous devez créer trois dossiers: backup.0, backup.1 et backup.2. Ceux si contiendront vos sauvegardes d’aujourd’hui, d’hier et d’avant hier respectivement.

Le script commence par supprimer le dossier backup.2 qui est le plus ancien backup. Il décale les autres dossiers afin de pouvoir créé un nouveau backup.0, c’est à dire le plus récent (aujourd’hui).

La magie se passe dans la dernière ligne. Rsync va scanner le dossier source en le comparant avec la sauvegarde du jour précédent (–link-dest=$TARGET/backup.1). Il va vérifier tous les fichiers trouvés dans le répertoire source et les comparer avec ceux du jour précédent, backup.1. Lorsqu’il trouve un fichier qui a changé depuis la dernière sauvegarde, il le copie dans backup.0. Par contre, et c’est là toute la beauté de la chose, si le fichier n’a PAS changé, il va créé un lien dur vers le fichier se trouvant dans la sauvegarde d’hier.

De cette façon chaque dossier de sauvegarde backup.0, backup.1 et backup.2 seront des images “complètes” de votre dossier source, mais les fichiers identiques entre les sauvegardes seront stoqués une seule fois sur le disque !

Et voila c’est tout, vous n’avez plus qu’à planifier un cron pour que le script se lance tous les jours à la même heure ! La prochaine fois je vous expliquerai comment faire ça mais en stockant le backup sur un serveur distant, parce que après tout, c’est pour ça que rsync a été conçu au départ ;)

Note: Si vous utilisez une vielle version de rsync, il se peut que l’argument –link-dest n’existe pas ou soit brisé, voici donc une version alternative. Cette version va dupliquer la journée d’hier (en créant des liens durs, pas des copies) et ensuite rsync va simplement synchroniser ça avec la version actuelle. Ça revient exactement au même résultat que l’autre script, mais beaucoup moins efficace en terme de vitesse:
#!/bin/sh
TARGET=/mnt/sda2/backups
SOURCE=/home/
/bin/rm -Rf $TARGET/backup.2
/bin/mv $TARGET/backup.1 $TARGET/backup.2
cp -al $TARGET/backup.0 $TARGET/backup.1
/usr/bin/rsync -a --no-o --delete --safe-links $SOURCE $TARGET/backup.0/

Leave a Reply