Sauvegarde journalisée de votre machine avec RSnapShot
Suite à un commentaire de Xavier sur un de mes billets, je me suis penché sur l'utilisation de RSnapshot. Ce logiciel libre permet d'automatiser une sauvegarde journalisée de vos machines et ceci localement comme à distance.
RSnapShot est disponible dans la plupart des dépôts des distributions GNU/Linux et *BSD. Nous allons illustrer cet article avec une installation et une configuration de RSnapShot sur un serveur Gandi sous Ubuntu 10.04 LTS.
Installation de RSnapShot
On utilise la version disponible dans les dépôts officiel:
sudo aptitude install rsnapshot
Configuration de RSnapShot
L'ensemble de la configuration est centralisé dans le fichier /etc/rsnapshot.conf.
sudo vi /etc/rsnapshot.conf
Attention à la syntaxe dans ce fichier, RSnapShot est assez pointilleux. Il veut que tout les répertoires finissent par un / et des tabulations entre chaque variables.
Les variables importantes à configurer sont les suivantes:
snapshot_root /.snapshots/
La variable snapshot_root permet de configurer le répertoire racine ou les sauvegardes seront stockées. Ce répertoire peut être sur le même disque que le disque système (c'est le cas de la configuration par défaut avec l'utilisation du répertoire /.snapshots/).
Je vous conseille pour ma part d'utiliser si possible un répertoire stocké sur un deuxième disque physique. Par exemple sur mon serveur Gandi, j'ai un deuxième disque qui est monté sur le répertoire /srv/backup. Je vais donc configurer la variable à /srv/backup/snapshots/ (noter le / à la fin du répertoire !).
Exemple: snapshot_root /srv/backup/snapshots/
cmd_ssh /path/to/ssh
Si vous voulez utiliser les fonctions de sauvegarde de serveur distant (en utilisant le protocole SSH), il faut dé-commenter la ligne précédente. Si vous avez besoin de passer des arguments spécifique à SSH, il faudra compléter la ligne ssh_args.
Exemple: cmd_ssh /usr/bin/ssh
interval monthly 3
Activation de la sauvegarde mensuelle (désactivé par défaut).
On passe ensuite aux variables permettant de configurer ce que l'on veut sauvegarder.
Sauvegardes locales
On parle ici d'une sauvegarde journalisée de répertoires de la machine ou RSnapShot est installé.
backup /home/ localhost/
Le répertoire /home/ sera sauvegardé dans le sous répertoire $snapshot_root/localhost/.
Exemple:
backup /home/ localhost/
backup /etc/ localhost/
backup /var/svn/ localhost/
Sauvegardes distantes
On peut également sauvegarder des répertoires de machines distantes. On utilise pour cela la configuration suivante:
?backup root@example.com:/etc/ example.com/ +rsync_long_args=--bwlimit=1024,exclude=core
On va ainsi sauvegarder le répertoire /etc/ de la machine exemple.com en utilisant une connexion SSH avec l'utilisateur root (il faut bien sur que la connexion SSH entre votre machine exécutant RSnapShot et example.com soit automatisée). En bonus on demande à RSnapShot de ne pas sauvergarder les fichiers core (exclude=core) et de limiter la bande passante à 1 Mbps (--bwlimit=1024).
Sauvegardes en utilisant des scripts
Une autre fonctions intéressantes de RSnapShot est la possibilité d'utiliser des script shell pour automatiser des sauvegardes un peu plus complexes.
Par exemple imaginons que l'on veuillent sauvegarder les données de son serveur SVN. On commence par créer le script shell /usr/local/bin/backup-svn.sh:
#!/bin/sh
# Backup SVN
svnrepo="/var/svn/"
for i in `ls $svnrepo`
do
svnadmin -q dump $svnrepo/$i > $i.svndump
gzip -f $i.svndump
rm $i.svndump
done
Puis on le rend exécutable:
sudo chmod a+x /usr/local/bin/backup-svn.sh
Enfin on configure RSnapShot:
backup_script /usr/local/bin/backup-svn.sh localhost/svn/
Le script backup-svn.sh va être lancé à partir du répertoire localhost/svn/
Il est bien sur possible de faire des scripts pour d'autres besoins: sauvegarde de bases de données MySQL par exemple.
Utilisation de RSnapShot
On commence par valider le fichier de configuration:
sudo rsnapshot configtest
Syntax OK
Simulation d'une sauvegarde journalière (cela va afficher ce que RSnapShot va faire mais sans le faire...):
sudo rsnapshot -t hourly
echo 3531 > /var/run/rsnapshot.pid
mkdir -m 0700 -p /srv/backup/snapshots/
mkdir -m 0755 -p /srv/backup/snapshots/hourly.0/
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded /home \
/srv/backup/snapshots/hourly.0/localhost/
mkdir -m 0755 -p /srv/backup/snapshots/hourly.0/
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded /etc \
/srv/backup/snapshots/hourly.0/localhost/
mkdir -m 0755 -p /srv/backup/snapshots/hourly.0/localhost/
mkdir -m 0755 -p /srv/backup/snapshots/tmp/
cd /srv/backup/snapshots/tmp/
/home/nicolargo/bin/backup-svn.sh
cd /home/nicolargo/
sync_if_different("/srv/backup/snapshots/tmp/", \
"/srv/backup/snapshots/hourly.0/localhost/svn/")
mkdir -m 0755 -p /srv/backup/snapshots/hourly.0/
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \
--exclude=core --bwlimit=1024 --rsh=/usr/bin/ssh \
nicolargo@exemple.com:/home /srv/backup/snapshots/hourly.0/sam/
mkdir -m 0755 -p /srv/backup/snapshots/hourly.0/
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \
--exclude=core --bwlimit=1024 --rsh=/usr/bin/ssh \
nicolargo@exemple.com:/etc /srv/backup/snapshots/hourly.0/sam/
touch /srv/backup/snapshots/hourly.0/
Test en ligne de commande:
sudo rsnapshot hourly
Le répertoire contenant la première sauvegarde devrait être créé sous /srv/backup/snapshots/hourly.0.
Enfin on automatise le lancement en éditant la crontab système (root):
sudo crontab -e -u root
0 */4 * * * /usr/bin/rsnapshot hourly
30 23 * * * /usr/bin/rsnapshot daily
0 23 * * 0 /usr/bin/rsnapshot weekly
30 22 28 * * /usr/bin/rsnapshot monthly
Pour une liste exhaustive des fonctions proposées par RSnapShot, je vous conseille la lecture de la documentation officielle (en Anglais).
Et voili, merci encore à Xavier pour cette belle découverte.