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".
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
- 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, et20210323T2320, la sauvegarde de l'heure est20210323T0503~, 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 de politique
Date Heure | Jour de semaine | Description de la copie | Commentaires |
---|---|---|---|
2021/07/30 23:20 |
Vendredi | Dernière sauvegarde | à supprimer le 1er août (à l'expiration du délai de conservation) |
2021/07/30 21:20 |
Vendredi | Copie temporaire | à supprimer le 1er août (à l'expiration du délai de conservation) |
2021/07/30 20:20 |
Vendredi | Sauvegarde du jour actuelle | conservée comme copie du jour |
2021/07/29 20:20 |
Jeudi | copie du jour précédent | conservée comme indiqué 2d |
2021/07/28 20:20 |
Mercredi | copie d'avant-hier | conservée comme indiqué 2d |
2021/07/26 20:20 |
Lundi | Instantané hebdomadaire actuel | conservée comme copie de la semaine |
2021/07/21 22: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/12 20:20 |
Lundi | instantané de l'avant-dernière semaine | conservée comme indiqué 2w |
2021/07/05 20:20 |
Lundi | Instantané mensuel actuel | préservée comme copie du mois |
2021/06/07 20:20 |
Lundi | instantané du mois dernier | préservée comme indiqué 2m |
2021/05/03 20: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 :
-------------------------------------------------------------------------------- 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 :
--------------------------------------------------------------------------------
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 :
-------------------------------------------------------------------------------- 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 :
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.orgest le nom de réseau de l'ordinateur à sauvegarder/,/var/calculate/,/var/calculate/lxc/calculate/rootfs/sont des sous-volumes à sauvegarder.groupe lxcest 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.