Sauvegardes incrémentielles avec Attic Deduplicating Archiver

Attic est un programme Python développé par Jonas Borgström. Il permet de réaliser des sauvegardes incrémentielles, compressées, chiffrées et morcelées. Concrètement ça se passe ainsi:

  1. une première sauvegarde complète
  2. la seconde sauvegarde ne contient que les fichiers changés depuis la sauvegarde complète
  3. la troisième sauvegarde ne contient que les fichiers changés depuis la seconde
  4. la sauvegarde N ne contient que les fichiers changés depuis la sauvegarde N-1

Lors du processus de restauration, on peut choisir quelle sauvegarde restaurer. Un fichier a été effacé par erreur jeudi, la sauvegarde a lieu tous les vendredis, et on est samedi ? Pas de souci: on peut récupérer le fichier depuis la sauvegarde du vendredi de la semaine précédente.

Une sauvegarde, on en a quasiment jamais besoin. Mais c’est quand on en a besoin qu’on enrage de ne pas avoir fait de sauvegarde. Heureusement pour moi j’utilise différentes méthodes de sauvegarde afin de me donner une redondance double, je n’ai eu à faire appel à Attic qu’une seule fois, précisément pour une question de fichier effacé 3 semaines avant (sachant que mes sauvegardes locales sont des anti-hardware-crash hebdomadaires).

Mon cas

Dans ma stratégie actuelle, Attic a le rôle suivant:

/home → Attic → disque dur secondaire → Attic → DD sauvegarde 1 → DD sauvegarde 2
···································  → hubiC
···································· → Mega

Les dossiers utilisateur me sont en effet absolument précieux, il me les faut donc décompressés sur mes 2 disques durs externes de sauvegarde locale et chiffrés sur le DD secondaire et 2 services de stockage en cloud différents (pour pallier au risque d’arrêt du cloud).

Le détail sur les sauvegardes

Attic traite les données et les stocke dans un dépôt (repository). Ça peut être un dossier local, ou distant (avec sshfs, ou de Attic à Attic via ssh). Attic y stocke 3 fichiers importants:

  • config (qui contient les paramètres du dépôt)
  • hints.X
  • index.X
  • (et un README, osef)

X étant un chiffre que je devine être le nombre de morceaux traités. hints et index sont des blobs binaires sans doute chiffrés. Il s’agit ici des fichiers d’indexation des sauvegardes, Attic les inclut dans le dépôt ce qui est un bon procédé (contrairement à Duplicity qui les stockait dans .cache, ce qui provoque beaucoup de drames car sans ces index les sauvegardes sont difficilement exploitables)

Et puis il y a un dossier data, un/des sous-dossiers, et là dedans les morceaux des sauvegardes, avec comme nom des chiffres. Blobs binaires, de 5 Mo par défaut.

Usage de base

La documentation de Attic est très complète, sauf que.. en anglais seulement. Concrètement les commandes:

  • init: une seule fois, pour initialiser la config du dépôt (le paramètre –encryption permet de choisir le chiffrement: « none » pour aucun, « passphrase » pour une phrase de passe, « keyfile » pour un fichier-clé)
  • create: à chaque sauvegarde
  • extract: en cas de restauration
  • check: de temps en temps (l’argument –repair permet de corriger de petits soucis, voir après)
  • delete: occasionnellement, pour supprimer un point de sauvegarde (je déconseille)
  • list: si besoin, permet de lister les points de sauvegarde dispo, et leur contenu
  • prune: régulièrement, supprime les points de sauvegarde anciens
  • info: si besoin, affiche quelques stats sur le dépôt
  • mount: en cas de restauration, permet de monter un point de sauvegarde et ainsi naviguer dans l’arborescence des dossiers pour trouver des fichiers précis
  • change-passphrase: occasionnellement, si vous êtes parano

Quelques recommandations et incidents

Si vous envoyez vos sauvegardes sur un/des services externes, il est indispensable de les chiffrer. Pensez-y avant car cela est défini à l’étape d’initialisation du dépôt. Attic chiffre en AES-256 donc si vous avez une phrase de passe solide (20 caractères ou plus) ou un fichier-clé qui ne risque pas la corruption, vous êtes tranquille.

Les noms des points de sauvegarde: je vous recommande fortement d’indiquer la date.

Le dossier « data » et son contenu ne doivent pas être modifiés par d’autres programmes que Attic. Exemple: j’ai mentionné précédemment que j’utilise Mega, via le logiciel MegaSync (qui fait une synchro à double sens). Et bien puisque Attic prune (supprime) les points de sauvegarde anciens alors que MegaSync n’est pas lancé, ce dernier va au lancement suivant retélécharger les fichiers des points de sauvegardes supprimés ! Attic vous signalera une corruption du dépôt. Heureusement c’est facilement corrigé avec check –repair, Attic supprime les fichiers en trop et nettoie. Par rapport à ça, j’ai inclus dans mon script de sauvegarde un contrôle bloquant: tant que MegaSync n’est pas lancé et prêt à synchroniser les modifications qui seront apportées par Attic, Attic n’est pas exécuté.

Le chiffrement: l’utilisation d’un fichier-clé peut être dangereuse, car ce fichier doit impérativement ne jamais être altéré du moindre bit.. et si ce fichier est nommé « chiffrement-attic » ou autre truc explicite, n’importe qui ayant accès au PC devinera à quoi il sert et pourra accéder aux sauvegardes. C’est pourquoi je préfère les phrases de passe. Cependant j’automatise cela au sein du script avec la commande export ATTIC_PASSPHRASE, donc le script lui-même devient le point faible.

Mon exemple de script de sauvegarde

Il est exécuté par un script-maitre appelé par crontab, et procède tous les 6 jours.

#!/bin/bash
# restore: attic extract $REPOSITORY::(date)
# list: attic list $REPOSITORY(::date)
locker='~/Bureau/attic_cron.lock'
locker1='~/Bureau/please_start_megasync.lock'
locker2='~/Bureau/attic_working.lock'
timermaxage="518400"
sourcefolder='~/'
ATTIC_PASSPHRASE="Entrer ici une phrase de passe solide"
export ATTIC_PASSPHRASE
REPOSITORY='/tmp/home.attic'
timer="$REPOSITORY/timer"
curdate=$(date +%s)
if [ -f $timer ]; then
lastexec=$(stat -c %Y $timer)
echo "timer trouvé, lastexec: $lastexec"
else
lastexec="0"
echo "timer non trouvé"
fi
calcdiff=$(($curdate-$lastexec))
if [ -f $locker ]
then exit
else
touch "$locker"
if [ $calcdiff -gt $timermaxage ]; then
touch "$locker1"
ps ax | grep -v grep | grep megasync > /dev/null
while [ $? != 0 ]; do
sleep 1
ps ax | grep -v grep | grep megasync > /dev/null
done
rm "$locker1"
sleep 13 # on laisse un peu de temps pour connexion MegaSync
touch "$locker2"
attic create --stats $REPOSITORY::`date +%Y%m%d` $sourcefolder
attic prune -v $REPOSITORY --keep-daily=4
rm "$locker2"
touch "$timer"
fi
rm "$locker"
fi

Si vous n’utilisez pas MegaSync, vous pouvez zapper tout ce qui le concerne. Le timer et les verrous (locks) aussi si vous exécutez le script manuellement. Le timer de 518400 secondes ça correspond à 6 jours (le délai entre 2 points de sauvegarde).

Pour ce qui est d’Attic, il crée des points de sauvegarde nommés par exemple « 20150809 ». Avec la commande « attic list » il affiche pour chaque point de sauvegarde la date et l’heure précise, mais bon. Si les noms sont cohérents et prévisibles, faire des trucs comme l’extraction automatisée ça devient plus facile (ce qui se passe chez moi, la sauvegarde la plus récente (attic list $REPOSITORY | tail -n1 | head -c8) étant extraite vers mes disques durs externes  -au passage ça teste donc l’intégrité de la sauvegarde)

« attic prune » avec comme paramètre –keep-daily=4. J’ai besoin d’expliquer ? Cette commande supprime tous les points de sauvegarde précédents SAUF les 4 plus récents. Ce qui dans mon cas me donne une marge jusqu’à 4*6 = 24 jours d’historique, ça me convient.

Adaptez à votre sauce !