Automatiser vos sauvegardes de données vers le service cloud de votre choix, pour pas cher et sans vous enfermer dans des solutions propriétaires de type Google Drive ou OneDrive, c'est faisable, même sous Windows. Un exemple, avec Restic et Backblaze.

Contexte

Notre PC familial héberge des données précieuses, notamment des photos et des emails accumulés depuis une vingtaine d'années. Récemment, une erreur de manipulation a effacé une archive .pst (Outlook) de plusieurs gigabytes. J'ai ressorti notre disque dur externe de sauvegardes, seulement pour constater que je n'en avait pas effectué depuis... 8 mois.

Cela m'a permis de réaliser combien il est important d'automatiser les sauvegardes. Pourtant, je ne veux pas laisser notre disque dur externe branché en permanence, car si un rançongiciel infecte notre PC, nos backups doivent se trouver hors de sa portée.

La parade tient en deux exigences:

  • Les sauvegardes doivent résider sur un serveur distant, à l'abri des malwares sévissant potentiellement sur la machine cliente.
  • Les sauvegardes doivent être versionnées, de sorte que si des données chiffrées par un rançongiciel viennent à être sauvegardées, elle n'écrasent pas les versions précédentes, qui restent, elles, exploitables. Exit, donc, les solutions de pure synchronisation, du type rsync.

Cahier des charges

Je me suis mis en quête d'une solution répondant aux exigences suivantes.

  1. Incrémentalité

    A chaque nouvelle sauvegarde, on ne doit enregistrer que ce qui a changé. C'est ce qui permet de conserver plusieurs instantanés, sans faire exploser l'espace de sauvegarde.

  2. Compatibilité avec les service de stockage bon marché, du type Backblaze, Wasabi ou OVH Object Storage

    J'ai une préférence personnelle pour Backblaze (B2 pour les initiés), un acteur à la fiabilité établie, aux prix plancher et qui vient d'ouvrir son premier datacenter de ce côté de l'Atlantique (aux Pays-Bas, en septembre 2019).

  3. Cross-platform

    La solution choisie doit tourner à la fois sur notre PC familial (Windows 10) et sur mon ordinateur portable (Arch Linux).

  4. Déduplication

    Nos machines hébergent inévitablement de nombreux documents en doublon : e-books qui résident à la fois sur le PC familial et sur mon portable ; photos présentes sous plusieurs des comptes utilisateur du PC familial. Il faudrait éviter de doublonner également leur sauvegarde, sinon gare à la saturation de notre maigrichonne bande passante.

    De préférence, cette déduplication doit s'appliquer également aux segments de fichiers. En effet, le PC familial héberge des archives .pst de plusieurs gigabytes chacune. Mieux vaudait éviter de sauvegarder l'intégralité de l'archive à chaque fois qu'un email est déplacé ou effacé.

Choix du logiciel

J'ai fait un petit tour d'horizon des solutions de sauvegardes, avec une préférence pour l'open-source, plus susceptible de laisser l'utilisateur libre de choisir son fournisseur de stockage.

  • Sous Windows, j'avais déjà eu recours par le passé à Acronis True Image. Hélas, ses fonctionnalités cloud ciblent exclusivement des services proposés par l'éditeur lui-même. Ce n'est heureusement le cas ni d'Arq Backup, ni de Cloudberry. Mais à en croire de nombreux commentaires, ce dernier manque de fiabilité. De plus, l'un comme l'autre sont indisponibles sous Linux.

  • Sous Linux, Borg backup est réputé, mais son utilisation sous Windows (via WSL) semble expérimentale.

Enfin, je suis tombé sur Restic, un projet relativement récent (avril 2014) et actif qui répond à l'ensemble de mes critères. Il est écrit en Go, se qui l'autorise à tourner indifféremment sous n'importe quel OS majeur -- et à s'y montrer très véloce.

Restic s'utilise exclusivement en mode console. Ce n'est pas une faiblesse : les commandes étant bien structurées et documentées, elle facilitent grandement l'écriture de petits scripts d'automatisation.

Installation

De nombreuses distributions Linux mettent Restic à disposition par le biais de leur gestionnaire de paquets. Si ce n'est pas le cas de la vôtre, téléchargez l'exécutable depuis le projet Github, copiez-le dans un dossier référencé par votre PATH et rendez-le exécutable. Sous Ubuntu 16.04, cela peut donner ceci :

sudo apt install bzip2
wget https://github.com/restic/restic/releases/download/v0.9.5/restic_0.9.5_linux_amd64.bz2
bunzip2 restic*.bz2
sudo cp restic*amd64 /usr/local/bin/restic
sudo chmod +x /usr/local/bin/restic

Sous Windows, on peut par exemple utiliser Chocolatey.

Principes de fonctionnement

Restic s'inspire beaucoup de Git. Un snapshot Restic, tout comme un commit Git, n'est rien d'autre qu'une photographie instantanée d'un système de fichiers, sous forme d'arbre. (En réalité, ce ne sont pas des fichiers eniters qui sont photographiés, mais des fragments de fichiers : des blobs de données, d'une taille d'environ 1 MB).

Comme dans Git encore, la première étape consiste à initialiser un dépôt (repository, repo en raccourci), pour accueillir ses données. Il peut prendre place n'importe où : sur un disque dur local, sur un serveur FTP, ou dans un cloud storage quelconque.

Une spécificité vous sautera rapidement aux yeux : à l'initialisation d'un dépôt, vous devrez choisir un mot de passe, à répéter chaque fois que vous voudrez y accéder par la suite (pour y ajouter comme pour en récupérer des données). En effet, Restic chiffre vos fichiers. C'est ce qui vous permet de les stocker même dans environnement non sécurisé.

Quelques commandes utiles...

# Initialiser un dépot
restic -r <path-to-repo> init

# Sauvegarder des répertoires ou des fichiers
restic -r <path-to-repo> backup <dir1> <file1> <dir2> [--exclude <pattern1> <pattern2>] [--host <hostname>] [--tag <your-tag>] [--verbose]

# Lister les instantanés ("snapshots") disponibles sur un dépôt.
# Il existe la possibilité de filtrer les instantanés
# par tag ("--tag") ou par nom de machine ("--host")
restic -r <path-to-repo> snaphots

# Oublier un instantané.
# Attention, cela ne supprime pas automatiquement les blobs que cet instantané référençait.
# Pour ce faire, ajouter le paramètre --prune
restic -r <path-to-repo> forget <snapshot-id>

# Supprimer les blobs obsolètes. Attention, l'éxécution
# de cette commande peut être très longue.
restic -r <path-to-repo> prune

# Vérifier l'intégrité d'un dépôt
restic -r <path-to-repo> check

# Déverrouiller un dépôt. 
# Ceci peut notamment se révéler nécessaire lorsqu'une opération de sauvegarde
# a été interrompue inopinément.
restic -r <path-to-repo> unlock

# Lister les fichiers que contient un instantané
restic -r <path-to-repo> ls <snapshot-id>

# Restaurer des répertoires ou des fichiers
restic -r <path-to-repo> restore <snapshot-id> --target <restore-location>

Très pratique : la commande forget supporte la mise en oeuvre de stratégies de rétention d'instantanés. Considérons la commande suivante :

restic -r <path-to-repo> \
    --keep-daily 7 \
    --keep-weekly 5 \
    --keep-monthly 12 \
    --keep-yearly 75

Elle a pour effet de conserver :

  • un seul instantané par jour pour chacun des 7 derniers jours ;
  • un seul instantané par semaine pour chacune des 5 dernières semaines ;
  • une seul instantané par mois pour chacun des 12 derniers mois ;
  • un seul instantané par an pour chacune des 75 dernières années.

Concernant la restauration, on peut choisir de ne restaurer qu'une partie d'un instantané, à l'aide des paramètres filtrant --include et --exclude. Attention toutefois à la syntaxes des chemins : si vous voulez qu'ils soient absolus, veillez à ce qu'ils commencent par un leading slash, même sous Windows. Ainsi, si vous voulez restaurer le dossier "C:\Users\user\My Documents", et lui seul, passez l'option suivante : --include "/C/Users/user/My Documents".

Un mot encore sur la navigation au sein des instantanés : il faut reconnaître que retrouver le chemin du fichier qu'on souhaite restaurer à l'aide de la seule commande ls n'est pas des plus pratique. Le plus aisé est de monter l'instantané en tant que disque, pour ensuite s'y ballader à sa guise. Utilisez pour cela la commande restic -r <path-to-repo> mount <path-to-mountpoint>. Hélas, cette fonctionnalité n'est pas implémentée sous Windows.

Pour plus de détails et d'exemples de commandes, référez-vous à la documentation officielle.

Variables d'environnement

Pour éviter d'avoir à renseigner le mot de passe à chaque commande, il est conseillé de créer une variable d'environnement RESTIC_PASSWORD.

Dans le cas de Backblaze, le chemin du dépôt prend la forme b2:<bucket-name>:<directory-name>. Là aussi, vous devrez créer des variable d'environnement : B2_ACCOUNT_KEY et B2_ACCOUNT_PASSWORD.

Volume Shadow Copy

Sous Windows, vous vous heurterez probablement à un os : l'OS vous empêche d'accéder à des fichiers en cours d'utilisation. Par conséquent, Restic ne sera pas en mesure de les sauvegarder.

La solution consiste à utiliser un service appelé Windows Shadow Copy Service (VSS), capable de créer un instantané de l'état des fichiers sur un disque. On peut alors créer un raccourci (pas un fichier .lnk, non : un vrai symlink à la *nix) vers cet instantané, et c'est le contenu de ce raccourci qu'on sauvegardera.

Préalable indispensable : activer VSS. Pour cela, allez à Panneau de configuration / Système et sécurité / Système / Protection du système, sélectionnez le disque concerné, et cliquer sur Configurer... pour activer la protection.

Ensuite, un script Powershell comme celui-ci s'occupe de tout. Attention, il est à exécuter en mode administrateur.

Il ne reste plus qu'à demander au Planificateur de tâches de lancer ce script à intervalles réguliers.

Planificateur de tâches, onglet 'Général'
Planificateur de tâches, onglet 'Général'
Planificateur de tâches, onglet 'Déclencheur'
Planificateur de tâches, onglet 'Déclencheur'. Toutes les 10 minutes, c'est sans doute un peu trop rapproché !
Planificateur de tâches, onglet 'Action'
Planificateur de tâches, onglet 'Actions'. Le paramètre à passer est '-C <nom-du-script>'
Planificateur de tâches, onglet 'Conditions'
Planificateur de tâches, onglet 'Conditions'. Noter l'option 'Sortir l'ordinateur du mode veille pour exécuter cette tâche'.

L'option Sortir l'ordinateur du mode veille pour exécuter cette tâche ne fonctionnera que si, dans les paramètres avancés de votre mode d'alimentation, vous avez activé l'option "Autoriser les minuteurs de sortie de veille".

Options d'alimentation
Options d'alimentation, avec les minuteurs de sortie de veille activés

Dépannage

Si, pour une raison ou une autre, l'exécution du script est interrompue, vous vous retrouverez avec un symlink et un instantané VSS superflus. Vous n'avez plus qu'à les supprimer manuellement. Mettez le symlink tout bêtement à la poubelle. Pour supprimer l'instantané, exécutez la commande suivante, en tant qu'admin : Vssadmin Delete Shadows /For=<drive-letter>.

Attention : pour ce disque, les points de restauration système (qui peuvent avoir été créés par Windows Update ou des installeurs d'application) seront supprimés du même coup.

Théoriquement, il est possible de supprimer un instantané précis, avec la syntaxe Vssadmin Delete Shadows /shadow=<shadowID>, où shadowId est obtenu par la commande Vssadmin List Shadows. Toutefois, je n'ai pas réussi à la faire fonctionner.

Vous avez aussi intérêt à remettre de l'ordre dans votre dépôt de sauvegardes :

restic -r <path-to-repo> unlock
restic -r <path-to-repo> check
restic -r <path-to-repo> prune

Voilà pour une intro rapide. Je vous souhaite de bonnes sauvegardes -- et surtout, le cas échéant, des restaurations sans histoires !

Article précédent