2008-10-26-ean
Backup et restauration de configuration (etc) avec svn (subversion)
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).
etape 1: identification des fichiers e 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 e sauvegarder égallement /usr/local/etc, ou les fichiers de configuration de votre /home par exemple.
etape 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".
etape 3: création du working directory
Le working directory sera le dossier e sauvegarder. Ici pour l'exemple nous prendrons "/etc".
$ cd /etc $ svn co file:///var/opt/svn/backup . Revisie³n obtenida: 0
Notre repository étant vide cela nous a juste crée un dossier .svn a la racine du dossier /etc.
etape 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 egallement specifier uniquement les fichiers/dossiers e 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 ajoutes.
Pour valider les modifications, commit suffit:
$ cd /etc $ svn commit
Votre editeur de texte apparait 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 revision 1.
Vous remarquez par la suite que dans chaque sous dossier de votre arborescence s'est cree un dossier .svn.
Votre systeme de backup est presque pret.
etape 4: ignorer certains fichiers
Dans le cas ou vous ne voulez sauvegarder que certains fichiers, il faut specifier e SVN de ne pas traiter les autres elements.
$ cd /etc $ svn propedit svn:ignore .
Votre editeur de texte s'ouvre alors. Vous devez entre un nom de dossier/fichier par ligne.
Pour verifier que vous n'avez rien oublie:
$ cd /etc $ svn status
Vous ne devez alors aucun ligne commençant par "?".
etape 5: auto-mise e jour du backup
SVN va detecter 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 detecte un changement au niveau du fichier resolv.conf: le "M" indique que ce fichier a ete modifie.
Nous pouvons alors auto-accepter ces modifications via un commit.
etape 6: monitoring des modifications
Afin de verifier les modifications de votre systeme, 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 repertoire (ajout de fichiers, ajout de dossiers, conflits, etc...)
Recuperation de la sauvegarde (au besoin)
Comme une sauvegarde n'est rien si elle n'est pas externalisee, voici la commande pour recuperer l'image du svn.
$ svnadmin dump /var/opt/svn/backup | bzip2 -c -9 >repos_svn.bz2
Vous recupererez alors un fichier compresse contenant l'ensemble des versions des fichiers, que vous pouvez externaliser comme bon vous semble.
Pour recuperer la sauvegarde apres un crash par exemple:
$ bunzip2 repos_svn.bz2 | svn load /var/opt/svn/backup
En esperant que vous n'ayez pas à utiliser la recuperation. Ce n'est jamais tres bon signe lorsque l'on doit l'utiliser :)