Table des matières

Rsnapshot

Description

rsnapshot est un outil de sauvegarde basé sur rsync. Grâce à rsnapshot, il est possible de prendre des instantanés de vos systèmes de fichiers à différents instants. Utilisant les liens durs, rsnapshot créé l’illusion de l’existance de multiples sauvegardes complétes, tout en n’occupant que la place d’une seule plus les différences. Couplé avec ssh, il est également possible de prendre des instantanés de systèmes de fichiers distants. Ce document est un tutoriel d’installation et de configuration de rsnapshot.

rsnaphost est écrit en Perl et dépends de rsync. OpenSSH, GNU cp et le programme BSD logger sont également recommandés mais pas necessaires. Tous ceux-ci devraient être présents sur la plupart des systèmes Linux. rsnapshot est écrit avec le plus petit dénomitateur commun en tête. Au minimum il ne requiert que Perl 5.0004 et rsync. Ceci fait qu’il fonctionne sur quasiment n’importe quel système UNIX vous voudrez l’installer. Il a été testé avec succès avec Perl 5.0004 à 5.8.2, sur Debian, Redhat, Fedora, Solaris, Mac OS X, FreeBSD, OpenBSD, et IRIX.

source: http://www.rsnapshot.org/howto/1.1/rsnapshot-HOWTO.fr.html

Installation

aptitude install rsnapshot

vi /etc/rsnapshot.conf

Configurer votre répertoire de stockage, pour ma part, un disque dur externe

snapshot_root    /media/backup/

Décommenter les lignes

cmd_cp          /bin/cp
cmd_ssh         /usr/bin/ssh

L’option suivante est intéressante, elle permet d’utiliser rsync pour la création de lien dur, plutôt que la commande cp -al

link_dest      1

Modifier l’intervalle de sauvegarde

#########################################
#           BACKUP INTERVALS            #
# Must be unique and in ascending order #
# i.e. hourly, daily, weekly, etc.      #
#########################################
retain          hourly  6
retain          daily   7
retain          weekly  4
#retain monthly 3

hourly ne veut pas dire toutes les heures mais toutes les 4 heures par défaut, donc le 6 permet d’avoir des sauvegardes sur 24h (6*4). Cela étant dit, il est possible de définir hourly s’exécutant toutes les heures.
daily s’exécute tous les jours et garde un historique sur 7 jours.
weekly s’exécute toutes les semaines et garde un historique sur 4 semaines.

Dans mon cas, je voudrais garder les 30 derniers jours et pourquoi pas garder les 12 derniers mois.

retain          daily  30
retain          monthly 12

Modifier ensuite à la fin du fichier la section

###############################
### BACKUP POINTS / SCRIPTS ###
###############################

Comme bon vous semble. Pour mon cas, je veux sauvegarder tout le répertoire /var/www de mon serveur web distant vers mon serveur de backup ou rsnapshot est installé et ce de façon journalière. Je vais donc mettre

backup  root@edmc73.com:/var/www/  edmc73.com/

La sauvegarde du répertoire /var/www de mon serveur web se fera sur mon serveur de backup dans /media/backup/edmc73.com/var/www

Si votre serveur web à un port ssh différent, vous pouvez le spécifier de cette façon.

backup  root@edmc73.com:/var/www/  edmc73.com/ ssh_args=-p1234
Séparez bien vos colonnes par une tabulation et non par un espace !!! Mettez toujours un / après un nom de répertoire !!

Test

Pour tester si notre config fonctionne, utilisez la commande

rsnapshot configtest

qui devrait retourner

Syntax OK

Ensuite la simulation d’un backup journalier

:~# rsnapshot -t daily
echo 11500 > /var/run/rsnapshot.pid
mkdir -m 0755 -p /media/backup/daily.0/edmc73.com/
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \
  --rsh=/usr/bin/ssh root@edmc73.com:/var/www \
  /media/backup/daily.0/edmc73.com/
touch /media/backup/daily.0/

On voit ici ce que va faire rsnapshot. Créer un fichier de lock, créer le répertoire cache, faire un rsync via ssh dans les répertoires qui vont bien.

Dernière vérification

Assurez vous que votre serveur de backup est bien accès au serveur à sauvegarder via ssh avec une clé public (voir SSH)

Et assurez-vous d’avoir installez rsync sur la machine à sauvegarder

aptitude install rsync

Activation

Pour programmer l’exécution, nous allons configurer le cron de rsnapshot

vi /etc/cron.d/rsnapshot

Toujours dans mon cas, décommentez la ligne daily et monthly.

Vous pouvez lancer la commande suivante à la main

rsnapshot -v daily

Mais sachez qu’à chaque fois que vous la lancerez, vous décalerez votre sauvegarde. daily.0 deviendra daily.1 et la nouvelle sauvegarde sera daily.0 De ce fait, l’écart entre les 2 daily ne sera pas d’une journée. Donc à éviter !

Sauvegarder un pc sous windows

Installer le service rsync

Sous windows, un service rsync existe, il s’appelle cwRsync Server et est disponible normalement ici ⇒ https://www.itefix.no/i2/cwrsync mais à l’heure ou j’écris ces lignes, le site ne répond pas et j’ai trouvé un site non officiel proposant le téléchargement ici ⇒ http://www.backupassist.com/rsync/

Exécutez cwRsyncServer_4.1.0_Installer.exe et suivez les instructions, n’installez pas SSH (nous sommes dans mon cas dans un réseau local, pas la peine de crypter nos données).
Un mot de passe est proposé pour faire tourner le service, laissez ceci par défaut, nous n’en avons pas besoin.

Configuration du server

Modifiez le fichier C:\Program Files\cwRsyncServer\rsyncd.conf ou C:\Program Files\ICW\rsyncd.conf

use chroot = false
strict modes = false
hosts allow = *
log file = rsyncd.log
 
# Module definitions
# Remember cygwin naming conventions : c:\work becomes /cygwin/c/work
#
[test]
path = /cygdrive/c/Documents and Settings/Moi
read only = false
transfer logging = no
UID = 0
GID = 0
exclude from =/cygdrive/C/Program Files/ICW/exclude.txt

Exemple :

- /Recent/
- /Local Settings/Temp/
- /Local Settings/Historique/
- /Local Settings/Temporary Internet Files/
- /Cookies/
- /Favoris/
- /IECompatCache/
- /IETldCache/
- /PrivacIE/
- /SendTo/
- /UserData/
- /Voisinage*/
- Thumbs.db
- desktop.ini
- NTUSER.DAT
- ntuser.dat.LOG

En savoir plus sur les exclusions ⇒ https://www.itefix.no/i2/content/excluding-directories-cwrsync

Démarrer le service

Allez dans votre gestionnaire de service ou pour aller plus vite [Touche Windows]+r tapez services.msc puis Entrée

Recherchez RsyncServer. Par défaut il est en Manuel, double-cliquez dessus, mettez le type de démarrage en automatique pour qu’il se lance à l’ouverture de Windows puis cliquez sur Démarrer pour lancer le service.

Pensez à ouvrir le port 873 de votre firewall
“Pare-feu Windows Defender” / “Paramètres avancés”
“Règles de trafic entrant”

“RsyncServer”
“Protocoles et ports” : TCP : 873
“Etendue” : ajouter l’adresse ip de votre serveur

Pour vérifier votre config, allez sur votre serveur de backup et listez les fichiers qui seront synchronisés avec la commande

rsync -n 192.168.0.1::test

Aucune modification ne sera faite.

Configurer rsnapshot

Coté rsnapshot, j’ai créé un répertoire différent pour ma machine windows, je vais l’appeler /media/backup/windows

Je crée un nouveau fichier de config en copiant celui existant

cp /etc/rsnapshot.conf /etc/rsnapshot_windows.conf

Je m’assure de modifier le répertoire de sauvegarde

snapshot_root /media/backup/windows

De commenter l’option de rsync à traver ssh

# Uncomment this to enable remote ssh backups over rsync.
#
#cmd_ssh        /usr/bin/ssh

Adaptez vos intervalles de backup dans la section qui va bien

#########################################
#           BACKUP INTERVALS            #
# Must be unique and in ascending order #
# i.e. hourly, daily, weekly, etc.      #
#########################################

Modifiez le lockfile si votre sauvegarde est indépendante des autres sauvegardes déjà présentent sur votre serveur.

lockfile        /var/run/rsnapshot_windows.pid

Je conseillerai de décommenter l’option suivante et la mettre à 1. Cela permet que si votre PC est éteint, rsnapshot ne fera pas tourner son cycle de sauvegarde, ce qui évite de perdre de vieilles sauvegarde et de faire une copie pour rien.

sync_first   1
L’option sync first doit être à 0 la 1ère fois que vous lancerez rsnapshot, sinon rien ne se passe.

Si cette option sync_first pose problème, j’ai trouvé une alternative qui est peut être mieux.
Il suffit de tester si le PC est dispo avant de lancer la copie et cela grâce à la pre-commande dispo dans le fichier de config.

cmd_preexec     /etc/rsnapshot_pre

Mettez le script suivant dans /etc/rsnapshot_pre

/usr/bin/rsync 192.168.0.1::Test # ou votre nom de partage
if [ $? -ne 0 ] # on test si le code de retour de la commande rsync est différente de zéro
then
  echo "rsyncd indisponible. PC éteint?"
  exit 1
fi

Et le point de backup

backup  192.168.0.1::test               PC-MOI/

On retrouve l’adresse ip du PC windows à sauvegarder, le double “::“ qui permet de spécifier le module sur lequel on se connecte. On retrouve notre test et le nom du répertoire à destination de la sauvegarde.

Il ne reste plus qu’a configurer notre cron.d

vi /etc/cron.d/rsnapshot

Ajoutez les lignes suivantes suivant vos intervalles

0 20    * * *           root    /usr/bin/rsnapshot -c /etc/rsnapshot_windows.conf daily
30 19   1 * *           root    /usr/bin/rsnapshot -c /etc/rsnapshot_windows.conf monthly

Ici j’ai décidé de lancer le backup à 20h, l’option -c de rsnaphot permet de définir un fichier de config spécifique.

Et voila, il ne vous reste plus qu’à installer un petit server samba afin d’accéder facilement à vos backup depuis windows et vous voila tranquille ;)

Logguer les étapes rsync

Créer un script intermédiaire qui sera appelé par rsnapshot en tant que programme rsync (voir fichier de conf)

rsyncLog
# Votre traitement pour logguer ce que vous voulez
 
/usr/bin/rsync $@
 
if [ $? -ne 0 ]
then
  # traitement si la commande rsync échoue
else
  # traitement si la commande rsync à fonctionné
fi

Etude d'un cas : la gestion des "trou"

Condition: sauvegarde sur une partition btrfs avec un rsnapshot configuré avec link_dest qui permet de dire à rsync de créer lui meme les liens dur. La sauvegarde s’effectue tous les soir sur un poste de travail. Quand ce poste de travail est éteint, je me retrouve avec un répertoire de backup vide. Normalement, le lendemain, toutes les données devrait se retélécharger.

Et ben non, dans la dernière version de rsnapshot, celui-ci vérifie si le répertoire donné dans link_dest est vide, si c’est le cas, il va chercher plus loin

Utiliser les snapshots de btrfs

Inspiré du tuto http://it.werther-web.de/2011/10/23/migrate-rsnapshot-based-backup-to-btrfs-snapshots/

Le tuto ci-dessus part d’un disque de backup en ext4 qu’il convertit ensuite en btrfs, donc lisez le si vous êtes dans ce cas.
Ici on fait déjà nos backups sur une partition btrfs, on va modifier les appels aux commandes cp et rm en les remplaçant par btrfs subvolume snapshot et btrfs subvolume delete L’avantage est la rapidité de la création d’un snapshot par rapport à la création de liens physique et aussi que le snapshot conserve toutes les meta-données des fichiers contrairement aux liens physiques.

Si vous partez de rien, You must create hourly.0 as a BTRFS subvolume from the outset, otherwise it will be created as a directory and propogate itself. You lose the advantage of BTRFS.

# btrfs subvolume create daily.0
# btrfs subvolume create monthly.0
# rsnapshot -c /etc/rsnapshot.conf daily

Script de gestion des snapshots

Script rsnapshot_plug_cp_btrfs qui remplacera la commande cp

rsnapshot_plug_cp_btrfs
#!/bin/bash
 
# Arg 1: -al
# Arg 2: /testbtrfs/backups/hourly.0
# Arg 3: /testbtrfs/backups/hourly.1
 
/sbin/btrfs subvolume snapshot $2 $3

Script rsnapshot_plug_rm_btrfs qui remplacera la commande rm

rsnapshot_plug_rm_btrfs
#!/bin/bash
 
# Arg 1: -rf
# Arg 2: /testbtrfs/backups/hourly.4/
 
# echo 1: $1  2: $@
 
# Essaie de supprimer le répertoire donné avec la commande btrfs subvolume delete en premier
# Si la commande échoue, on supprime le répertoire avec la commande rm
if [  "$1" = "-rf"  -a  "$3" = ""  ]; then
        # "on essaie de supprimer avec btrfs"
        /sbin/btrfs subvolume delete $2
        error=$?
        if [ $error -eq 13 ]; then
                # EC 13 => Le répertoire spécifié n'est pas un sous volume
                rm $@
        elif [ $error -ne 0 ]; then
                echo Erreur en supprimant avec btrfs $?
        fi
else
        rm $@
fi

Copier ces fichiers ou vous le souhaitez et rendez les exécutables avec chmod 755

Migration

Maintenant il faut migrer nos répertoires de sauvegarde en sous volume btrfs. Un script plus poussé est fourni dans le tuto en lien au début de ce chapitre. Ici nous le prenons le cas de backup uniquement journalier (daily)

D’abord on créer un répertoire old pour y stocker tous nos backup daily

mkdir old
mv daily.* old

Maintenant nous allons créer un sous volume du plus vieux des backups et y copier son contenu

btrfs subvolume create daily.29
rsync -avi --numeric-ids old/daily.29/ daily.29/

Ensuite nous allons créer un snapshot de ce sous volume et synchroniser celui avec le backup suivant et remonter ainsi jusqu’au dernier backup le plus récent.

btrfs subvolume snapshot daily.29 daily.28
rsync -avi --delete --numeric-ids old/daily.28/ daily.28/
 
btrfs subvolume snapshot daily.28 daily.27
rsync -avi --delete --numeric-ids old/daily.27/ daily.27/
 
...
 
btrfs subvolume snapshot daily.1 daily.0
rsync -avi --delete --numeric-ids old/daily.0/ daily.0/

On doit aussi pouvoir faire un petit script avec une boucle

for (( c=29; c>0; c-- ))
do
  btrfs subvolume snapshot daily.$c daily.$(($c - 1))
  rsync -avi --delete --numeric-ids old/daily.$(($c - 1))/ daily.$(($c - 1))/
done

On supprime ensuite les vieux backups

rm -fr old

Configuration

Maintenant il faut modifier votre fichier de config rsnapshot.conf
Je ne sais pas si l’option suivante est nécessaire, mais dans le doute

no_create_root  1

Maintenant nos 2 scripts. Adapter suivant le chemin ou vous avez placé vos scripts

cmd_cp    /bin/rsnapshot_plug_cp_btfrs
cmd_rm    /bin/rsnapshot_plug_rm_btfrs

A tester aussi

one_fs          1