Depuis quelques temps, nous cherchions une solution de sauvegarde incrémentale des données de nos hébergés.
Après avoir testé de nombreux scripts basiques, des sauvegardes « brutes » directement sur ftp, nous avons conclu que cela s’avérait relativement peu fiable, et souple.
Mais depuis le 28 septembre, un nouveau script est en place et répond parfaitement à la tâche !
Dans nos recherches, nous sommes tombé sur ce site qui proposait un petit script écrit en BASH permettant de créer une ou plusieurs sauvegardes par jour, le tout en minimisant l’espace grâce à l’utilisation des inodes, plutôt que de copier bêtement les fichiers.
Pour simplifier, plutôt que de copier simplement le fichier, il fait un « lien » hard vers celui-ci. Si le fichier venait à être supprimé depuis la première sauvegarde, il ne le serait pas réellement car un autre lien l’utilise.
Ainsi, on se retrouve avec plusieurs liens pour le même fichier.
Nous avons adapté celui-ci afin qu’il ne puisse fonctionner une seule fois simultanément par l’ajout d’un .lock.
Ce .lock est créé au début de l’exécution du script et supprimé à la fin.
Si une autre instance tombe dessus, cela veut dire que le premier script n’a pas terminé son exécution.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #!/bin/sh # Source du backup # Notez ici, qu'il est possible de faire un backup distant, il suffit simplement de faire de la manière suivante : # SRV=utilisateur@serveur:/dossier/a/copier SRC=/vz/private/103/var/www/web # Destination du backup DST=/var/backups/103/web # Date de la forme année-mois-jour-timestamp # (le timestamp %s sert si on veut faire plusieurs sauvegardes dans la même journée) DATE=`date +%Y-%m-%d_%H-%M-%S_%s` if [ -e $DST/web.lock ]; then echo "Sauvegarde deja lancée" exit 0; fi touch $DST/web.lock # Création du répertoire temporaire mkdir $DST/tmp echo "Backup commencé le "`date "+%d/%m/%Y à %T"` echo "Starting : "`date "+%Y-%m-%d %T"` >> $DST/log echo "Copie de la dernière sauvegarde..." # Si une sauvegarde a déjà été faite précédemment if test -d $DST/today ; then # Et si le fichier contenant la date de la dernière sauvegarde existe if test -f $DST/last_date ; then LASTDATE=`cat $DST/last_date` # Alors on fait un copie en hardlinks de la sauvegarde d'hier cp -al $DST/today $DST/tmp/ # Puis on renomme la copie pour qu'elle devienne la sauvegarde d'hier mv $DST/tmp/today $DST/$LASTDATE fi # Sinon, on crée le premier dossier else mkdir $DST/today fi rm -rf $DST/tmp # On sauvegarde la date actuelle pour le prochain backup echo $DATE > $DST/last_date echo "Synchronisation de la sauvegarde du jour..." # Synchronisation de la source avec le dossier du jour rsync -az --delete --size-only $SRC/ $DST/today/ rm $DST/web.lock echo "Backup terminé le "`date "+%d/%m/%Y à %T"` echo "Done : "`date "+%Y-%m-%d %T"` >> $DST/log |
Le script ci-dessus génère le résultat suivant :
lisa:/var/backups/103/web# l total 752 drwxr-xr-x 2794 9500 9500 94208 sep 17 12:05 2009-09-28_20-52-59_1254163979 drwxr-xr-x 2794 9500 9500 94208 sep 17 12:05 2009-09-28_22-12-40_1254168760 drwxr-xr-x 2794 9500 9500 94208 sep 17 12:05 2009-09-28_23-30-02_1254173402 drwxr-xr-x 2794 9500 9500 94208 sep 17 12:05 2009-09-29_00-01-01_1254175261 drwxr-xr-x 2794 9500 9500 94208 sep 17 12:05 2009-09-29_06-01-01_1254196861 drwxr-xr-x 2794 9500 9500 94208 sep 17 12:05 2009-09-29_12-01-01_1254218461 drwxr-xr-x 2794 9500 9500 94208 sep 17 12:05 2009-09-29_18-01-01_1254240061 -rw-r--r-- 1 root root 31 sep 30 00:17 last_date -rw-r--r-- 1 root root 464 sep 30 00:24 log drwxr-xr-x 2794 9500 9500 69632 sep 17 12:05 today
Vous pouvez voir le dossier « today », qui contient la dernière sauvegarde ainsi que la date exacte et le timestamp pour les sauvegardes précédentes.
Attention, toutefois ce script ne supprime pas les anciennes sauvegardes, il faut le faire à la main (ou coder la fonction, ce que je ferai prochainement
)
Cependant, le fait de faire des liens hard vous économisera au final une place non négligeable.
Exemple : Actuellement, nos données web pèsent 70Go, et pour 8 sauvegardes nous utilisons 75Go d’espace.
Au niveau du temps de copie, la première sauvegarde est longue, mais les suivantes sont plus rapide. Nous avons besoin de 14 minutes (pour les 70Go), le temps de créer l’ensemble des liens hard, et de rapatrier les nouvelles données.
En espérant que ce script puisse vous servir à vous aussi ![]()
Merci à Skreo pour le script original.

