PROJET AUTOBLOG


Planet-Libre

source: Planet-Libre

⇐ retour index

Yopland : Sauvegarder ses données avec Duplicity

vendredi 31 juillet 2015 à 22:37

tux-161379_1280Je vous épargnerai le couplet sur la nécessité de mettre en œuvre des sauvegardes régulières et je vous propose d’entrer directement dans le vif du sujet.

Toutes mes données sont stockées sur un NAS maison (basé sur la distribution Open Media Vault). L’objectif est dans un premier temps de mettre en œuvre sur un disque externe des sauvegardes régulières. Dans un second temps, pour plus de sécurité, j’aurai souhaité réaliser une sauvegarde complémentaire sur un serveur distant (il faut encore que je regarde les services appropriés). Toutefois, pour cela, un minimum de sécurité s’impose et si une donnée quitte mon environnement elle ne le fera que cryptée.

Toujours dans l’idée de garder sous le coude un petit aide mémoire, j’ai donc décidé d’écrire quelques billets sur le sujet. Ceux-ci aborderont donc les points suivants :

J’ai choisi de ne pas mettre en œuvre une solution de sauvegarde graphique. La première raison est que je n’ai pas d’écran sur mon NAS. Bien qu’il soit toujours possible d’utiliser un serveur X distant, je pars du principe qu’en cas de problème il y a une probabilité non nulle pour que tout termine en ligne de commande !

Installation de duplicity

Le NAS fonctionne H24, c’est donc sur cette machine que sera installée les différents logiciels permettant de sauvegarder mes données. Open Media Vault est une distribution basée sur Debian. L’installation de duplicity se fait donc très simplement avec la commande « apt-get ».

apt-get install duplicity

Périodicité des sauvegardes

Réaliser des sauvegardes régulières permet d’une part de palier les problèmes matériels qui ne manqueront pas d’arriver un jour et d’autre part de s’offrir un minimum de sécurité en cas de fausse manipulation. Je pars sur une durée de rétention de deux mois, cela signifie que je peux revenir en arrière durant cette période

Pour mettre en œuvre ce type de sauvegarde, je mets en place une sauvegarde totale tous les moins et une incrémentale tous les jours. Certes, en cas de problèmes le 29 du mois, les manipulations à réaliser seront nombreuses (restauration de la sauvegarde totale et restauration des 28 sauvegardes journalières). Certains me diront qu’il serait bien plus facile de réaliser une sauvegarde totale par jour. L’intérêt de duplicity est notamment de cacher cette complexité. Ce point n’est donc pas un vrai problème.

Par contre, en cas de problème sur ma sauvegarde totale, je risque de perdre un mois de données. Effectivement, c’est bien le cas, mais la capacité disque à ma disposition ne me permet pas de faire de sauvegardes totales plus régulièrement (le NAS est quand même en RAID 5, cela devrait tout de même limiter les risques en cas de problème matériel).

Dans mon cas, mes données contiennent plus de 300 Go de photos (oui, je sais, passer un peu plus de temps à les trier ne ferait pas de mal…). Le disque externe que je souhaite utiliser a une capacité de 1To, la solution est donc vite trouvée : deux sauvegardes totales sur le disque. Le reste en incrémental. Avant de réaliser la troisième sauvegarde totale, il faut donc effacer la plus ancienne.

Mise en œuvre des sauvegardes

La commande suivante sauvegardera le dossier « home » dans le dossier « /mnt/svg ». Si la dernière sauvegarde totale date de plus d’un moins, alors duplicity réalisera une nouvelle sauvegarde totale. Si ce n’est pas le cas, ce sera une sauvegarde incrémentale.

Dans le cadre d’une sauvegarde « locale » je ne souhaite pas utiliser de cryptage, d’ou l’option « –no-encryption ».

LISTE_SAUVEGARDE="/home"
BACKUP_DIR="/mnt/sauvegardeUSB/duplicity/"
duplicity --no-encryption --full-if-older-than 1M $LISTE_SAUVEGARDE file://$BACKUP_DIR

Le « M » désigne ici une période correspondant à un mois. Il est possible de substituer cette information avec les entrées suivantes :

Suite à cette commande, le dossier de sauvegarde contient les trois fichiers suivants :

En relançant la sauvegarde, on ajoute 3 fichiers supplémentaires correspondant à la période entre la dernière sauvegarde.

Bien entendu, tous ces fichiers sont directement consultable avec l’outil que vous utilisez habituellement pour gérer vos archives.

Comme mentionné dans ma politique de sauvegarde, je ne souhaite avoir que deux mois de rétention. Là encore duplicity peut se charger du travail. Il suffit d’utiliser la commande « remove-older-than « .

La commande suivante effacera les sauvegardes ayant plus de 70 jours :

LISTE_SAUVEGARDE="/home";
BACKUP_DIR="/mnt/sauvegardeUSB/duplicity/"
duplicity --no-encryption --full-if-older-than 1M remove-older-than 70D file://$BACKUP_DIR

Tester la validité de la sauvegarde

Afin d’être sur de pouvoir compter sur la sauvegarde, il est oprtain de s’assurer que cette dernière n’est pas corompue. La commande suivante vérifie les données présentes dans les archives présentes sans « /mnt/svg » avec les données présentes dans « /home ».

LISTE_SAUVEGARDE="/home";
BACKUP_DIR="/mnt/sauvegardeUSB/duplicity/"
duplicity verify -v4 --no-encryption --compare-data file://$BACKUP_DIR $LISTE_SAUVEGARDE;

La vérification se fait fichier par fichier. La place nécessaire à cette vérification est donc limitée.

Il existe une option « –compare-data » qui permet de vérifier aussi le contenu de chaque fichier.

En lançant la commande ci-dessus après avoir modifier un fichier dans « /home », duplicity me retourne la ligne suivante :

Vérification complète : 4 files compared, 1 difference found.

La sauvegarde n’est donc pas conforme à ce qui à été sauvegardé. En mettant en place ce type de vérification, on part du principe que les données ne sont pas accèdées durant la fenêtre de sauvegarde.

Restauration des données

Soit la situation initiale suivante sur mon dossier « home » :

On réalise une sauvegarde avec la commande suivante :

LISTE_SAUVEGARDE="/home";
BACKUP_DIR="/mnt/sauvegardeUSB/duplicity/"
duplicity --no-encryption --full-if-older-than 1M $LISTE_SAUVEGARDE file://$BACKUP_DIR

Lister les données présentes dans une sauvegarde

Pour obtenir la liste des fichiers contenus dans une sauvegarde, lancer la commande suivante :

LISTE_SAUVEGARDE="/home";
BACKUP_DIR="/mnt/sauvegardeUSB/duplicity/"
duplicity list-current-file --no-encryption file://$BACKUP_DIR

Comparer le backup avec le dossier source

La commande suivante vous permet d’effectuer uen comparaison avec la souvegarde et son dossier source. Les différences seront ainsi facilement mise en évidence.

LISTE_SAUVEGARDE="/home";
BACKUP_DIR="/mnt/sauvegardeUSB/duplicity/"
duplicity verify --no-encryption file://$BACKUP_DIR $LISTE_SAUVEGARDE

Restauration complète

Suite à la sauvegarde, on restaure les données dans la foulée. La commande suivante permet de restaurer les fichers présents dans le dossier « /mnt/svg » vers le dossier « /home ».

Dans notre cas, les fichiers sauvegardés existent déjà dans « /home ». Par défaut « duplicity » n’écrase jamais de fichier. Il faut donc ajouter l’option « –force » pour forcer la restauration.

LISTE_SAUVEGARDE="/home";
BACKUP_DIR="/mnt/sauvegardeUSB/duplicity/"
duplicity restore --force --no-encryption file://$BACKUP_DIR $LISTE_SAUVEGARDE

Il est aussi possible de spécifier la version que l’on souhaite restaurer avec l’option « –time ». Pour cela, il faut passer en paramètre la date relative ou absolue du fichier que l’on souhaite restaurer.

La commande suivante effectuera une restauration afin de retrouver les fichiers présent sur le disque il y a une semaine.

LISTE_SAUVEGARDE="/home";
BACKUP_DIR="/mnt/sauvegardeUSB/duplicity/"
duplicity restore --force --no-encryption --time 1W file://$BACKUP_DIR $LISTE_SAUVEGARDE

Au passage ce test permet de constater que « duplicity » gère tout seul le fait qu’il faille éventuellement retaurer plusieures sauvegarde pour arrivé au résultat voulu. Réaliser des sauvegardes incrémentales n’augmente pas la complexité de restauration par rapport à des sauvegarde totales.

Restaurer un fichier particulier

L’option  » –file-to-restore » permet de spécifier les fichiers à retaurer. Pour cela, il faut donner le nom du fichier à restaurer (nom relatif par rapport à la racine de l’archive) ainsi que le nom sous lequel le fichier doit être restauré.

LISTE_SAUVEGARDE="/home";
BACKUP_DIR="/mnt/sauvegardeUSB/duplicity/"
duplicity --no-encryption --force --file-to-restore fichier1.txt file://$BACKUP_DIR $LISTE_SAUVEGARDE/fichier1.txt

 Le chemin relatif du fichier à restauré paut être obtenu avec la commande « list-current-file ».

Gestion du périférique de stockage USB

Lorsque l’on branche un périphérique USB, udev se charge de créer une entrée dans « /dev ». Toutefois, cette entrée de la forme « /dev/sdx » varie en fonction des périfiériques déjà branché à la machine. Pour palier ce problème, il suffit de modifier les règles « udev » afin d’affecter au périphérique en question toujours la même entrée dans « /dev ». Ce point fait l’objet d’un billet.

Et concrétement, que faut-il faire ?

Je souhaite effectuer une sauvegarde ayant les caractéristiques suivantes :

Avant d’effectuer ma sauvegarde, il est nécessaire de monter mon périférique USB et de vérifier que ce dernier est bien disponible. Ce dernier sera démonté en fin de sauvegarde.

Pour garder une trace de toutes les actions, je souhaite garder les sorties « duplicity » sous forme de log (1 fichier par jour).

Pour remplir ce cahier des charges j’obtiens le script suivant :

#!/bin/bash
 
LISTE_SAUVEGARDE="/media/6c3b39d4-b1f4-4854-9ca9-0b1e068b8aba/Donnees/";
BACKUP_DIR="/mnt/sauvegardeUSB/duplicity/donnees/"
LOG_DIR="/var/log/duplicity"
LOG_FILE=`date +%Y-%m-%d-duplicity.log`
LOG=$LOG_DIR/$LOG_FILE
 
# Création du dossier de LOG
mkdir --parent $LOG_DIR
 
# Monte le disque de sauvegarde
mount /mnt/sauvegardeUSB
 
if mount | grep sauvegardeUSB; then
    # Création du dossier destination
    mkdir --parent $BACKUP_DIR;
    # Supprime les sauvegarde de plus de 2 mois
    duplicity remove-older-than 2M --force file://$LISTE_SAUVEGARDE >> $LOG;
    # Réalisation de la sauvegarde
    duplicity --no-encryption --full-if-older-than 1M $LISTE_SAUVEGARDE file://$BACKUP_DIR >> $LOG;
    # réinitialise les variables d'environnement
    unset LISTE_SAUVEGARDE;
    unset BACKUP_DIR;
    # stop le disque
    umount /mnt/sauvegardeUSB
    sdparm --command=eject /dev/sauvegardeUSB
else
    echo "Le disque de sauvegarde n'est pas présent"  >> $LOG;
    # réinitialise les variables d'environnement
    unset LISTE_SAUVEGARDE;
    unset BACKUP_DIR;
fi

Il ne reste plus qu’a l’ajouter dans la « cron table » pour une exécution journalière. Afin d’être sur que tous les dossiers soient sauvegardés, il est nécessaire de lancer le script avec l’utilisateur « root ».

sudo crontab -e

Et ajouter la ligne suivante :

30 0 * * * /root/bin/sauvegarde-donnees.sh

Améliorations

Voici une liste d’améliorations qui je mettrait en place la journée que j’aurai un peu de temps :

Références

Cet article Sauvegarder ses données avec Duplicity est apparu en premier sur Carnet de vol.

Gravatar de Yopland
Original post of Yopland.Votez pour ce billet sur Planet Libre.