Borgbackup: sauvegarde sous linux

Pour réaliser des sauvegardes sous linux j’utilise souvent l’utilitaire rsync. Cela me permet via un crontab de réaliser un copie parfaite sur un autre disque (distant ou non) et via le réseau si necessaire (ssh).

Malheureusement il s’agit d’une copie et donc de nombreux cas ne sont pas géré:

  • gestion de l’historisation des modifications d’un fichier
  • historisation globale
  • purge des historiques

Et cela consiste à une copie simple: pas de compression, pas de check sum, …

Heureusement j’ai trouvé un outil simple pour réaliser mes sauvegardes borgbackup

Installation

Borg est très performant et est écrit en python. La façon la plus simple de l’installer reste donc pip. De plus il nécessite quelques pré-requis

apt-get update
apt-get install python3-pip libssl-dev liblz4-dev libacl1-dev
pip3 install borgbackup

Note

Dans notre exemple j’utilise python en version 3

Usage

Nous allons partir d’un cas simple:

  • génération de notre dépot de sauvegarde ($HOME/bkp)
  • création du répertoire qui va contenir nos données ($HOME/test)
  • création / modification de fichier avec des sauvegardes régulières
mkdir $HOME/bkp
borg init $HOME/bkp
mkdir $HOME/test
echo "tutu" > $HOME/test/test1.txt
borg create -v --stats $HOME/bkp::{hostname}_{now:%Y-%m-%d-%s} $HOME/test
sleep 2
echo "tutu" > $HOME/test/test2.txt
borg create -v --stats $HOME/bkp::{hostname}_{now:%Y-%m-%d-%s} $HOME/test
sleep 2
echo "tutu" >> $HOME/test/test2.txt
borg create -v --stats $HOME/bkp::{hostname}_{now:%Y-%m-%d-%s} $HOME/test
sleep 2
rm $HOME/test/test2.txt
borg create -v --stats $HOME/bkp::{hostname}_{now:%Y-%m-%d-%s} $HOME/test

Note

lors de la création du repository on peut spécifier si il est crypter ou non et par quelle type de cryptation.

Comme on peut le voir la commande à utiliser est borg.

On peut maintenant lister nos sauvegardes

borg list $HOME/bkp
> debian_2017-01-21-37                 Sat, 2017-01-21 10:53:37
> debian_2017-01-21-40                 Sat, 2017-01-21 10:53:40
> debian_2017-01-21-42                 Sat, 2017-01-21 10:53:42
> debian_2017-01-21-44                 Sat, 2017-01-21 10:53:44

Note

les noms des sauvegardes sont issues de la ligne {hostname}_{now:%Y-%m-%d-%s}

Nous pourrions vouloir avoir des infos sur la sauvegarde nommée debian_2017-01-21-42

borg info $HOME/bkp::debian_2017-01-21-42
Name: debian_2017-01-21-42
Fingerprint: edf23fdfa34c3f5d35b5ab5033b1cc85e981faca69fd8316f1659bf0c88a20f6
Hostname: debian
Username: root
Time (start): Sat, 2017-01-21 10:53:42
Time (end):   Sat, 2017-01-21 10:53:42
Command line: /usr/local/bin/borg create -v --stats /root/bkp::{hostname}_{now:%Y-%m-%d-%S} /root/test
Number of files: 2

                   Original size      Compressed size    Deduplicated size
This archive:                  874 B              1.05 kB                998 B
All archives:                3.16 kB              3.76 kB              3.57 kB

                   Unique chunks         Total chunks
Chunk index:                      10                   14

Nous pourrions vouloir lister les fichiers contenus dans la sauvegarde nommée debian_2017-01-21-42

borg list $HOME/bkp::debian_2017-01-21-42
drwxr-xr-x root   root          0 Sat, 2017-01-21 10:53:39 root/test
-rw-r--r-- root   root          5 Sat, 2017-01-21 10:53:37 root/test/test1.txt
-rw-r--r-- root   root         10 Sat, 2017-01-21 10:53:42 root/test/test2.txt

Dans l’état actuel notre fichier test2.txt n’existe plus … nous pouvons le récuperer ainsi dans le répertoire $HOME/restore

mkdir $HOME/restore
cd $HOME/restore
borg extract $HOME/bkp::debian_2017-01-21-42 root/test/test2.txt

On pourrait aussi vouloir restaurer toutes la sauvegarde

cd /
borg extract $HOME/bkp::debian_2017-01-21-42

Gestion des sauvegardes

Le problème d’un vrai outil de sauvegarde est la gestion des sauvegardes elle même.

Leur lancement est assez simple et un simple cron permet leur automatisation.

Par contre il faut supprimer régulièrement les versions de sauvegarde qui n’ont pas d’intérêt tout en sauvegardant les autres.

On peut réaliser ces tâches manuellement

borg delete $HOME/bkp::debian_2017-01-21-42
borg delete $HOME/bkp #supp du répository entier

Ou laisser faire borg avec l’option prune qui permet de mettre en place des règles compliquées

Par exemple je souhaite conserver

  • toutes les sauvegardes des 10 derniers jours
  • les 4 dernières sauvegardes
  • la dernière sauvegarde de chaque mois
borg prune -v --keep-within=10d --keep-weekly=4 --keep-monthly=-1 $HOME/bkp

A lancer après chaque sauvegarde

Un autre exemple plus simple qui permet

  • de garder une sauvegarde par mois
  • de garder toutes sauvegardes de moins de 30j
borg prune -v --keep-within=30d --keep-monthly=-1 $HOME/bkp

Gestion d’un repository distant par ssh

Il est possible d’utiliser un repository de sauvegarde distant accessible par ssh.

Pour cela il faut utiliser à la place de $HOME/bkp la syntaxe suivante

ssh://user@host:port/path/to/repo

On peut de plus identifier le repository via une variable d’environnement

export BORG_REPO='ssh://user@host:port/path/to/repo'

Utilisation de fuse

Borg permet de “monter” les sauvegardes comme un disque. cela est pratique mais nécessite l’utilisation de point de montage fuse.

L’installation de borg est modifié

apt-get install libfuse-dev fuse pkg-config
pip3 install borgbackup[fuse]

L’utilisation reste identique, mais il est possible maintenant de monter une archive sans l’extraire

mkdir $HOME/mnt
borg mount $HOME/bkp::debian_2017-01-21-42 $HOME/mnt
borg umount $HOME/mnt

Warning

Sous windows avec docker pour avoir accès aux archives avec fuse il faut lancer les containers avec les paramètres

docker run --cap-add SYS_ADMIN --privileged