Présentation de BorgBackup, l'un des meilleurs outils de sauvegarde disponibles sous Linux

2023-10-02

Couverture de l'article

Ça fait longtemps que je voulais vous parler de BorgBackup, un outil de sauvegarde que j'utilise aussi bien personnellement que professionnellement depuis quelques années maintenant. Bien que disposant de nombreuses fonctionnalités, BorgBackup reste plutôt simple à utiliser, et il bénéficie de plus d'une importante communauté et d'une excellente documentation.

Voici quelques-unes des fonctionnalités et particularités qui m'ont fait basculer sur cet outil.

Premièrement, une gestion efficace du stockage qui permet à la sauvegarde d'occuper un espace réduit. Pour cela BorgBackup déduplique les données en découpant chaque fichier en blocs (appelés chunks), ce qui lui permet de n'écrire que des données uniques dans son stockage. Un gros fichier qui change un peu entre chaque sauvegarde ne sera donc pas intégralement recopié dans le dépôt, seules les parties qui changent le seront.

Cette déduplication est extrêmement efficace, à tel point que l'un de mes stockages contenant des releases de jeux vidéos, donc beaucoup de données redondantes, passe de 2 To à une sauvegarde de seulement 217 Go. Bon ok il s'agit d'un cas assez extrême, mais le gain de place est appréciable ! 😁️

À noter également que Borg peut compresser les chunks via différents algorithmes tels que LZ4 (par défaut), zlib, LZMA et zstd. Ce dernier me semble d'ailleurs assez intéressant en termes de ratio temps de calcul / efficacité.

Deuxième point important pour moi : la rapidité des sauvegardes. BorgBackup effectue des sauvegardes incrémentales ; seuls les morceaux de fichiers qui ont changé depuis la précédente sauvegarde sont envoyés dans le dépôt.

Troisièmement, la sécurité. BorgBackup peut chiffrer les sauvegardes, ce qui permet d'éviter que les données ne se retrouvent dans la nature si un jour le disque ou le serveur les stockant était perdu ou infiltré.

Quatrièmement, la possibilité de pouvoir faire aussi bien des sauvegardes sur du stockage « local » (dossier, disque dur externe, partages de fichier SMB, NFS, SSHFS ou autre monté localement) que sur un serveur distant via SSH.

Et pour finir, la simplicité. BorgBackup est facile à utiliser, et il est facile de parcourir les sauvegardes. Ces dernières peuvent en effet être montées comme n'importe quel système de fichier sous Linux (fusermount), ce qui permet de les parcourir avec les outils habituels (terminal, navigateur de fichier,...).

Convaincus ? Alors c'est parti ! 😉️

Dans ce premier article, je vais essentiellement vous parler des concepts de base de Borg, et vous expliquer comment faire (et manipuler) une sauvegarde sur un disque local. Je vous parlerais de la sauvegarde à distance via SSH dans un prochain article.

Contents

Concepts de base

Avant de commencer, on va faire un rapide point de vocabulaire.

Les sauvegardes de BorgBackup s'effectuent dans un dépôt (repo en anglais). Il s'agit tout simplement d'un dossier contenant les données sauvegardées ainsi qu'un ensemble de métadonnées associées.

Voici par exemple ce que contient un dépôt fraichement créé :

+-- 📂️ my-borg-repo/
    +-- 📂️ data/
    +-- 📄️ config
    +-- 📄️ hints.1
    +-- 📄️ index.1
    +-- 📄️ integrity.1
    +-- 📄️ nonce
    +-- 📄️ README

Les sauvegardes effectuées dans un dépôt sont appelées des archives. Une nouvelle archive est donc créée à chaque fois que vous lancez une sauvegarde avec Borg. On conserve généralement plusieurs archives dans un dépôt afin de pouvoir « remonter dans le temps » ; pour retrouver un fichier dans l'état dans lequel il était à une date donnée.

Voici par exemple une partie des archives présentes dans le dépôt contenant la sauvegarde de mon PC portable au moment où j'écris ces lignes :

mylaptop-6c0b6779     Sat, 2022-07-02 10:39:42 [...]
mylaptop-8aa6b519     Fri, 2022-07-29 12:01:03 [...]
mylaptop-dd5ae326     Mon, 2022-08-22 12:00:18 [...]
mylaptop-959e7858     Fri, 2022-09-30 12:00:58 [...]
mylaptop-733bdb15     Mon, 2022-10-31 12:00:48 [...]
mylaptop-d117d0ce     Wed, 2022-11-30 12:00:09 [...]
mylaptop-bb080950     Sat, 2022-12-31 15:38:52 [...]
[...]
mylaptop-6f364ce8     Thu, 2023-07-13 12:00:30 [...]
mylaptop-74dd5447     Mon, 2023-07-17 12:00:14 [...]
mylaptop-f6987d11     Tue, 2023-07-18 12:00:59 [...]
mylaptop-421f0704     Wed, 2023-07-19 12:00:39 [...]

Chacune des archives ci-dessus contient une copie des données de mon dossier home/ dans l'état dans lequel elles se trouvaient à la date de la sauvegarde. Comme vous pouvez le constater, je peux remonter jusqu'à un an dans le passé, ce qui me laisse largement le temps de récupérer un fichier supprimé par erreur. 😁️

Installation de BorgBackup

L'installation de BorgBackup est assez simple car il est disponible dans les dépôts de la plupart des distributions Linux. Il est également disponible dans les ports de plusieurs systèmes BSD, y compris pour macOS via Homebrew, et comme il s'agit d'un logiciel en Python, il peut également être installé avec pip.

Pour l'installer sous Debian / Ubuntu, le plus simple est de passer par apt :

sudo apt install borgbackup

Pour les autres distributions, les autres OS et les méthodes d'installation plus « exotiques » je vous laisse consulter la documentation d'installation officielle.

documentation d'installation officielle

Création d'un dépôt

Avant de pouvoir sauvegarder des données, il nous faut commencer par créer un dépôt pour les accueillir. Disons que je souhaite sauvegarder mes données sur un disque dur externe monté dans le dossier "/media/fabien/backup-hdd/". La commande pour créer le dépôt sur ce disque sera :

borg init --encryption=repokey /media/fabien/backup-hdd/my-borg-repo

L'option --encryption indique la méthode de chiffrement que l'on souhaite utiliser. Voici quelques-unes des valeurs possibles pour cette option :

Si, comme moi, vous avez choisi la méthode de chiffrement repokey, Borg va vous demander d'entrer un mot de passe. Choisissez en un fort et dont vous vous souviendrez. Si vous perdez ce mot de passe vous ne serez plus en mesure d'accéder à vos sauvegardes !

Enter new passphrase:
Enter same passphrase again:
Do you want your passphrase to be displayed for verification? [yN]: n
[...]

Votre dépôt est maintenant créé et devrait ressembler à ça, comme vu tout à l'heure :

+-- 📂️ my-borg-repo/
    +-- 📂️ data/
    +-- 📄️ config
    +-- 📄️ hints.1
    +-- 📄️ index.1
    +-- 📄️ integrity.1
    +-- 📄️ nonce
    +-- 📄️ README

Sauvegarder des données

Maintenant que l'on a créé le dépôt, nous allons pouvoir créer notre première archive. Imaginons pour l'exemple que je souhaite sauvegarder mes images et ma musique. La commande pour effectuer cette sauvegarde sera la suivante :

borg create                                                         \
    --list                                                          \
    /media/fabien/backup-hdd/my-borg-repo::'image-et-musique-{now}' \
    /home/fabien/Images/                                            \
    /home/fabien/Musique/

--------------------------------------------------------------------------------

📝️ Note:

--------------------------------------------------------------------------------

Note : Ici j'ai découpé la commande en plusieurs lignes pour en faciliter la lecture, mais vous pouvez l'écrire sur une seule ligne en supprimant les "\" qui échappent les fins de ligne.

--------------------------------------------------------------------------------

Si le dépôt est chiffré, Borg vous demandera le mot de passe puis procèdera à la sauvegarde. Cette opération peut prendre un certain temps, surtout la première fois puisque toutes les données vont devoir être copiées.

Détaillons un peu la commande ci-dessus.

la documentation de Borg sur les placeholders

Imaginons maintenant que je souhaite sauvegarder mes images, mais sans les fichiers PNG et JPEG (par ce que je fais ce que je veux 😛️). Je peux alors réécrire la commande précédente comme ceci :

borg create                                              \
    --list                                               \
    --exclude='*.png'                                    \
    --exclude='re:\.jpe?g


                              \
    /media/fabien/backup-hdd/my-borg-repo::'image-{now}' \
    /home/fabien/Images/

Il est possible d'utiliser des patterns dans divers formats, du globing simple (fnmatch) comme je l'ai fait pour les PNGs, aux regexp comme on peut le voir pour l'expression utilisée pour les JPEGs, préfixée de "re:". Pour plus d'informations sur les formats supportés, je vous laisse consulter la documentation de Borg au sujet des patterns.

la documentation de Borg au sujet des patterns

Je pense qu'on a fait le tour des points importants pour la création d'archives ; je vous laisse lire la documentation officielle si vous souhaitez plus de détails :

Documentation de borg create

Lister les archives

Pour lister les archives présentes dans notre dépôt, il suffit d'entrer la commande suivante :

borg list /media/fabien/backup-hdd/my-borg-repo

Cette fois encore Borg va vous demander le mot de passe du dépôt si celui-ci est chiffré, puis il affichera la liste des archives présentes dans le dépôt, ce qui donne un résultat similaire à celui-ci :

Enter passphrase for key /media/fabien/backup-hdd/my-borg-repo:
image-et-musique-2023-07-25T13:43:16 Tue, 2023-07-25 13:43:18 [270939a261d502d32329a7bbe65e71bcbffb6703c6fd544ea6bac68b3ef280be]
image-et-musique-2023-07-25T13:55:01 Tue, 2023-07-25 13:55:05 [ce0d94124a0027f5f447c0425b1cb3a62626fbfe009e28c8850b271d6f4fdf50]
image-et-musique-2023-07-25T13:58:19 Tue, 2023-07-25 13:58:21 [d5a8eb2f9abd9ecadbf133db6ad893c67288a7675eecfb06cb7b5e0533476459]
image-et-musique-2023-07-25T14:01:47 Tue, 2023-07-25 14:01:49 [ae6eeac54312b48aafe700275f2c4699647d1d552dc3cde93fa167db8a57ce22]

Il est également possible de lister les fichiers à l'intérieur d'une archive en précisant le nom de l'archive à la suite du chemin du dépôt, par exemple :

borg list /media/fabien/backup-hdd/my-borg-repo::image-et-musique-2023-07-25T13:43:16

Accéder aux données

Comme je l'ai indiqué plus tôt, l'accès aux données est très simple : on peut monter les sauvegardes comme un système de fichier. Pour cela il nous faut un dossier vide. Généralement le dossier "/mnt" est vide et peut être utilisé, sinon il suffit d'en créer un avec la commande "mkdir" :

mkdir /home/fabien/mes_sauvegardes

Ensuite on peut procéder au montage :

borg mount  /media/fabien/backup-hdd/my-borg-repo  /home/fabien/mes_sauvegardes

On peut à présent se promener dans l'ensemble des archives avec les outils habituels :

$ ls -l /home/fabien/mes_sauvegardes

drwxr-xr-x 1 fabien fabien 0 juil. 27 13:36 image-et-musique-2023-07-27T13:36:41
drwxr-xr-x 1 fabien fabien 0 août   3 13:52 image-et-musique-2023-08-03T13:52:16
drwxr-xr-x 1 fabien fabien 0 août   3 13:52 image-et-musique-2023-08-03T13:52:28
drwxr-xr-x 1 fabien fabien 0 août   3 13:52 image-et-musique-2023-08-03T13:52:47
drwxr-xr-x 1 fabien fabien 0 août   3 13:55 image-et-musique-2023-08-03T13:55:23
drwxr-xr-x 1 fabien fabien 0 août   3 13:56 image-et-musique-2023-08-03T13:56:34

Ici on a monté l'ensemble du dépôt mais il est également possible de n'accéder qu'à une seule archive si on le souhaite, il faudra alors préciser laquelle :

borg mount                                                                       \
    /media/fabien/backup-hdd/my-borg-repo::image-et-musique-2023-07-27T13:36:41  \
    /home/fabien/mes_sauvegardes

Cette fois-ci on retrouve uniquement les fichiers de l'archive visée dans point de montage :

$ ls -l /home/fabien/mes_sauvegardes

drwxr-xr-x 1 fabien fabien 0 août  28 13:09 home

Une fois que l'on a terminé de farfouiller dans les archives, on peut démonter le système de fichier à l'aide de la commande suivante :

borg umount /home/fabien/mes_sauvegardes

... Et éventuellement supprimer le dossier vide si on en avait créé un 😉️ :

rmdir /home/fabien/mes_sauvegardes

--------------------------------------------------------------------------------

📝️ Note:

--------------------------------------------------------------------------------

NOTE : Sur les gros dépôts, l'accès aux archives peut prendre un peu de temps. Lorsque vous allez faire le premier accès aux dossiers montés, le terminal peut freezer quelques dizaines de secondes, mais une fois ce ralentissement initial passé, la suite de la navigation sera fluide.

--------------------------------------------------------------------------------

Restaurer une sauvegarde

Pour restaurer une archive, il y a deux possibilités.

La première est de monter l'archive à restaurer comme on l'a vu dans la section précédente, et d'utiliser les outils classiques pour copier les fichiers (commande cp, rsync, ou même votre navigateur de fichier graphique).

La seconde solution est d'utiliser la commande "borg extract".

Si vous souhaitez utiliser cette seconde solution, je tiens à attirer votre attention sur le fait que l'extraction se fait dans le dossier courant ; il faudra donc se placer au bon endroit pour restaurer les fichiers.

Si je souhaite restaurer les images et les musiques que j'avais sauvegardées plus tôt, il faudra donc que je m'y prenne de la façon suivante :

# On va à la racine du disque car la sauvegarde contient le chemin des
# fichiers depuis la racine
cd /

# Puis on lance la restauration de l'archive désirée
borg extract  \
    --list    \
    /media/fabien/backup-hdd/my-borg-repo::image-et-musique-2023-07-27T13:36:41

Si le dépôt est chiffré, Borg nous demandera bien sûr le mot de passe, puis il procédera à l'extraction des fichiers. Ici encore, l'option --list permet de suivre la progression.

Il est également possible de demander à Borg de n'extraire que certains fichiers en particulier ou d'en ignorer d'autres. Je vous laisse consulter la documentation de Borg pour en savoir plus :

Documentation de borg extract

Faire le ménage

Après un certain temps d'utilisation, le dépôt peut contenir pas mal d'archives qui ne nous sont plus forcément utiles, il est alors temps de faire un peu de ménage.

Supprimer une archive

Pour supprimer une archive, il suffit d'utiliser la commande suivante :

borg delete /media/fabien/backup-hdd/my-borg-repo::image-et-musique-2023-07-27T13:36:41

Comme pour toutes les commandes Borg, l'archive à supprimer est à fournir sous la forme "<repository>::<archive_name>".

Il est également possible d'utiliser du globing dans le nom des archives pour supprimer toutes celles qui correspondent :

borg delete /media/fabien/backup-hdd/my-borg-repo::image-et-musique-2023-07-*

Ici on supprime toutes les archives « image et musique » de juillet 2023.

--------------------------------------------------------------------------------

⚠️ Warning

--------------------------------------------------------------------------------

ATTENTION : Faites bien attention à ce que vous donnez comme argument à la commande borg delete. Si vous fournissez seulement le chemin du dépôt sans préciser l'archive à supprimer, Borg procédera à la suppression de tout le dépôt, détruisant ainsi l'ensemble des archives qui le composent.

Il vous demandera toutefois de bien confirmer que c'est ce que vous souhaitiez faire :

$ borg delete /media/fabien/backup-hdd/my-borg-repo

Enter passphrase for key /media/fabien/backup-hdd/my-borg-repo:
You requested to completely DELETE the following repository *including* 6 archives it contains:
------------------------------------------------------------------------------
Repository ID: 420822b4348ffad3e32a4b2d982e664f1f28eabcb2ee9b87ad191c458649188d
Location: /media/fabien/backup-hdd/my-borg-repo
------------------------------------------------------------------------------
Type 'YES' if you understand this and want to continue:

--------------------------------------------------------------------------------

Je vous mets ci-dessous le lien de la documentation de Borg sur la suppression d'archive :

Documentation de borg delete

« Élaguer » le dépôt

Supprimer manuellement chaque archive en trop ne serait vraiment pas pratique, c'est pourquoi Borg fournit une commande pour « élaguer » le dépôt de manière plus intelligente. Voici un exemple de son utilisation :

borg prune                        \
    --list                        \
    --prefix 'image-et-musique-'  \
    --keep-daily '7'              \
    --keep-weekly '4'             \
    --keep-monthly '12'

Détaillons un peu les paramètres de la commande ci-dessus :

Calendrier des sauvegardes (note : la sauvegarde mensuelle de décembre 2022 n'a pas été représentée ici mais serait également conservée)

La commande borg prune prend pas mal d'autres arguments, pour conserver des archives annuelles, horaires, et même chaque minute ! Pour en savoir plus je vous mets le lien vers la documentation officielle :

Documentation de borg prune

Libérer l'espace de stockage

Lorsque l'on utilise les commandes borg delete et borg prune, Borg supprime les références aux archives demandées, mais il ne supprime pas les chunks qui ne sont plus utiles ; l'espace disque occupé par le dépôt ne diminue donc pas.

On peut facilement s'en rendre compte en comparant l'espace disque occupé avant et après une commande borg delete :

$ du -sh /media/fabien/backup-hdd/my-borg-repo
6,3G        /media/fabien/backup-hdd/my-borg-repo

$ borg delete /media/fabien/backup-hdd/my-borg-repo::image-et-musique-2023-07-27T13:36:41
Enter passphrase for key /media/fabien/backup-hdd/my-borg-repo:

$ du -sh /media/fabien/backup-hdd/my-borg-repo
6,3G        /media/fabien/backup-hdd/my-borg-repo

Comme vous pouvez le constater, le dépôt ne change pas de taille.

Pour libérer effectivement l'espace disque, il faudra faire appel à la commande borg compact :

borg compact --progress /media/fabien/backup-hdd/my-borg-repo

Borg ne demandera pas de mot de passe pour cette commande car il n'a pas besoin de déchiffrer les données pour éliminer les chunks qui ne sont plus utilisés.

Si on regarde à nouveau l'espace disque occupé par le dépôt, on s'aperçoit que cette fois-ci, il a bien diminué :

$ du -sh /media/fabien/backup-hdd/my-borg-repo
5,6G        /media/fabien/backup-hdd/my-borg-repo

Il n'y a pas grand-chose de plus à dire sur cette commande, je vous mets toutefois le lien vers la documentation pour référence :

Documentation de borg compact

Qu'arrive-t-il si une sauvegarde est interrompue ?

Que ce soit intentionnellement ou à cause d'une coupure de courant ou d'une perte de connexion réseau, c'est une question importante que je me suis très vite posée. Il ne serait en effet pas acceptable que le dépôt puisse être corrompu en cas d'interruption.

La première chose à savoir c'est que lors d'une sauvegarde, Borg n'écrit que de nouveaux chunks dans le dépôt, il ne modifie pas ceux existants. Il y a donc peu de chance qu'il arrive à corrompre lui-même ses données.

Le seul cas de dépôt corrompu auquel j'ai été confronté était dû à un disque défectueux et à l'utilisation d'un système de fichier qui n'a pas été en mesure de réparer les dégâts. C'est pourquoi il convient de disposer de plusieurs sauvegardes, stockées sur différents supports, si possible fiables (par exemple un RAID avec un système de fichiers capable de se réparer tout seul, comme Btrfs ou ZFS dans certaines configurations). Pour la petite histoire, la corruption n'était pas énorme et Borg a été capable de réparer les dégâts (avec la commande borg check --repair).

commande borg check --repair

Bref, ce qu'il faut retenir c'est qu'il y a vraiment très peu de chance que Borg puisse causer la corruption d'un dépôts, et c'est tant mieux.

Il y a par contre quelques points importants à savoir sur les interruptions de sauvegarde.

Checkpoints

Le premier c'est que Borg écrit des checkpoints à intervalle régulier (par défaut toutes les 30 minutes) ainsi que lors de l'interruption volontaire d'une sauvegarde (par exemple si vous tapez Ctrl+C dans la console).

Il est possible d'afficher les checkpoints en ajoutant le paramètre --consider-checkpoints à la commande borg list :

borg list --consider-checkpoints /media/fabien/backup-hdd/my-borg-repo

Ce qui va nous donner un résultat similaire à celui-ci:

[...]
image-et-musique-2023-08-03T13:56:34 Thu, 2023-08-03 13:56:36 [2b110ac4f8c38e79d3e3f58f3a1f3433f6ba26a4d445c9f3f10afb571c74dab1]
image-et-musique-2023-09-13T13:09:21 Wed, 2023-09-13 13:09:24 [76458cd366d9fa60703fe1ceae64e4380ee4949eb4c6bf8e50961ce7bf124df0]
image-et-musique-2023-09-13T13:10:05.checkpoint Wed, 2023-09-13 13:10:07 [5c0c61a49875b188920bbae20d8656935cc5f06bf1e638ce69fe6a31edb66e54]

On peut voir ici que le nom de la dernière archive se termine par .checkpoint. Il s'agit d'une archive partielle (elle ne contient pas toutes les données que l'on souhaitait y sauvegarder), et il est préférable de ne pas y toucher sauf si on est vraiment désespérés (si l'on ne dispose vraiment d'aucune archive complète ou que l'on cherche à restaurer un fichier récent qui ne se trouve dans aucune autre archive).

La prochaine fois que vous relancerez une sauvegarde à l'aide de la commande borg create, celui-ci ne touchera pas aux checkpoints et recommencera une nouvelle archive depuis zéro. Vous vous interrogez surement sur l'intérêt de ces checkpoints s'il ne faut pas y toucher et si on reprend tout depuis le début à chaque fois... À quoi ça peut bien servir ?

Eh bien la réponse vient du système de sauvegarde différentielle et de la déduplication des données. Borg va recommencer sa sauvegarde depuis zéro, MAIS comme une partie des données auront déjà été écrites dans le dépôt, elles n'auront pas besoin d'être compressées / chiffrées / transférées à nouveau ; la sauvegarde sera donc beaucoup plus rapide.

À noter que les checkpoints seront automatiquement supprimés par le prochain borg prune que vous lancerez, sauf s'il s'agit de l'archive la plus récente du dépôt. Ainsi, pour éliminer les archives en .checkpoint, le mieux et de relancer une sauvegarde complète avec borg create, puis de lancer un petit borg prune pour supprimer les archives (et les checkpoints) inutiles, et on peut éventuellement terminer par un borg compact pour libérer l'espace disque.

Lock

Le second point important à savoir lorsqu'une sauvegarde est brutalement interrompue, c'est que le dépôt peut se retrouver verrouillé. Borg place en effet un petit verrou lorsqu'il travaille sur un dépôt afin d'éviter les accès concurrents.

Si vous vous retrouvez dans cette situation, commencez par vérifier qu'aucun processus n'est en train d'accéder au dépôt (une autre machine qui serait en train d'effectuer une sauvegarde dans un dépôt commun par exemple), et si vous êtes certains que personne n'est en train de travailler sur le dépôt, déverrouillez-le à l'aide de la commande suivante :

borg break-lock /media/fabien/backup-hdd/my-borg-repo

Vous aurez alors à nouveau pleinement accès à vos sauvegardes.

Documentation de la commande borg break-lock

Conclusion

J'utilise Borg depuis un bout de temps maintenant et je n'ai jamais rencontré de problème insoluble et je n'ai jamais eu à douter de sa fiabilité. Je continuerai donc à l'utiliser partout où je le peux pour gérer mes sauvegardes.

Si le sujet vous intéresse, je vous invite à lire la FAQ de Borg qui est très intéressante et répond à pas mal de questions que l'on peut se poser :

FAQ de BorgBackup

Cet article est à présent terminé et je vous donne rendez-vous d'ici deux semaines environ pour un second article sur Borg, dans lequel on s'intéressera à la sauvegarde sur un serveur distant via SSH et à l'automatisation des sauvegardes.

Bonne journée ! 😁️

--------------------------------------------------------------------------------

🏠 Accueil