Backup of Btrfs subvolumes with Btrbk

Updated 20 Mai 2022

Introduction

Btrbk est un outil de sauvegarde de sécurité pour les sous-volumes Btrfs, tirant parti des fonctionnalités spécifiques de btrfs permettant de créer des instantanés atomiques et de les transférer vers un stockage de sauvegarde cible. Les emplacements source et cible sont définis dans le fichier de configuration, ce qui vous permet de décrire facilement des scripts de sauvegarde simples, tels que "sauvegarde sur un disque dur USB", et des scripts complexes, tels que "le serveur reçoit des sauvegardes de plusieurs hôtes via SSH, avec différentes politiques de stockage".

Définitions

Un instantané est une copie momentanée d'un sous-système Btrfs, réalisée dans le même système de fichiers que le sous-système lui-même.
* Une sauvegarde est une copie de sauvegarde d'un sous-volume Btrfs résultant d'un instantané. Elle peut se trouver soit sur le même système de fichiers, soit sur un autre support ou hôte.
* Первичная резервная копия - полная копия снимка подраздела, содержащая все данные оригинала.
Для создания первичной резервной копии в Btrfs используется подход send/receive: btrfs send формирует поток данных, которые btrfs receive преобразует в раздел с данными.
* Инкрементальная резервная копия - копия содержащая только изменения от первичной резервной копии или от другой инкрементальной копии.
Для передачи данных инкрементальной резервной копии для btrfs send необходимо указать между какими снапшотами будут сформированы изменения (базовой и конечный). При этом раздел с резервными копиями должен уже содержать данные базового снапшота.
* Une archive est une sauvegarde supplémentaire d'instantanés, qui peut être invoquée à partir d'une sauvegarde ou d'un instantané. Contrairement au système de stockage des instantanés et des sauvegardes, elle peut se passer de l'instantané de base commun. Un sous-volume est alors transmis en entier.

Btrbk gère l'organisation du stockage, les instantanés, les paramètres de création des archives incrémentielles, la suppression des instantanés obsolètes conformément à la politique de stockage, le transfert de données entre hôtes. Il suffit de décrire la politique de stockage des sauvegardes, de créer les répertoires nécessaires et de définir les emplacements de conservation des instantanés et des sauvegardes.

Installation

Installez Btrbk :

emerge -a app-backup/btrbk

Paramètres de base

Définissez les paramètres principaux pour les sauvegardes de sécurité :

/etc/btrbk/btrbk.conf

# répertoire d'instantanés sur la partition sauvegardée 
snapshot_dir                           .snapshots

# nom de l'instantané format <nom>. AAAAmmjjHHMM
timestamp_format                   long

# compression zstd pour transmettre les sauvegardes
stream_compress                   zstd

# chemin d'accès au journal
transaction_log                       /var/log/btrbk.log

# taille de la mémoire tampon du flux
stream_buffer                         256m

Politique de sauvegarde

Vous pouvez ajuster les paramètres de la politique de sauvegarde, comme illustré ci-dessous :

/etc/btrbk/btrbk.conf

# la sauvegarde quotidienne est la première après minuit
preserve_hour_of_day 0

# le lundi est le premier jour de la semaine
preserve_day_of_week monday

# conserver tous les instantanés temporaires pendant au moins un jour
snapshot_preserve_min 1d

# conserver 14 derniers instantanés quotidiens, 8 hebdomadaires, 6 mensuels, 1 annuel
snapshot_preserve 14d 8w 6m 1y

# ne pas conserver les instantanés temporaires
target_preserve_min no

# conserver 6 derniers instantanés quotidiens, 4 hebdomadaires, 6 mensuels, 1 annuel
target_preserve 6d 4w 6m 1y

# conserver les archives de tous les instantanés
archive_preserve_min all
Périodicité
  • Une sauvegarde de l'heure correspond à la première sauvegarde de l'heure donnée. Par conséquent, si des sauvegardes sont estampillées 20210323T0102, 20210323T0503, et 20210323T2320, la sauvegarde de l'heure est 20210323T0503~, et les deux autres seront supprimées à l'issue de la période de stockage minimale.
  • Une sauvegarde du jour (daily backup) est la première copie effectuée au début de la journée (ou après l'heure indiquée dans preserve_hour_of_day). Les autres copies effectuées ce jour-là sont considérées comme des copies de l'heure ou temporaires.
  • Une sauvegarde de la semaine (weekly backup) est la copie du jour le plus proche du lundi (ou du jour de la semaine défini dans preserve_day_of_week). Ainsi, si un enregistrement a été effectué le lundi, il est considéré comme la copie de la semaine. S'il n'y a pas d'enregistrement du lundi, mais qu'il y a une sauvegarde du mercredi, la copie du mercredi sera considérée comme celle de la semaine.
  • Une sauvegarde du mois (monthly backup) est la copie de la semaine la plus proche du premier jour du mois, ce qui signifie qu'elle est assignée à un jour de la semaine, et non au premier jour du mois.
  • La sauvegarde annuelle est la copie mensuelle la plus ancienne de l'année.

La syntaxe générale d'une politique de stockage est comme suit :

[<hourly>h] [<daily>d] [<weekly>w] [<monthly>m] [<yearly>y]

Les options hourly, daily, weekly, monthly et yearly définissent le nombre de copies à conserver respectivement à des intervalles d'une heure, d'un jour, d'une semaine, d'un mois ou d'une année.

Exemple

Exemple de politique

Date Heure Jour de semaine Description de la copie Commentaires
2021/07/3023:20 Vendredi Dernière sauvegarde à supprimer le 1er août (à l'expiration du délai de conservation)
2021/07/3021:20 Vendredi Copie temporaire à supprimer le 1er août (à l'expiration du délai de conservation)
2021/07/3020:20 Vendredi Sauvegarde du jour actuelle conservée comme copie du jour
2021/07/2920:20 Jeudi copie du jour précédent conservée comme indiqué 2d
2021/07/2820:20 Mercredi copie d'avant-hier conservée comme indiqué 2d
2021/07/2620:20 Lundi Instantané hebdomadaire actuel conservée comme copie de la semaine
2021/07/2122:15 Mercredi Instantané de la semaine dernière conservée comme indiqué 2w, mercredi (si aucun instantané du lundi ou du mardi n'est disponible)
2021/07/1220:20 Lundi instantané de l'avant-dernière semaine conservée comme indiqué 2w
2021/07/0520:20 Lundi Instantané mensuel actuel préservée comme copie du mois
2021/06/0720:20 Lundi instantané du mois dernier préservée comme indiqué 2m
2021/05/0320:20 Lundi instantané de l'avant-dernier mois préservée comme indiqué 2m

Les instantanés et les sauvegardes régulières peuvent ne pas coïncider. Par exemple, les instantanés peuvent être conservés pendant 5 jours, tandis qu'une sauvegarde serait créée tous les mois. Dans ce cas, un instantané de la dernière sauvegarde correspondante sera forcé pour prendre en charge les archives incrémentielles.

Tous ces paramètres peuvent être indiqués globalement pour toutes les sauvegardes ou redéfinis pour des volumes ou sous-volumes Btrfs spécifiques à sauvegarder.

Sauvegarde locale

Dans l'exemple ci-dessous, nous expliquons comment sauvegarder la partition racine / et la partition de données /var/calculate/ du le système actuel, à stocker sur un disque dédié monté à /mnt/backup/.

Chemins d'accès

Créez des répertoires d'instantanés dans les partitions racine / et /var/calculate/ :

mkdir /.snapshots /var/calculate/.snapshots

Ajoutez

/etc/btrbk/btrbk.conf

# root partition
volume /
  # backup at /mnt/backup/
  target /mnt/backup
  # backup main partition
  subvolume .
    # partition name in snapshot rootfs
    snapshot_name rootfs

# partition /var/calculate
volume /var/calculate
  # backup at /mnt/backup/
  target /mnt/backup
  # create snapshots of main partition
  subvolume .
    # partition name in snapshot calculate
    snapshot_name calculate

Les instantanés de la partition racine seront créés dans /.snapshots/, ceux de la partition de données dans /var/calculate/.snapshots/, et les sauvegardes correspondantes dans /mnt/backup/.

Sauvegarde de sécurité

Pour exécuter le cycle complet (instantanés, sauvegardes, suppression des copies obsolètes), procédez comme suit :

btrbk run
--------------------------------------------------------------------------------
Backup Summary (btrbk command line client, version 0.31.1)

    Date:   Wed Mar 24 16:18:55 2021
    Config: /etc/btrbk/btrbk.conf

Legend:
    ===  up-to-date subvolume (source snapshot)
    +++  created subvolume (source snapshot)
    ---  deleted subvolume
    ***  received subvolume (non-incremental)
    >>>  received subvolume (incremental)
--------------------------------------------------------------------------------
/.
+++ /.btrbk_snap/rootfs.20210324T1618
*** /mnt/backup/rootfs.20210324T1618

/var/calculate/.
+++ /var/calculate/.snapshots/calculate.20210324T1618
*** /mnt/backup/calculate.20210324T1618

Comme vous pouvez le voir dans le journal d'exécution, deux instantanés ont été créés (/.snapshots/rootfs.20210324T1618/, /var/calculate/.snapshots/calculate.20210324T1618/), puis envoyés en tant que sauvegarde complète (***) à /mnt/backup/.

Le fait de relancer le cycle n'aboutira qu'à la création d'instantanés, puisque les sauvegardes temporaires ne sont pas conservées conformément à la politique de stockage. Faites un essai à blanc :

btrbk --dry-run run
--------------------------------------------------------------------------------
Backup Summary (btrbk command line client, version 0.31.1)

    Date:   Wed Mar 24 16:24:27 2021
    Config: /etc/btrbk/btrbk.conf
    Dryrun: YES

Legend:
    ===  up-to-date subvolume (source snapshot)
    +++  created subvolume (source snapshot)
    ---  deleted subvolume
    ***  received subvolume (non-incremental)
    >>>  received subvolume (incremental)
--------------------------------------------------------------------------------
/.
+++ /.snapshots/rootfs.20210324T1624

/var/calculate/.
+++ /var/calculate/.snapshots/calculate.20210324T1624

NOTE: Dryrun was active, none of the operations above were actually executed!

Si vous l'exécutez le lendemain, cette commande créera à la fois des instantanés et des sauvegardes, de manière incrémentielle :

btrbk run
--------------------------------------------------------------------------------
Backup Summary (btrbk command line client, version 0.31.1)

    Date:   Thu Mar 25 14:04:36 2021
    Config: /etc/btrbk/btrbk.conf

Legend:
    ===  up-to-date subvolume (source snapshot)
    +++  created subvolume (source snapshot)
    ---  deleted subvolume
    ***  received subvolume (non-incremental)
    >>>  received subvolume (incremental)
--------------------------------------------------------------------------------
/.
+++ /.snapshots/rootfs.20210325T1404
>>> /mnt/backup/rootfs.20210325T1404

/var/calculate/.
+++ /var/calculate/.snapshots/calculate.20210325T1404
>>> /mnt/backup/calculate.20210325T1404

Pour créer des instantanés uniquement, exécutez :

btrbk snapshot

Pour synchroniser les instantanés avec le dépôt de sauvegarde, ainsi que pour supprimer les copies obsolètes, procédez comme suit :

btrbk resume

Si vous préférez vous limiter à supprimer les instantanés et les sauvegardes obsolètes, exécutez :

btrbk prune

Calendrier des sauvegardes

Pour mettre en place des sauvegardes programmées, ajoutez une exécution quotidienne de btrbk à la liste de cron :

/etc/cron.d/btrbk

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/

# run btrbk
0 0 * * *   root    /usr/bin/btrbk run &>/dev/null

Configuration de la sauvegarde pour un nœud distant

Configuration du serveur de sauvegarde

Sur votre serveur de sauvegarde, créez une clé ssh pour vous connecter à l'ordinateur distant :

ssh-keygen -b 4096 -f /root/.ssh/btrbk.key
Generating public/private rsa key pair.
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/btrbk.key
Your public key has been saved in /root/.ssh/btrbk.key.pub
The key fingerprint is:
SHA256:MhrRRsoUfCnbm/e2Sdw5sH6y+bp1nq48UVLE9sjpgxs root@backup
The key randomart image is:
+---[RSA 4096]----+
|   .o...     o.  |
|   oo+o       +  |
|    +=o      + + |
|    .o.     . = .|
|    . ooS .  =   |
|     ooo.. +E.o  |
|    .  . .+ =+.. |
|         o+=++ . |
|         .OO+++  |
+----[SHA256]-----+

Important

Évitez de protéger par un mot de passe, sinon vous ne pourrez pas vous connecter au service.

Ajoutez la commande de démarrage ainsi que les paramètres au début de la chaîne de la clé publique :

echo -e 'command="/var/calculate/bin/ssh_filter_btrbk.sh --source --delete --info",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-forwarding' $(cat /root/.ssh/btrbk.key.pub) > /root/.ssh/btrbk.key.pub

Indiquer l'accès par clé SSH :

/etc/btrbk/btrbk.conf

# Specify SSH private key for "ssh://" volumes / targets:
ssh_identity               /root/.ssh/btrbk.key

Ajoutez une description de la routine de sauvegarde à distance à la fin du fichier :

/etc/btrbk/btrbk.conf

# root partition of remote computer
volume ssh://host1.example.org/
  # backup at /mnt/backup
  target /mnt/backup/host1.example.org
  # create snapshots of main partition
  subvolume .
    # partition name in snapshot rootfs
    snapshot_name rootfs

# partition /var/calculate/
volume ssh://host1.example.org/var/calculate
  # backup at /mnt/backup
  target /mnt/backup/host1.example.org
  # create snapshots of main partition
  subvolume .
    # partition name in snapshot calculate
    snapshot_name calculate
  # create LXC snapshots for container calculate
  subvolume lxc/calculate/rootfs
    # link backup lxc/calculate/rootfs with group lxc
    group lxc
    # partition name in snapshot
    snapshot_name lxc.calculate.rootfs

où :

  • host1.example.org est le nom de réseau de l'ordinateur à sauvegarder
  • /, /var/calculate/, /var/calculate/lxc/calculate/rootfs/ sont des sous-volumes à sauvegarder.
  • groupe lxc est un nom de groupe personnalisé, pour sauvegarder par groupe

Configuration client

Créez des répertoires d'instantanés distants sur host1 :

mkdir /.snapshots /var/calculate/.snapshots

Pour pouvoir accéder à l'hôte distant host1~, copiez-y le script permettant d'exécuter un ensemble limité de commandes nécessaires à la création de sauvegardes uniquement :

scp /usr/share/btrbk/scripts/ssh_filter_btrbk.sh root@host1:/var/calculate/bin/

Déplacez la clé publique du serveur générée précédemment vers le système distant :

ssh-copy-id -i /root/.ssh/btrbk.key.pub host1

Lancer la sauvegarde

Exécutez le cycle complet sur le serveur de sauvegarde :

btrbk run

Pour exécuter le cycle pour l'hôte host1.example.org uniquement :

btrbk run host1.example.org

Pour exécuter le cycle pour /var/calculer/ uniquement à partir de host1.example.org :

btrbk run host1.example.org:/var/calculate

Pour exécuter le cycle pour le groupe lxc uniquement :

btrbk run lxc

Divers

Par défaut, Btrbk essaie d'utiliser des sauvegardes incrémentielles, mais si la chaîne est rompue (par exemple, en supprimant manuellement les sauvegardes redondantes), une sauvegarde complète sera effectuée. Cette opération peut s'avérer inutile si les sauvegardes primaires ont déjà été créées, alors que les sous-volumes contiennent une grande quantité de données. Indiquez au système de n'utiliser que des sauvegardes incrémentielles :

/etc/btrbk/btrbk.conf

# Perform incremental backups (set to "strict" if you want to prevent
# creation of non-incremental backups if no parent is found).
incremental                strict

Important

Il convient de souligner que seules les sauvegardes incrémentielles doivent être configurées après les sauvegardes primaires. Sinon, Btrbk ne pourra pas en créer.