Restic - Présentation, installation et commandes de base



Présentation

Restic est un outil de sauvegarde/restauration proposant les fonctionnalités suivantes:

Installation

L’installation est simple. Développé en Go, Restic se présente sous la forme d’un binaire compilé statiquement et n’a donc pas de dépendances particulière sur la machine cible.

L’installation peut se faire de la manière suivante:

  1. Télécharger la version v0.13.0 de restic pour GNU/Linux, architecture amd64

    wget https://github.com/restic/restic/releases/download/v0.13.0/restic_0.13.0_linux_amd64.bz2
    

    Les liens de téléchargement des autres systèmes d’exploitation/architectures sont disponibles sur la page Release du projet.

  2. Vérifier l’empreinte du fichier téléchargé

    echo '514d0711317427f45d3ca23e66cf66e9f98caef660314d843f59b38511e94a2c restic_0.13.0_linux_amd64.bz2' | sha256sum -c
    

    Vous trouverez l’empreinte de vérification dans le fichier SHA256SUMS présent sur la page des releases.

    Vous devriez avoir un résultat du type:

    restic_0.13.0_linux_amd64.bz2: OK
    
  3. Extraire le binaire et le déplacer dans le répertoire /usr/local/bin

    # Extraire les fichiers de l'archive
    bzip2 -d restic_0.13.0_linux_amd64.bz2
    
    # Déplacer le binaire dans le répertoire des exécutables locaux
    mv restic_0.13.0_linux_amd64 /usr/local/bin/restic
    
    # Rendre exécutable le binaire
    chmod +x /usr/local/bin/restic
    

Si tout s’est bien passé, vous devriez désormais avoir le résultat suivant en entrant la commande restic dans votre terminal:

root@3e1519a8ffcd:/# restic

restic is a backup program which allows saving multiple revisions of files and
directories in an encrypted repository stored on different backends.

Usage:
  restic [command]

[...]

Commandes de base

Créer un dépôt

Restic organise les sauvegardes sous la forme de dépôts (“repositories”). Un dépôt peut être local ou plus généralement distant (notamment via les très nombreux supports de stockage disponibles via rclone).

  1. Initialiser un dépôt local

    # Création du répertoire qui va accueillir le dépôt restic
    mkdir my-backup-repo
    
    # Initialisation du dépôt
    restic init --repo ./my-backup-repo
    

    Exemple de sortie

    root@3e1519a8ffcd:/: restic init --repo ./my-backup-repo
    enter password for new repository: 
    enter password again: 
    created restic repository e40061e5ad at ./my-backup-repo
    
    Please note that knowledge of your password is required to access
    the repository. Losing your password means that your data is
    irrecoverably lost.
    

    Le mot de passe définit ici est à conserver de manière pérenne. Sans celui ci les données sauvegardées seront irrémédiablement irrécupérables !

  2. Vérifier que le dépôt est correctement initialisé en affichant les stats de celui ci:

    restic stats -r ./my-backup-repo
    

    Exemple de sortie

    root@3e1519a8ffcd:/: restic stats -r ./my-backup-repo 
    enter password for repository: 
    repository e40061e5 opened successfully, password is correct
    scanning...
    Stats in restore-size mode:
    Snapshots processed:   0
            Total Size:   0 B
    

    Aucune donnée présente dans le dépôt. Nous sommes parés à faire une première sauvegarde !

Plus de détails sur la documentation officielle.

Créer une sauvegarde

Dans Restic, chaque sauvegarde va créer un nouveau cliché (“snapshot”) du ou des fichiers sauvegardés.

  1. Générer un nouvelle sauvegarde d’un répertoire, ici le répertoire de configuration /etc dans notre dépôt préalablement créé

    restic backup -r ./my-backup-repo /etc
    

    Exemple de sortie

    root@3e1519a8ffcd:/: restic backup -r ./my-backup-repo /etc
    enter password for repository: 
    repository e40061e5 opened successfully, password is correct
    no parent snapshot found, will read all files
    
    Files:         118 new,     0 changed,     0 unmodified
    Dirs:           47 new,     0 changed,     0 unmodified
    Added to the repo: 481.148 KiB
    
    processed 118 files, 334.664 KiB in 0:00
    snapshot 1e881760 saved
    
  2. Vérifier que le cliché du répertoire à bien été pris en listant ceux ci

    restic -r ./my-backup-repo snapshots
    

    Exemple de sortie

    root@3e1519a8ffcd:/# restic -r ./my-backup-repo snapshots
    enter password for repository: 
    repository e40061e5 opened successfully, password is correct
    ID        Time                 Host          Tags        Paths
    --------------------------------------------------------------
    1e881760  2022-03-28 11:43:19  3e1519a8ffcd              /etc
    --------------------------------------------------------------
    1 snapshots
    

Vérifier la fonctionnalité de déduplication

Vous pouvez essayer d’effectuer d’autres sauvegardes du répertoire /etc et relancer la commande restic stats. En l’absence de modifications dans le répertoire, la taille du dépôt ne devrait pas augmenter (mis à part potentiellement les quelques métadonnées associées au cliché).

Comment passer le mot de passe dans une sauvegarde automatique ?

Si on souhaite effectuer une sauvegarde en mode non interactif (dans une tâche programmée par exemple) il est possible de passer le mot de passe de chiffrement via la variable d’environnement RESTIC_PASSWORD.

Plus d’informations sur la documentation officielle

Vérifier l’état des sauvegardes

Il est toujours important de s’assurer qu’une sauvegarde n’est pas corrompue et qu’elle pourra être restaurée.

Restic intègre une commande permettant de s’assurer que le dépôt est dans un état cohérent et que les clichés pourront être utilisé pour une restauration.

Ceci ne vous protège bien entendu pas contre les problèmes liés à l’état initial des données sauvegardées !

  1. Vérifier la cohérence du dépôt

    restic -r ./my-backup-repo check
    

    Exemple de sortie

    root@3e1519a8ffcd:/# restic -r ./my-backup-repo check    
    using temporary cache in /tmp/restic-check-cache-2387724536
    enter password for repository: 
    repository e40061e5 opened successfully, password is correct
    created new cache in /tmp/restic-check-cache-2387724536
    create exclusive lock for repository
    load indexes
    check all packs
    check snapshots, trees and blobs
    [0:00] 100.00%  1 / 1 snapshots...
    no errors were found
    

À titre d’exercice, nous pouvons essayer de corrompre arbitrairement des données du dépôt de sauvegarde pour tester la détection des incohérences.

  1. On corrompt volontairement les clichés de notre dépôt

    echo 'CORRUPT' > ./my-backup-repo/snapshots/*
    
  2. On vérifie à nouveau l’état du dépôt

    restic -r ./my-backup-repo check
    

    Exemple de sortie

    root@3e1519a8ffcd:/: restic -r ./my-backup-repo check
    using temporary cache in /tmp/restic-check-cache-1531687926
    enter password for repository: 
    repository e40061e5 opened successfully, password is correct
    created new cache in /tmp/restic-check-cache-1531687926
    create exclusive lock for repository
    load indexes
    check all packs
    check snapshots, trees and blobs
    [0:00]          0 snapshots...
    error: load <snapshot/1e881760bd>: invalid data returned
    Fatal: repository contains errors
    

    Restic détecte bien une erreur dans le cliché 1e881760bd !

  3. Oublions définitivement ce cliché désormais défectueux

    restic -r ./my-backup-repo forget 1e881760bd
    
    # Profitons en pour refaire une nouvelle sauvegarde !
    restic -r ./my-backup-repo backup /etc
    

Lister les fichiers présents dans un cliché

Une fois l’identifiant du cliché ciblé retrouvé (via la commande restic snapshots), lancer la commande suivante:

restic -r ./my-backup-repo ls 3c3f71d3 /etc/host*

3c3f71d3 correspond ici à l’identifiant de mon cliché dans mon dépôt et /etc/host* est un filtre de recherche des fichiers dans le cliché.

Exemple de sortie

root@3e1519a8ffcd:/: restic -r ./my-backup-repo ls 3c3f71d3 /etc/host*
enter password for repository: 
repository e40061e5 opened successfully, password is correct
snapshot 3c3f71d3 of [/etc] filtered by [/etc/host.conf /etc/hostname /etc/hosts] at 2022-03-28 12:19:05.791008077 +0000 UTC):
/etc/host.conf
/etc/hostname
/etc/hosts

Afficher le contenu d’un fichier à partir d’un cliché

Il est très simple d’afficher l’état d’un fichier présent dans un cliché. Par exemple, pour afficher le contenu du fichier /etc/hosts de mon cliché 3c3f71d3:

restic -r ./my-backup-repo dump 3c3f71d3 /etc/hosts

Exemple de sortie

root@3e1519a8ffcd:/: restic -r ./my-backup-repo dump 3c3f71d3 /etc/hosts
enter password for repository: 
repository e40061e5 opened successfully, password is correct
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.2	3e1519a8ffcd

Restaurer un ou plusieurs fichiers depuis une sauvegarde

La restauration des fichiers à partir d’un cliché s’effectue de la même manière que l’affichage du contenu d’un seul fichier. Pour ce faire, il nous faut d’abord récupére l’identifiant du cliché à utiliser comme source de restauration, puis

restic -r ./my-backup-repo restore 85e784e9 --verify --target ./etc-backup

85e784e9 est l’identifiant de mon cliché sélectionné comme source de restauration et /etc-backup le répertoire de destination de la restauration (le répertoire sera créé si il n’existe pas déjà).

Le drapeau --verify est utilisé pour indiquer à Restic qu’il doit vérifier l’état des fichiers au moment de la restauration et nous indiquer les potentielles erreurs liées à celle ci.

Exemple de sortie

root@529d3c3ee8b9:/: restic -r ./my-backup-repo restore 85e784e9 --verify --target ./etc-backup
enter password for repository: 
repository c2ac1647 opened successfully, password is correct
restoring <Snapshot 85e784e9 of [/etc] at 2022-03-28 19:47:20.783353984 +0000 UTC by root@529d3c3ee8b9> to ./etc-backup
verifying files in ./etc-backup
finished verifying 118 files in ./etc-backup (took 33ms)

Il est bien entendu possible de restaurer directement notre sauvegarde dans le répertoire d’origine /etc, auquel cas nous aurons une sortie équivalente à:

root@529d3c3ee8b9:/: restic -r ./my-backup-repo restore 85e784e9 --verify --target /etc       
enter password for repository: 
repository c2ac1647 opened successfully, password is correct
restoring <Snapshot 85e784e9 of [/etc] at 2022-03-28 19:47:20.783353984 +0000 UTC by root@529d3c3ee8b9> to /etc
verifying files in /etc
finished verifying 118 files in /etc (took 37ms)

Enfin, nous pouvons également filtrer les fichiers à restaurer via l’utilisation du drapeau --include. Par exemple pour restaurer uniquement le fichier /etc/hosts:

root@529d3c3ee8b9:/: restic -r ./my-backup-repo restore 85e784e9 --verify --target /etc --include /etc/hosts
enter password for repository: 
repository c2ac1647 opened successfully, password is correct
restoring <Snapshot 85e784e9 of [/etc] at 2022-03-28 19:47:20.783353984 +0000 UTC by root@529d3c3ee8b9> to /etc
verifying files in /etc
finished verifying 1 files in /etc (took 7ms)

Il est même possible de spécifier plusieurs fois le drapeau --include afin de restaurer une liste de fichiers/répertoires à restaurer.