11 juin 2009
Script de sauvegarde type snapshot
Il y a de cela un petit moment j’avais publié le script de sauvegarde que j’utilisais. Celui-ci propose un menu afin de choisir quoi sauvegarder. Je le trouvais plus souple pour des sauvegardes ponctuelles, faîtes à la main. Depuis il a évolué, il s’est simplifié. Bien que je l’utilise toujours, j’ai décidé de mettre en place un script plus automatisé côté serveur (clavicogyre est en général lancé depuis la station) et qui me donne une sauvegarde plus globale de type snapshot, un peu à la manière de Time Machine sur Mac – sans l’aspect graphique.
Le principe
Le principe n’est pas nouveau, il s’agit de faire une sauvegarde rsync avec les options récursifs (-r), archives (-a) et suppression (–delete) dans un répertoire current. Lorsque la tâche est terminée, on fait une copie cp avec les options liens durs (-l) et archives (-a) du contenu de current au même niveau vers un répertoire qui porte la date du jour. Et voilà. Lors de la prochaine sauvegarde, rsync va ajouter les nouveaux fichiers, mettre à jour ceux modifiés et supprimer ceux qui ont été supprimés dans current. L’historisation dans les répertoires avec la date permet de remonter vers différentes versions d’un fichier quant au répertoire current, il dispose toujours de l’image à jour des fichiers.
Le script
Voici le script que j’utilise :
#!/bin/bash #====================================================================== # snapshot_backup.sh - Script de sauvegarde de type snapshot #====================================================================== # by fabien a. [fabien@feub.net] # http://werk.feub.net/ #====================================================================== # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, # - write to the Free Software # Foundation, Inc., # 51 Franklin Street, # Fifth Floor, # Boston, MA 02110-1301 # USA. # - See http://www.gnu.org/licenses/gpl.html #====================================================================== #====================================================================== # VARIABLES #====================================================================== SOURCE="/rep/source/" CIBLE="/rep/cible/" DATE=`date +%Y%m%d-%H%M` LOG="/rep/du/log/snapshot_rsync-${DATE}.log" REP_A_SVG="etc usr bin home" MAIL_DEST="toto@tata.net" MAIL_SUBJECT="[snapshot] du `date +%D` à `date +%H:%M` " VER="0.9" #====================================================================== # EXECUTION #====================================================================== echo "======================================================================" | tee -a $LOG echo "snapshot_backup.sh v.$VER" | tee -a $LOG echo "http://werk.feub.net/" | tee -a $LOG echo "----------------------------------------------------------------------" | tee -a $LOG #====================================================================== # SYNCHRONISATION #====================================================================== echo "Début de la sauvegarde le `date +%D` à `date +%H:%M` " | tee -a $LOG echo "----------------------------------------------------------------------" | tee -a $LOG for REP in $REP_A_SVG ; do echo " * Sauvegarde de $REP" | tee -a $LOG rsync -vrap --delete ${SOURCE}$REP $CIBLE/current | tee -a $LOG done; echo "----------------------------------------------------------------------" | tee -a $LOG #====================================================================== # SNAPSHOT #====================================================================== cp -val $CIBLE/current $CIBLE/$DATE | tee -a $LOG echo "Fin de la sauvegarde le `date +%D` à `date +%H:%M` " | tee -a $LOG echo "======================================================================" | tee -a $LOG #====================================================================== # ENVOI EMAIL LOG #====================================================================== /bin/mail -s "$MAIL_SUBJECT" $MAIL_DEST < $LOG wait exit 0
Cette technique permet d’avoir des sauvegardes historisées tout en gagnant beaucoup de place grâce aux copies en liens durs (hardlinks).
salut.
merci pour le bout de code.
comment vas tu depuis le temps.