Logiciels en ligne de commande

Borg Backup : Gérer ses backups sous Linux

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

borg-logo



Introduction



BorgBackup (Borg) est un programme de sauvegarde par déduplication.

Borg permet de fournir un moyen efficace et sûr de sauvegarder des données. Il supporte la compression et le chiffrement.
- La technique de déduplication des données rend Borg approprié pour les sauvegardes quotidiennes puisque seules les modifications sont sauvegardées.
- La technique de chiffrement est adaptée aux sauvegardes vers des destinations qui ne sont pas totalement fiables.

Il ne sauvegarde pas en mode fichier comme un bon vieux rsync mais il propose des fonctions intéressantes, ce qui peut répondre à votre besoin.
Par conséquent, pour accéder aux sauvegardes, vous devez donc disposer d'un système ayant borg d'installé.

Nous allons voir comment paramétrer tout ça.

Installation



Suivant votre distribution Linux, il suffit d'installer le paquet borgbackup :

Gentoo :
Code BASH :
emerge -av app-backup/borgbackup


Fedora / RedHat et dérivées (Nécessite EPEL) :
Code BASH :
dnf install borgbackup


Debian :
Code BASH :
apt install borgbackup


Utilisation



Dans l'exemple de ce tutoriel, j'utilise un point de montage local /backup sur lequel le disque de sauvegarde est monté.

A noter que le dossier de destination de sauvegarde doit être complètement vierge. Si vous utilisez un disque dédié, formaté en ext4 par exemple, le dossier lost+found posera problème.
Créez simplement un dossier sur votre disque.
Code BASH :
mkdir /backup/borg


Initialiser le dépôt borg



Avant de lancer notre première sauvegarde, il faut créer un repository.
Cela permet de créer dans la destination directement les métadonnées qui vont bien.

Pour cela on va utliser la commande borg init.

Dépôt classique



Pour créer un repository sans chiffrement :
Code BASH :
borg init -e none /backup/borg


Si on veut utiliser un dépôt distant à travers SSH, on utilisera la syntaxe suivante (avec destination = 192.168.21.105 et port SSH 22) :

Code BASH :
borg init -e none ssh://adrien@192.168.21.105:22/backup/adrien


Dépôt chiffré



Pour protéger le repository avec une passphrase :
Code BASH :
borg init -e  repokey /backup/borg


la passphrase vous sera demandée 2 fois :

Code TEXT :
Enter new passphrase: 
Enter same passphrase again: 
IMPORTANT: you will need both KEY AND PASSPHRASE to access this repo!
If you used a repokey mode, the key is stored in the repo, but you should back it up separately.
Use "borg key export" to export the key, optionally in printable format.
Write down the passphrase. Store both at safe place(s).


C'est le couple passphrase + clé qui vous permet de déchiffrer le contenu. Pensez bien à sauvegarder cette clé au cas où, qui est stockée dans le repo lui même.

Si on veut utiliser un dépôt distant à travers SSH, on utilisera la syntaxe suivante (avec destination = 192.168.21.105 et port SSH 22) :

Code BASH :
borg init -e repokey ssh://adrien@192.168.21.105:22/backup/adrien


Créer une sauvegarde



Pour créer notre sauvegarde, on va utiliser la commande borg create :

On se positionnera dans le dossier concerné avant :
Code BASH :
cd /home/adrien


Code BASH :
borg create --stats -C zstd,10 /backup/borg::20230119 .


Quelques explications :
--stats : Permet d'afficher des statistiques si vous le voulez
-C : Permet d'utiliser la compression si vous le voulez
/backup/borg::20230119 : Le chemin du repo, suivi de :: suivi du nom de la sauvegarde
. : Le dossier à sauvegarder (ici le dossier courant) On peut évidemment mettre plusieurs dossiers, comme avec la commande tar.

Pour l'option -C, vous avez l'autocomplétion disponible avec les algorithmes et les "forces" de compression. Chez moi j'ai :
Code TEXT :
auto     lzma,4   none     zlib,6   zstd,11  zstd,17  zstd,22  zstd,8
lz4      lzma,5   zlib,1   zlib,7   zstd,12  zstd,18  zstd,3   zstd,9
lzma,0   lzma,6   zlib,2   zlib,8   zstd,13  zstd,19  zstd,4   
lzma,1   lzma,7   zlib,3   zlib,9   zstd,14  zstd,2   zstd,5   
lzma,2   lzma,8   zlib,4   zstd,1   zstd,15  zstd,20  zstd,6   
lzma,3   lzma,9   zlib,5   zstd,10  zstd,16  zstd,21  zstd,7 


Vous pouvez utiliser d'autres options sympa :
--progress : permet d'afficher la progression de la création de la sauvegarde.
--exclude : permet d'exclure des dossiers (peut être utilisé plusieurs fois)

Voici un exemple avec progress et 2 dossiers exclus :
Code BASH :
borg create --progress -C zstd,10 --exclude '.cache' --exclude 'Téléchargements' /backup/borg::20230119 .


Si vous sauvegardez sur un repository chiffré, la passphrase vous sera demandée.

Grâce à l'option stats, on a ce type de sortie après la sauvegarde :
Code TEXT :
------------------------------------------------------------------------------
Repository: /backup/borg
Archive name: 20230119
Archive fingerprint: 10855358175d9bb31f8b52dee8c13c438d3392581ee15f44b8fbeebbb8872b59
Time (start): Thu, 2023-01-19 19:01:32
Time (end):   Thu, 2023-01-19 19:05:33
Duration: 4 minutes 1.15 seconds
Number of files: 26354
Utilization of max. archive size: 0%
------------------------------------------------------------------------
                     Original size    Compressed size  Deduplicated size
This archive:              4.31 GB            2.40 GB            2.23 GB
All archives:              4.31 GB            2.40 GB            2.23 GB
                       Unique chunks     Total chunks
Chunk index:                   22656            27245
----------------------------------------------------------------------


Evidemment, vous ne pouvez pas utiliser deux fois la même commande, chaque nom de sauvegarde doit être unique !

Si on veut utiliser un dépôt distant à travers SSH, on utilisera la syntaxe suivante (avec destination = 192.168.21.105 et port SSH 22) :

Code BASH :
borg create --stats -C zstd,10 ssh://adrien@192.168.21.105:22/backup/adrien::20230119 .


Lister les backups



Pour visualiser les backups sur un repository, on utilisera borg list :

Code BASH :
borg list /backup/borg/


Qui produit ceci :

Code TEXT :
20230119          Thu, 2023-01-19 19:01:32 [10855358175d9bb31f8b52dee8c13c438d3392581ee15f44b8fbeebbb8872b59]


Si vous listez un repository chiffré, la passphrase vous sera demandée.

Si on veut utiliser un dépôt distant à travers SSH, on utilisera la syntaxe suivante (avec destination = 192.168.21.105 et port SSH 22) :

Code BASH :
borg list ssh://adrien@192.168.21.105:22/backup/adrien


Lister le contenu d'un backup



Pour visualiser le contenu d'un backup particuluer sur un repository, on utilisera borg list également mais avec la même syntaxe que lors de la création avec les deux fois deux points :

Code BASH :
borg list /backup/borg::20230119


Ce qui sort une liste dont je vous mets un extrait (avec les permissions à la ls -l ) :

Code TEXT :
-rw-r--r-- adrien adrien  5258765 Tue, 2021-07-20 17:40:41 Téléchargements/anydesk_6.1.1-1_x86_64.rpm
drwxr-xr-x adrien adrien        0 Wed, 2018-12-26 18:58:19 Modèles
drwxr-xr-x adrien adrien        0 Wed, 2018-12-26 18:58:19 Public
drwxr-xr-x adrien adrien        0 Wed, 2023-01-04 18:23:27 Documents
-rw-r--r-- adrien adrien   659165 Mon, 2019-03-04 18:37:39 Documents/vigiXXX (copie).xcf
drwx------ adrien adrien        0 Thu, 2021-08-12 07:45:02 Documents/AnyDesk
-rw-r--r-- adrien adrien       38 Thu, 2016-04-14 14:48:38 Documents/.directory
-rw-r--r-- adrien adrien    17815 Mon, 2020-11-23 07:15:36 Documents/DHCP.odp
-rw-r--r-- adrien adrien  2129121 Thu, 2020-07-30 10:49:19 Documents/Escape - Eveningland.mp3
-rw-r--r-- adrien adrien     9527 Thu, 2022-11-17 21:59:46 Documents/LOL_Vivaldi.xlsx
-rw-r--r-- adrien adrien   293195 Tue, 2022-05-03 23:08:26 Documents/Sans titre.jpg
-rw-r--r-- adrien adrien   184252 Sat, 2023-01-07 11:24:16 Documents/Sans titre.png
-rw-r--r-- adrien adrien   238643 Sat, 2022-01-01 18:41:49 Documents/annee-2022-lt.jpg
-rw-r--r-- adrien adrien   258725 Thu, 2022-07-28 10:36:14 Documents/bp-remarque.png
 


Si vous listez un backup d'un repository chiffré, la passphrase vous sera demandée.

Si on veut utiliser un dépôt distant à travers SSH, on utilisera la syntaxe suivante (avec destination = 192.168.21.105 et port SSH 22) :

Code BASH :
borg list ssh://adrien@192.168.21.105:22/backup/adrien::20230119


Informations sur un backup



Si vous désiez des informations globales sur un backup, c'est la commande borg info, avec la même syntaxe que lors de la création avec les deux fois deux points :

Code BASH :
borg info /backup/borg::20230119


Ce qui produit ceci :

Code TEXT :
Repository: /backup/borg
Archive name: 20230119
Archive fingerprint: 10855358175d9bb31f8b52dee8c13c438d3392581ee15f44b8fbeebbb8872b59
Comment: 
Hostname: fedora
Username: root
Time (start): Thu, 2023-01-19 19:01:32
Time (end): Thu, 2023-01-19 19:05:33
Duration: 4 minutes 1.15 seconds
Number of files: 26354
Command line: /usr/bin/borg create --stats -C zstd,10 /backup/borg::20230119 .
Utilization of maximum supported archive size: 0%
----------------------------------------------------------------------
                     Original size    Compressed size  Deduplicated size
This archive:              4.31 GB            2.40 GB            2.23 GB
All archives:              4.31 GB            2.40 GB            2.23 GB
                       Unique chunks     Total chunks
Chunk index:                   22656            27245
----------------------------------------------------------------------


Si on veut utiliser un dépôt distant à travers SSH, on utilisera la syntaxe suivante (avec destination = 192.168.21.105 et port SSH 22) :

Code BASH :
borg info ssh://adrien@192.168.21.105:22/backup/adrien::20230119


L'intérêt de borg, la déduplication



Borg Backup, comme je l'ai dit en introduction permet la déduplication.
Par rapport à rsync, une sauvegarde suivante va tenir compte de ce qui est déjà présent dans le repository et va dédupliquer la sauvegarde.

C'est un gros plus par rapport à rsync.

Si je supprime quelques fichiers, et que je relance une sauvegarde avec borg create, c'est beauciup plus rapide :

Code BASH :
borg create --stats -C zstd,10 /backup/borg::20230119-2 .


Voilà la sortie produite :

Code TEXT :
Repository: /backup/borg
Archive name: 20230119-2
Archive fingerprint: cf1a5b5379437ee2a7a55c82325d976bd884d9d499e5e7486e776c8e95e7ae1e
Time (start): Thu, 2023-01-19 19:19:49
Time (end):   Thu, 2023-01-19 19:19:56
Duration: 6.49 seconds
Number of files: 26347
Utilization of max. archive size: 0%
------------------------------------------------------------------------
                     Original size    Compressed size  Deduplicated size
This archive:              3.71 GB            1.81 GB          287.56 kB
All archives:              8.01 GB            4.21 GB            2.23 GB
                       Unique chunks       Total chunks
Chunk index:                   22666              54250
------------------------------------------------------------------------


On voit que la sauvegarde est très rapide,

On pourra reprendre l'état d'un chichier à chaque sauvegarde.
Là où rsync fait de la sauvegarde incrémentale et vous avez uniquement la version du fichier de la dernière exécution de la commande rsync.

Restaurer des éléments



Si on fait une sauvegarde, c'est pour vous sauver la vie le jour où vous avez besoin de récupérer un ou des fichiers.

La commande qui nous sera utile sera borg extract avec la même syntaxe que lors de la création avec les deux fois deux points :

Sans argument, ça réextrait toute la sauvegarde dans le dossier courant :
Code BASH :
borg extract --progress /backup/borg::20230119


L'option --progress permet de voir où borg en est dans l'extraction !

Evidemment vous pouvez récupérer que quelques éléments en les passant en argument (comme tar), ici le dossier Téléchargements par exemple :

Code BASH :
borg extract --progress /backup/borg::20230119 Téléchargements


Si vous restaurer en tant que root des fichiers d'un autre utilisateur, les données sont extraites dans un premier temps avec le propriétaire root et les droits sont appliqués après l'extraction de tous les fichiers.

Si on veut utiliser un dépôt distant à travers SSH, on utilisera la syntaxe suivante (avec destination = 192.168.21.105 et port SSH 22) :

Code BASH :
borg extract --progress ssh://adrien@192.168.21.105:22/backup/adrien::20230119


Supprimer des backup



Si je vous relance un borg list j'ai ici 4 backups pour la démo :

Code TEXT :
20230119         Thu, 2023-01-19 19:01:32 [10855358175d9bb31f8b52dee8c13c438d3392581ee15f44b8fbeebbb8872b59]
20230119-2       Thu, 2023-01-19 19:19:49 [cf1a5b5379437ee2a7a55c82325d976bd884d9d499e5e7486e776c8e95e7ae1e]
20230119-3       Thu, 2023-01-19 19:24:25 [e91320464b75d48bf72d6e1f14de0403df9cefb50d91a66a39a5d04585f9ac8b]
20230119-4       Thu, 2023-01-19 19:24:43 [9ba338b605faed78d75321dfc04c889be41f81b2d222d2cf77d67d8134767b30]


Si je veux supprimer un backup, on va utiliser la commande borg delete avec la même syntaxe que lors de la création avec les deux fois deux points :

Code BASH :
borg delete /backup/borg::20230119-2


Et si je reliste avec borg list le backup 2 a disparu :

Code TEXT :
20230119         Thu, 2023-01-19 19:01:32 [10855358175d9bb31f8b52dee8c13c438d3392581ee15f44b8fbeebbb8872b59]
20230119-3       Thu, 2023-01-19 19:24:25 [e91320464b75d48bf72d6e1f14de0403df9cefb50d91a66a39a5d04585f9ac8b]
20230119-4       Thu, 2023-01-19 19:24:43 [9ba338b605faed78d75321dfc04c889be41f81b2d222d2cf77d67d8134767b30]


Evidemment, les 3 autres sauvegardes sont bien intactes, borg gère tout comme un grand.

Si on veut utiliser un dépôt distant à travers SSH, on utilisera la syntaxe suivante (avec destination = 192.168.21.105 et port SSH 22) :

Code BASH :
borg delete ssh://adrien@192.168.21.105:22/backup/adrien::20230119-2



Garder les X derniers backups



Parfois on peut avoir besoin de garder que les X derniers backups. Cela peut être utile dans le cas d'une automatisation via script.

Pour cela on va utiliser la commande borg prune, je vous montre ici avec les 2 derniers :

Code BASH :
borg prune --keep-last 2 /backup/borg


Une fois fait, si je liste à nouveau, il ne me reste que les 2 derniers :

Code TEXT :
20230119-3       Thu, 2023-01-19 19:24:25 [e91320464b75d48bf72d6e1f14de0403df9cefb50d91a66a39a5d04585f9ac8b]
20230119-4       Thu, 2023-01-19 19:24:43 [9ba338b605faed78d75321dfc04c889be41f81b2d222d2cf77d67d8134767b30]


Evidemment, 2 est excessif dans cet exemple.
Sachant que borg déduplique, compresse également, vous pouvez en garder plus !

Si on veut utiliser un dépôt distant à travers SSH, on utilisera la syntaxe suivante (avec destination = 192.168.21.105 et port SSH 22) :

Code BASH :
borg prune --keep-last 2 ssh://adrien@192.168.21.105:22/backup/adrien


Automatisation



Il est possible d'automatiser ses backup avec plusieurs actions :
- Soit par un script avec les différentes commandes
- Soit avec borgmatic

Pour installer borgmatic :

Gentoo :
Code BASH :
emerge -av app-backup/borgmatic


Fedora / red Hat et dérivées (EPEL requis) :
Code BASH :
dnf install borgmatic


Debian :
Code BASH :
apt install borgmatic


Pour générer une config modèle :

Code BASH :
generate-borgmatic-config


Code TEXT :
Generated a sample configuration file at /etc/borgmatic/config.yaml.
This includes all available configuration options with example values. The few
required options are indicated. Please edit the file to suit your needs.


Par défaut le fichier /etc/borgmatic/config.yaml est extrèmement commenté.

Voici un exemple de ce qu'on peut produire pour faire comme dans les exemples ci-dessus :

Code TEXT :
location:
    source_directories:
        - .
    repositories:
        - /backup/borg
    working_directory: /home/adrien
    exclude_patterns:
        - .cache
        - Téléchargements
storage:
    # encryption_passphrase: "super_pass_phrase"
    compression: zstd,10
    # upload_rate_limit: 100
    # ssh_command: ssh -i /path/to/private/key
    archive_name_format: '{hostname}-backup-{now:%Y%m%d}'
retention:
    keep_daily: 7
    prefix: '{hostname}-backup-'


Je vous ai laissé en commentaire des choses utiles si vous avez un backup chiffré ou distant

Ensuite pour lancer un backup avec les options de ce fichier de configuration, rien de plus facile :

Code BASH :
borgmatic


Quelques options possibles :
-v1 : permet d'avoir un peu de verbosité
-n : permet de tester l'exécution mais ne fait rien

Voici un exemple de sortie d'un test via :

Code BASH :
borgmatic -n -v1


Code TEXT :
/backup/borg: Pruning archives (dry run; not making any changes)
/backup/borg: Compacting segments (dry run; not making any changes)
/backup/borg: Skipping compact (dry run)
/backup/borg: Creating archive (dry run; not making any changes)
Creating archive at "/backup/borg::fedora-backup-20230119"
/backup/borg: Running consistency checks
Skipping repository check due to configured frequency; 29 days, 23:57:41.478761 until next check
Skipping archives check due to configured frequency; 29 days, 23:57:41.478409 until next check
summary:
/etc/borgmatic/config.yaml: Successfully ran configuration file


Après y a plus qu'à mettre dans crontab pour planifier !