Table des matières

Borg

Initialiser un repo de backup

Local

# borg init -e keyfile /mnt/data/backups/raspberrypi
Enter new passphrase: 
Enter same passphrase again: 
Do you want your passphrase to be displayed for verification? [yN]: y
Your passphrase (between double-quotes): "maSuperLongueEtCompliquéePassphrase"
Make sure the passphrase displayed above is exactly what you wanted.
 
By default repositories initialized with this version will produce security
errors if written to with an older version (up to and including Borg 1.0.8).
 
If you want to use these older versions, you can disable the check by runnning:
borg upgrade --disable-tam '/mnt/data/backups/raspberrypi'
 
See https://borgbackup.readthedocs.io/en/stable/changes.html#pre-1-0-9-manifest-spoofing-vulnerability for details about the security implications.
# ls -al /mnt/data/backups/raspberrypi/
total 68
drwxr-xr-x 3 root root  4096 jun 29 15:45 .
drwxr-xr-x 3 root root  4096 jun 29 15:43 ..
-rw------- 1 root root   164 jun 29 15:44 config
drwx------ 3 root root  4096 jun 29 15:45 data
-rw------- 1 root root    31 jun 29 15:45 hints.0
-rw------- 1 root root 41258 jun 29 15:45 index.0
-rw------- 1 root root    26 jun 29 15:44 README

Distant

Je veux sauvegarder un serveur A sur un serveur B. La première chose à faire est de créer une clé SSH sur le serveur A et les accès qui vont bien sur le serveur B.

Sur le serveur B, qui va accueillir le backup, je prépare le dossier :

$ sudo mkdir /mnt/data/backups/serveurA
$ sudo chown -R serveurA:serveurA /mnt/data/backups/serveurA

Sur le serveur A, qui envoie son backup sur B, j'initialise le repository :

root@debian:/home/simon# borg init --encryption=repokey-blake2 serveurA@serveurB:/mnt/data/backups/serveurA
Enter new passphrase: 
Enter same passphrase again: 
Do you want your passphrase to be displayed for verification? [yN]: y
Your passphrase (between double-quotes): "MaGrossePassPhraseQueJeDonneraiPas"
(...)

On peut vérifier sur le serveurB :

$ ls -al /mnt/data/backups/serveurA/
total 68
drwxr-xr-x 3 serveurA serveurA  4096 jui 29 14:25 .
drwxr-xr-x 4 root    root       4096 jui 29 14:21 ..
-rw------- 1 serveurA serveurA   919 jui 29 14:25 config
drwx------ 3 serveurA serveurA  4096 jui 29 14:25 data
-rw------- 1 serveurA serveurA    31 jui 29 14:25 hints.0
-rw------- 1 serveurA serveurA 41258 jui 29 14:25 index.0
-rw------- 1 serveurA serveurA    26 jui 29 14:21 README

Pour ce serveur, j'ai configuré la suite avec Borgmatic.

Faire un premier backup

# borg create -v -s -p -C lzma,6 --exclude-from=/mnt/data/backups/raspberrypi-exclude /mnt/data/backups/raspberrypi::{hostname}-{now:%Y%m%d-%H%M%S} /
Enter passphrase for key /root/.config/borg/keys/mnt_data_backups_raspberrypi: 
2.53 GB O 1.41 GB C 1.37 GB D 64649 N var/lib/docker/overlay2/dd058fc33661deeca3f305d03...itemap-1.2.0/spec/fixtures/_posts/2016-04-02-错误.ht------------------------------------------------------------------------------                                                                
Archive name: raspberrypi-20190629-155955
Archive fingerprint: 7526334a84d9a8db637909dac461073e10a8f9fa4300f6b205459c1ee802ceee
Time (start): Sat, 2019-06-29 16:00:24
Time (end):   Sat, 2019-06-29 19:25:53
Duration: 3 hours 25 minutes 28.50 seconds
Number of files: 102169
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
This archive:                3.00 GB              1.55 GB              1.50 GB
All archives:                3.00 GB              1.55 GB              1.50 GB
 
                       Unique chunks         Total chunks
Chunk index:                   85977               100707
------------------------------------------------------------------------------

Le fichier raspberrypi-exclude contient les répertoire que je ne veux pas sauvegarder :

# cat /mnt/data/backups/raspberrypi-exclude
/mnt
/dev
/media
/proc
/run
/sys
/tmp
~/.cache/
/var/cache/

Un “borg list” nous montre bien ce premier backup :

# borg list /mnt/data/backups/raspberrypi/
Enter passphrase for key /root/.config/borg/keys/mnt_data_backups_raspberrypi: 
raspberrypi-20190629-155955          Sat, 2019-06-29 16:00:24

Alias et second backup :

# cat ~/.bash_aliases 
alias backup='borg create -v -s -p -C lzma,6 --exclude-from=/mnt/data/backups/raspberrypi-exclude /mnt/data/backups/raspberrypi::{hostname}-{now:%Y%m%d-%H%M%S} /'
 
# backup 
Enter passphrase for key /root/.config/borg/keys/mnt_data_backups_raspberrypi: 
------------------------------------------------------------------------------
Archive name: raspberrypi-20190630-100756
Archive fingerprint: 8f2aae9f8f3db9e086c746f686ddc999c8996e470cd066524509b6eb47253e7a
Time (start): Sun, 2019-06-30 10:08:10
Time (end):   Sun, 2019-06-30 10:11:54
Duration: 3 minutes 44.00 seconds
Number of files: 100691
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
This archive:                2.21 GB            806.89 MB              2.19 MB
All archives:                5.21 GB              2.36 GB              1.51 GB
 
                       Unique chunks         Total chunks
Chunk index:                   86057               199693
------------------------------------------------------------------------------

3 min 44 !

# borg list /mnt/data/backups/raspberrypi
Enter passphrase for key /root/.config/borg/keys/mnt_data_backups_raspberrypi: 
raspberrypi-20190629-155955          Sat, 2019-06-29 16:00:24
raspberrypi-20190630-100756          Sun, 2019-06-30 10:08:10

Info

# borg info /mnt/data/backups/raspberrypi::raspberrypi-20190630-100756
Enter passphrase for key /root/.config/borg/keys/mnt_data_backups_raspberrypi: 
Name: raspberrypi-20190630-100756
Fingerprint: 8f2aae9f8f3db9e086c746f686ddc999c8996e470cd066524509b6eb47253e7a
Hostname: raspberrypi
Username: root
Time (start): Sun, 2019-06-30 10:08:10
Time (end):   Sun, 2019-06-30 10:11:54
Command line: /usr/bin/borg create -v -s -p -C lzma,6 --exclude-from=/mnt/data/backups/raspberrypi-exclude /mnt/data/backups/raspberrypi::{hostname}-{now:%Y%m%d-%H%M%S} /
Number of files: 100691
 
                       Original size      Compressed size    Deduplicated size
This archive:                2.21 GB            806.89 MB              2.19 MB
All archives:                5.21 GB              2.36 GB              1.51 GB
 
                       Unique chunks         Total chunks
Chunk index:                   86057               199693

List et mount

On a déjà vu la commande bord list qui permet de voir les différentes sauvegardes effectuées. On peut aussi l'utiliser pour afficher tous les fichiers sauvegardés. (Attention, ça va afficher des centaines/milliers de lignes… C'est intéressant seulement pour vérifier qu'un fichier particulier est bien sauvegardé, j'imagine.)

# borg list /mnt/data/backups/raspberrypi::raspberrypi-20190630-100756

Monter une sauvegarde avec mount

On crée un dossier pour le point de montage et on monte notre sauvegarde dedans :

# mkdir /mnt/borg
 
# borg mount /mnt/data/backups/raspberrypi /mnt/borg/
Enter passphrase for key /root/.config/borg/keys/mnt_data_backups_raspberrypi:
 
# ls -al /mnt/borg/
total 4
drwxr-xr-x 1 root root    0 jun 30 11:01 .
drwxr-xr-x 4 root root 4096 jun 30 11:01 ..
drwxr-xr-x 1 root root    0 jun 30 11:01 raspberrypi-20190629-155955
drwxr-xr-x 1 root root    0 jun 30 11:01 raspberrypi-20190630-100756

On peut aller fouille une archive avec cette méthode :

# ls -al /mnt/borg/raspberrypi-20190630-100756/
total 10150
drwxr-xr-x 1 root root        0 jun 30 11:01 .
drwxr-xr-x 1 root root        0 jun 30 11:01 .
drwxr-xr-x 1 root root        0 jun 30 11:01 ..
drwxr-xr-x 1 root root        0 mai 17 12:16 bin
drwxr-xr-x 1 root root        0 jan  1  1970 boot
-rw------- 1 root root 10391552 aoû 28  2016 core
-rw-r--r-- 1 root root     2030 aoû 27  2016 equipment.dat
drwxr-xr-x 1 root root        0 jun 29 15:09 etc
drwxr-xr-x 1 root root        0 sep  3  2018 home
drwxr-xr-x 1 root root        0 jun 29 15:09 lib
drwx------ 1 root root        0 mai 27  2016 lost+found
drwxr-xr-x 1 root root        0 nov 20  2018 opt
drwx------ 1 root root        0 jun 30 10:07 root
drwxr-xr-x 1 root root        0 jun 29 15:09 sbin
drwxr-xr-x 1 root root        0 mai 27  2016 srv
drwxr-xr-x 1 root root        0 mai 27  2016 usr
drwxr-xr-x 1 root root        0 aoû 31  2018 var

Restaurer avec extract

Quelques exemples sur garamotte.net :

$ # Restaurer une sauvegarde complète
$ borg extract <RepoPath>::<SaveName>
$ # Restaurer une partie de la sauvegarde
$ borg extract <RepoPath>::<SaveName> <Filename> <Path>/<Directory>

Automatiser

Je me suis inspiré des petits scripts trouvés sur hetzner.com pour automatiser le backup (et le prune derrière!).

$ sudo cat /usr/local/bin/backup.sh 
#!/usr/bin/env bash
 
## Set environment variables
 
export BORG_PASSPHRASE="monSuperGrosPassword"
 
## Set some variables
 
LOG="/var/log/borg/backup.log"
 
## Output to a logfile
 
exec > >(tee -i ${LOG})
exec 2>&1
 
echo "###### Backup started: $(date) ######"
 
borg create -v -s -p -C lzma,6 --exclude-from=/mnt/data/backups/raspberrypi-exclude \
	/mnt/data/backups/raspberrypi::{hostname}-{now:%Y%m%d-%H%M%S} /
 
echo "###### Backup ended: $(date) ######"

On le rend exécutable :

$ sudo cat /usr/local/bin/backup.sh 

Et on le rajoute dans le crontab :

$ sudo crontab -e
30 3 * * * /usr/local/bin/backup.sh > /dev/null 2>&1

On fait la même chose pour le prune:

$ sudo cat /usr/local/bin/backup-prune.sh 
#!/usr/bin/env bash
 
## Set environment variables
 
export BORG_PASSPHRASE="monSuperGrosPassword"
 
## Set some variables
 
LOG="/var/log/borg/backup.log"
 
## Output to a logfile
 
exec > >(tee -i ${LOG})
exec 2>&1
 
echo "###### Prune backups started: $(date) ######"
 
borg prune --keep-daily 14 --keep-monthly 6 /mnt/data/backups/raspberrypi/
 
echo "###### Prune backups ended: $(date) ######"
$ sudo chmod +x /usr/local/bin/backup-prune.sh
$ sudo crontab -e
30 4 * * * /usr/local/bin/backup-prune.sh > /dev/null 2>&1

Borgmatic

Borgmatic permet de gérer par un fichier de configuration la rétention, les dossiers à sauvegarder et ce genre de chose plutôt que par des scripts bash.

Problèmes rencontrés

Il n'y avait plus de nouveaux backups depuis un moment… Quand j'essayais de lancer Borgmatic depuis le serveur, j'avais cette erreur :

Failed to create/acquire the lock /mnt/data/backups/kimsufi/lock (timeout).

Sur le serveur qui reçoit les backups, il y avait bien un lock.

# cat /mnt/data/backups/kimsufi/lock.roster 
{"shared": [["raspberrypi@202481591655122", 21727, 0]]}

J'avais laissé un borg mount et je l'avais oublié ! C'est lui qui bloquait le backup.

# ps -auxf | grep borg
root     21727  0.0  7.7  97248 73136 ?        Sl   fév15   1:19 /usr/bin/python3 /usr/bin/borg mount /mnt/data/backups/kimsufi/ /mnt/borg/
 
# borg umount /mnt/borg/

J'ai ensuite pu relancer le backup depuis le serveur.

Sources