10
Posted by alex on Nov 16th, 2008

Il existe des centaines de méthodes pour faire des backups, plusieurs avec rsync. Rsync étant un outil merveilleux et très puissant, dans ce billet je vais vous expliquer une méthode efficace qui économise l'espace disque.

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 :) )
  • Dans un système de fichiers, un simple fichier peut avoir plusieurs noms, ce qu'on appelle des "hardlinks". Cela permet à nos sauvegardes d'avoir chacun un lien vers un fichier identique au lieux de le copier trois fois. Si le fichier change entre les sauvegardes, nous supprimons le hardlink et le fichier modifier prend sa place!

Tout d'abord voici de quoi aurait l'air le script shell:

#!/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 disque dur 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-ci 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 !

La dernière étape est de planifier un cron job pour automatiser les sauvegardes !

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/
10 comments
Commentaires
avatar
Merci pour ce script, je le trouve très intéressant et il répond à pas mal de besoins.
Je vais le tester sur mon serveur, avec un backup sur DD externe.

Par contre, je suis intéressé par la mise à jour avec la sauvegarde sur un serveur distant.
Autre question, comment fais t'on pour recevoir un email pour confirmer que le backup s'est bien fait, ou s'il y a eu des erreurs ?

il y a t'il un risque a backuper tout "/" ainsi ? Est il possible d'excluse de ce backup certains dossiers ? (genre avec un fichier d'exclusion ?

Merci encore !
avatar
alex
Administrateur
Salut Thomas,

Oui tu peux exclure des fichiers avec <code>--exclude</code>, regarde le man de rsync il donne quelques exemples.

Pour envoyer un mail du résultat, tu peux rediriger la sortie de rsync à la commande mail, par exemple à la dernière ligne tu aurais:

<code>/usr/bin/rsync -a --no-o --delete --safe-links $SOURCE $TARGET/backup.0/|mail -s "Backup report" toi@mail.com</code>


Je ne pense pas qu'il y aille de risque à faire une sauvegarde tout le système de fichier, par contre ça peut être très très long :-/
avatar
Hello,

Merci pour ton astuce :)
Je me demandais comment restaurer un backup incrémental fait avec rsync... Avec ce "truc" y'a pas à réfléchir longtemps : on copie direct le bon dossier et hop.
Merci :)
Aurélien
avatar
useful strategies
<strong>very few websites that happen to be detailed below, from our point of view are undoubtedly well worth checking out...</strong>

Here is a Great Blog You Might Find Interesting that we Encourage You...
avatar
Francois Scheurer
Hello

J'ai écrit un shell-script pour faire des backups du filesystem complet avec rsync.
Il utilise des hard links entre les backups (déduplication) afin de permettre a un full backup de prendre aussi peu d'espace disque que s'il avait été un incremental backup.
Il est doté de pleins d'options pratique comme les signature d'intégrité MD5, la protection 'chattr', les règles de filtrage, la gestion de quota disque ou la retention avec distribution exponentielle (rotation des backups en conservant plus de backups récents qu'anciens).


disponible ici: http://blog.pointsoftware.ch/index.php/howto-local-and-remote-snapshot-backup-using-rsync-with-hard-links/
C'est cadeau ! ^^

Cheers
Francois Scheurer
avatar
alex
Administrateur
Bonjour,

J'utilise déjà un script de snapshot assez robuste couplé au merveilleux zfs, cela dit j'aime bien le votre, il semble couvrir toutes les possibilités et de ce que j'ai pu voir il prend en compte plusieurs choses qui peuvent mal se passer. Chattr est en effet un bel ajout!

Si je puis me permettre, des liens de téléchargements seraient plus agréables pour vos scripts. Copier-coller un script au travers de vim ce n'est pas toujours agréable, comparé à un ptit wget!

Merci pour votre lien!
avatar
Francois Scheurer
oui bonne idee je vais mettre les script en fichier download..

ZFS c'est le bonheur! mais zetes sous solaris ou mac?
sous linux on a pas encore zfs il me semble
avatar
alex
Administrateur
Je suis sous linux. Il y a deux drivers disponibles pour linux. De mémoire je crois qu'il y en a un en userland et l'autre est un patch du kernel (ou il est dans le kernel mais marqué expérimental).
Les deux sont décris comment étant incomplets ou instables, mais je n'ai pas rencontré de problème jusqu'à maintenant.
Cela dit je l'utilise seulement sur mon serveur personnel (serveur à faible traffic qui plus est), je n'irais pas jusqu'à mettre mes projets commerciaux sur un zfs.

J'ai pensé à OpenSolaris ou FreeBSD pour mon serveur personnel, histoire d'avoir un petit défis, mais je n'ai jamais pris le temps de le faire!
avatar
Sylvain Marliere
Bonjour,
Une petite précision: le répertoire de sauvegarde précédente doit être absolu, ou relatif au répertoire cible:
--link-dest=/mnt/sda2/backups/backup.1
--link-dest=../backup.1
Donc un chemin relatif au PATH courant (pwd) ne fonctionnera pas !
-Sylvain
avatar
Alex, je n'ai qu'un seul mot :

Félicitations !

Alors, pour les incrédules comme moi, lancez cette commande, et vous comprendrez la justesse de ce script, et la légèreté des sauvegardes :

du -sh /mnt/sda2/backups/backup*
Connectez-vous ou postez en tant qu'invité:
Your Name Your Email


Vérification: 1055
Go to Top