Bien que de nombreux tutoriels sont déjà
présents sur internet,
j'ai décidé d'en écrire un aujourd'hui résumant les étapes à suivre
pour monter un système de backup en utilisant subversion (svn).
Étape 1: identification des fichiers à sauvegarder
SVN
est un système de gestion de versions, permettant de sauvegarder des
fichiers par modifications. On peut ainsi obtenir différentes versions
d'un fichier, à un instant donné.
Par défaut les fichiers de
configurations se situent dans /etc, mais il se peut que pour vos
besoins personnels, vous ayez à sauvegarder égallement /usr/local/etc,
ou les fichiers de configuration de votre /home par exemple.
Étape 2: création d'un repository
Après avoir installé svn sur votre système, nous allons créer un repository du nom de "backup".
$ svnadmin create /var/opt/svn/backup
Cette commande va crée le dossier /var/opt/svn/backup, ainsi que les sous-dossiers "conf", "db", "format" et "locks".
Utilisant
subversion en local sur notre machine, nous n'aurons pas besoin ici de
configurer le serveur. Aucun besoin donc de modifier le fichier de
configuration conf/svnserve.conf.
Aucun besoin non plus de lance le serveur "svnserve".
Étape 3: création du working directory
Le working directory sera le dossier à sauvegarder. Ici pour l'exemple nous prendrons "/etc".
$ cd /etc
$ svn co file:///var/opt/svn/backup .
Revisión obtenida: 0
Notre
repository étant vide cela nous a juste crée un dossier .svn a la racine du dossier /etc.
Étape 3: ajout des dossiers et fichiers de configuration
Nous allons par la suite ajouter les fichiers et dossiers au
repository, pour qu'ils soient pris en compte par svn.
On peut égallement spécifier uniquement les fichiers/dossiers à sauvegarder.
$ cd /etc
$ svn add *
ou
$ svn add -N apache2 && svn add -apache2/conf
Des dizaines de lignes apparaissent alors, vous indiquant les dossiers et fichiers ajoutés.
Pour valider les modifications,
commit suffit:
$ cd /etc
$ svn commit
Votre éditeur de texte apparaît alors, vous demandant d'entrer un
message. Entrez le texte de votre choix (du genre "Fichiers initiaux"),
enregistrez les modifications et sortez.
$ svn commit
Transmitiendo contenido de archivos .................
Commit de la revisión 1.
Vous remarquez par la suite que dans chaque sous dossier de votre arborescence s'est crée un dossier .svn.
Votre système de backup est presque prêt.
Étape 4: ignorer certains fichiers
Dans le cas ou vous ne voulez sauvegarder que certains fichiers, il faut spécifier à SVN de ne pas traiter les autres éléments.
$ cd /etc
$ svn propedit svn:ignore .
Votre éditeur de texte s'ouvre alors. Vous devez entre un nom de dossier/fichier par ligne.
Pour vérifier que vous n'avez rien oublié:
$ cd /etc
$ svn status
Vous ne devez alors aucun ligne commençant par "?".
Étape 5: auto-mise à jour du backup
SVN va détecter pour chaque fichier si des modifications ont eu lieue, et vous permettre de modifier votre sauvegarde.
$ svn status
M resolv.conf
Nous remarquons que svn a détecté un changement au niveau du fichier resolv.conf: le "M" indique que ce fichier a été modifié.
Nous pouvons alors auto-accepter ces modifications via un
commit.
Étape 6: monitoring des modifications
Afin de vérifier les modifications de votre système, je vous propose un petit script:
#!/bin/sh
# Variables
#SVNPATH="/usr/local/etc /etc"
SVNBIN=/usr/local/subversion1.4.6/bin/svn
SVNADMINBIN=/usr/local/subversion1.4.6/bin/svnadmin
SVNLOOK=/usr/local/subversion1.4.6/bin/svnlook
SVNREP_PATH=/var/opt/svn/backup/
BACKUP=/var/backup/backup/svn.bz2
SVNPATH="/etc /usr/local"
SVNLOG="/var/log/backupsvn.log"
#Check svn status
for currentpath in $SVNPATH
do
COUNT=`$SVNBIN status $currentpath|egrep -c -v ^[MAD]`
if [ $COUNT -gt 0 ]
then
echo "(ERREUR?): $COUNT fichiers/dossiers differents de (Modifie, Ajoute, Supprime) dans $currentpath... verifier a la main le repertoire! "|mail votre@mail.com -s "Update configuration $currentpath"
echo "`date`: $COUNT modifications dans $currentpath" >> $SVNLOG
else
COUNT=`$SVNBIN status $currentpath|wc -l`
if [ $COUNT -gt 0 ]
then
echo "`date`: Commit des modifications: $COUNT modifications aportees" >> $SVNLOG
$SVNBIN commit $currentpath -m "Update `date`" >> $SVNLOG
$SVNADMINBIN dump $SVNREP_PATH | bzip2 -c -9 > $BACKUP
chmod 400 $BACKUP
LASTREV=`$SVNLOOK youngest $SVNREP_PATH`
# Envoi de l'email
echo "Modifications rencontrees dans $currentpath:
Liste des modifiations:
`$SVNLOOK changed $SVNREP_PATH -r $LASTREV`
Liste detaillee des diferences:
`$SVNBIN diff $currentpath -r $(($LASTREV - 1)) --diff-cmd /usr/bin/diff -x "-y --suppress-common-lines"`
"|mail votre@mail.com -s "Update configuration $currentpath"
else
echo "`date`: Aucune modification dans $currentpath" >> $SVNLOG
fi
fi
done
Vous pouvez alors mettre ce script dans votre cron. Ce script
auto-valide les modifications de fichiers, mais vous avise de
modifications autres dans le répertoire (ajout de fichiers, ajout de
dossiers, conflits, etc...)
Récuperation de la sauvegarde (au besoin)
Comme une sauvegarde n'est rien si elle n'est pas externalisée, voici la commande pour récupérer l'image du svn.
$ svnadmin dump /var/opt/svn/backup | bzip2 -c -9 >repos_svn.bz2
Vous
récupérerez alors un fichier compressé contenant l'ensemble des
versions des fichiers, que vous pouvez externaliser comme bon vous
semble.
Pour récupérer la sauvegarde après un crash par exemple:
$ bunzip2 repos_svn.bz2 | svn load /var/opt/svn/backup
En espérant que vous n'ayez pas à utiliser la récupération. Ce n'est jamais très bon signe lorsque l'on doit l'utiliser :)