tfe Homepage

26/10/2008

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).
 

e‰tape 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.

 

 

e‰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".

 

 

 

e‰tape 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.

 

 

 

e‰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 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.

 

 

 

e‰tape 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 "?".

 

 

e‰tape 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.

 

 

e‰tape 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 :)