BorgBackup, borg pour les intimes

BorgBackup (borg) est un logiciel de sauvegarde par déduplication supportant la compression et le chiffrement. Il est sous licence BSD 3-Clause, disponible sur GitHub et activement maintenu (dernière version 1.0.7 du 18/08/2016). C’est un fork d’Attic (dernier commit 24/05/2015).

Chaque fichier est découpé en blocs de X octets (chunk), chacun disposant de sa propre signature. Les fichiers ne sont donc pas lisibles directement car stockés sous forme de chunks.

Borg s’appuie sur Python 3.4 et est disponible pour Linux, FreeBSD/OpenBSD/NetBSD, Mac OS X. Ses principales qualités :

  • Il est simple à utiliser et puissant
  • Il fait de la déduplication (réduction importante de l’espace occupé par les sauvegardes), de la compression (lz4 très rapide mais compression faible, zlib rapidité et compression moyenne, lzma lent mais compression élevée) et du chiffrement (AES-256)
  • La documentation est simple et claire (mais en Anglais), la page Usage fournit des exemples et l’explication de chaque commande

Installation

Les commandes suivantes sont exécutées sur une Debian 8. Si vous souhaitez utiliser la commande borg mount, il faudra installer le support de FUSE.

borg extract permet d’extraire le contenu d’une sauvegarde dans le dossier courant donc Attention ! borg mount permet de « monter » une sauvegarde (système de fichiers en lecture seule) afin de consulter son contenu. On pourra alors se déplacer dedans et éventuellement copier les fichiers/dossiers qu’on souhaite récupérer. Je recommande borg mount. Cela évite une restauration complète d’une sauvegarde (via borg extract) avec le nécessaire nettoyage que ça implique derrière si on n’a pas besoin de récupérer tous les fichiers/dossiers.

aptitude install python3 python3-dev python3-pip python-virtualenv libssl-dev openssl libacl1-dev libacl1 liblz4-dev liblz4-1 build-essential # Les prérequis nécessaires pour installer Borg
aptitude install libfuse-dev fuse pkg-config # Optionnel : Pour le support de FUSE permettant l'utilisation de la commande borg mount
pip3 install borgbackup ou pip3 install borgbackup[fuse] # C'est la seconde commande que j'utilise, elle installe borg et le support de FUSE permettant l'utilisation de la commande borg mount

Voilà Borg est installé. On va créer deux dossiers : mkdir -p /home/babar/borg_backup /home/babar/tests. Le premier sera le repository Borg et le second un dossier pour faire nos tests de restauration.

borg init

borg init va initialiser un repository pour Borg où seront stockées les sauvegardes. Il est fortement recommandé de stocker ce dossier/repository à plusieurs endroits (sur un disque dur externe, dans le cloud, à l’extérieur de votre domicile par exemple). Pour rappel la règle des 3-2-1 de la sauvegarde.

La première commande à lancer est borg init /home/babar/borg_backup signifiant la même chose que borg init --encryption=repokey /home/babar/borg_backup. Les choix proposés pour le chiffrement du repository sont --encryption {none,keyfile,repokey}, le choix par défaut étant repokey, none signifiant pas de chiffrement.

--encryption repokey correspond au mode mot de passe uniquement. La clé est stockée dans le repository (le fichier /home/babar/borg_backup/config). Si un attaquant/vilain récupère votre repository, il a la clé mais pas le mot de passe, il ne peut pas déchiffrer les sauvegardes.

--encryption keyfile correspond au mode mot de passe et clé. La clé est stockée dans votre home (dans /home/babar/.config/borg/keys). Si un attaquant/vilain récupère votre repository, il n’a ni la clé ni le mot de passe, il ne peut pas déchiffrer les sauvegardes.

Il est vital de sauvegarder le fichier /home/babar/borg_backup/config dans le mode repokey et le dossier /home/babar/.config/borg/keys dans le mode keyfile car si vous les perdez vous ne pourrez pas déchiffrer vos sauvegardes.

borg create et borg prune

borg create est la commande la plus importante car c’est elle qui effectue la sauvegarde. Évidemment la première sauvegarde est la plus longue.

borg create -v --stats /home/babar/borg_backup::{hostname}_{now:%d.%m.%Y} /home/babar/syncthing /etc /var/www

-v : verbose
--stats : Montrer les statistiques de la sauvegarde créée
/home/babar/borg_backup : Notre repository
{hostname}_{now:%d.%m.%Y} : Mon serveur s’appelant Jessie, ça donnera Jessie_20.08.2016. Il s’agit du nom de la sauvegarde que nous allons créer. On aurait tout aussi bien pu écrire directement Sauvegarde_20.08. Voir la documentation à propos de {hostname} et {now}
/home/babar/syncthing /etc /var/www : Nous sauvegardons les dossiers /home/babar/syncthing, /etc et /var/www

borg prune va s’occuper de ce qu’on appelle la rotation c’est-à-dire de respecter les règles de conservation/suppression de nos sauvegardes. J’ai choisi une règle un peu compliquée à comprendre (je m’en excuse) mais c’est pour mieux illustrer les possibilités offertes.

borg prune -v --keep-within=10d --keep-weekly=4 --keep-monthly=-1 /home/babar/borg_backup

--keep-within=10d : Conserver toutes les sauvegardes effectuées durant le temps indiqué (ici 10 jours)
--keep-weekly=4 : Nombre de sauvegardes hebdomadaires à conserver
--keep-monthly=-1 : Nombre de sauvegardes mensuelles à conserver. Vous remarquerez le -, spécifier un nombre négatif de sauvegardes signifie qu’on conserve une sauvegarde indéfiniment ici la mensuelle
/home/babar/borg_backup : Notre repository

borg list et borg delete

borg list permet de lister le contenu d’un repository ou d’une sauvegarde.

borg list /home/babar/borg_backup # Va lister toutes les sauvegardes du repository
borg list /home/babar/borg_backup::Jessie_17.08.2016 # Va lister tous les fichiers de la sauvegarde du 17/08
borg list /home/babar/borg_backup::Jessie_19.08.2016 | grep 2016-08-18 # On liste tous les fichiers de la sauvegarde du 19/08 puis on affiche les lignes avec le motif 2016-08-18. Va nous permettre de voir facilement les fichiers ajoutés/modifiés entre le 18/08 et le 19/08

borg delete permet de supprimer une sauvegarde ou un repository entier.

borg delete /home/babar/borg_backup # Va supprimer le repository et donc toutes les sauvegardes contenues dedans
borg delete /home/babar/borg_backup::Jessie_19.08.2016 # Va supprimer la sauvegarde du 19/08

borg extract et borg mount

borg extract permet d’extraire le contenu d’une sauvegarde.

borg extract /home/babar/borg_backup::Jessie_17.08.2016 # Va extraire tous les fichiers de la sauvegarde du 17/08 dans le dossier courant

borg mount permet de monter une sauvegarde comme un système de fichier FUSE.

borg mount /home/babar/borg_backup::Jessie_17.08.2016 /home/babar/tests # Va monter en lecture seule tous les fichiers de la sauvegarde du 17/08 dans le dossier /home/babar/tests, ce dossier doit être vide
fusermount -u /home/babar/tests # Va démonter /home/babar/tests, je le fais souvent précéder de la commande cd pour éviter le message Device or resource busy

Quelques détails supplémentaires

Je l’ai mis en place sur mon server@home et en test sur 3 serveurs au boulot, je ferai un retour dans quelques semaines/mois. La société SysNove a fait un article dessus pour expliquer comment ils s’en servent.

Je n’ai pas parlé de compression ni de sauvegarde distante afin de rester accessible. Le Quick Start vous apportera les réponses nécessaires.

Borg utilise un cache pour faire son travail (/home/babar/.cache/borg) dont la taille grandit rapidement. Voir la FAQ.

Concernant les sauvegardes automatiques, on utilisera export BORG_PASSPHRASE='monjolimotdepasse'. On peut également choisir le mode keyfile et renseigner un mot de passe vide. Voici le script de sauvegarde borg_backup.sh que j’utilise actuellement. J’ai créé une tâche cron pour le lancer chaque jour.

#!/bin/bash

export BORG_PASSPHRASE='monjolimotdepasse'
REPOSITORY='/home/babar/borg_backup'

/usr/local/bin/borg create -v --stats $REPOSITORY::{hostname}_{now:%d.%m.%Y} /home/babar/syncthing /etc /var/www
/usr/local/bin/borg prune -v --keep-within=10d --keep-weekly=4 --keep-monthly=-1 $REPOSITORY

Borg amène tous les raffinements qu’on peut désirer pour ses sauvegardes : rotation, chiffrement, déduplication, compression, clarté et simplicité.

Borg c’est de la balle.

Déjà 17 avis pertinents dans BorgBackup, borg pour les intimes

  • A1
    À noter également:
    – il existe le projet Borgmatic, qui permet à travers une configuration simplissime d’automatiser ses sauvegardes.
    – le plus important: Borg permet de faire des sauvegardes à la fois incrémentales, dédupliquées _et_ chiffrées côté client, il n’est donc pas nécessaire d’avoir confiance dans le stockage distant. À ma connaissance, c’est le seul (en tout cas à ce niveau de facilité d’utilisation?).
  • Angelux
    J’utilise également Borg pour mes sauvegardes de différents partages réseau au boulot. J’ai initié un disque en ISCSI pour le stockage sur un NAS de backup. J’utilise la compression lz4 avec un script en cron qui tourne 2 fois par jour. C’est une tuerie. J’utilisais auparavant backuppc mais j’avais de gros soucis de stabilité réseau et de place. Réglés avec Borg, le lz4 est un faible taux de compression mais j’arrive à gagner quand même entre 30 et 40% d’espace disponible!
  • Yep, j’ai testé. Comme la doc dit :

    This command extracts the contents of an archive. By default the entire archive is extracted but a subset of files and directories can be selected by passing a list of PATHs as arguments. The file selection can further be restricted by using the –exclude option.

    J’en ai conclu qu’on pouvait jouer avec les fichiers. Du coup, j’ai fait

    borg extract [user]@[serveur]:[repository]::[archive] home/USERNAME/chemin/vers/fichier et dans le répertoire où j’ai lancé la commande, j’ai trouvé un home/USERNAME/chemin/vers/fichier. C’est pas exactement super pratique, mais ça permet de restaurer un seul fichier.

    Par contre, j’aimerais bien faire en sorte que le scritp d’automatisation puisse logger la sortie final (stats) dans un fichier, pour en garder une trace. Et j’ai pas encore bien pu comprendre comment fonctionne borg check, je veux dire ce que ça fait.

  • Alors peut-être qu’on dit la même chose, je ne sais pas :D

    C’est simplement qu’on peut extraire un seul fichier de l’archive avec borg extract, et pas seulement toute l’archive ou un dossier, et il me semblait que ce n’était pas indiqué dans le billet. Reste que c’est certainement plus simple d’utiliser borg mount… :)

  • RainX
    Bonjour,

    Venant de prendre connaissance de ce logiciel de backup, je serais curieux d’avoir tes retours d’expérience sur le sujet, surtout du côté « des 3 serveurs au boulot » …

    Merci pour cette doc.

  • Séb
    Bonjour à tous,

    J’utilise BorgBackup pour mes backups. Quand je liste les archives de mon repo, voici ce que j’ai :

    borg list borg@[SERVER_IP]:/home/backups/$(hostname)
    jenkins_data_2018-06-16 Sat, 2018-06-16 09:28:08
    redmine_data_2018-06-16 Sat, 2018-06-16 09:31:38

    Maintenant, j’aimerai voir ce que la commande « borg prune » voudrait me supprimer :
    borg prune -v –list –dry-run borg@[SERVER_IP]:/home/backups/$(hostname) –keep-daily=7 –keep-weekly=4 –keep-monthly=3
    Keeping archive: redmine_db_2018-06-16 Sat, 2018-06-16 09:31:38
    Would prune: jenkins_data_2018-06-16 Sat, 2018-06-16 09:28:08

    On voit que Borg voudrait supprimer une archive qui date du jour.

    Savez-vous pourquoi s’il-vous-plaît ?

Les commentaires sont fermés.