- Modifié
Mon premier tutoriel ! Je suis preneur de toutes critiques constructives
Présentation
Bonjour, je voulais vous présenter btrbk un logiciel de sauvegarde que j'utilise tous les jours et qui vient de sauver mon système pour la deuxième fois (un disque qui écrivait des données corrompue et une mauvaise manipulation de ma part).
Je vous détaille mon fonctionnement, qui pourra peut-etre vous servir de base, et vos critiques me feront progresser
btrbk me permet de faire des snapshots et des sauvegardes ces snapshots périodiques:
- snapshot du système toutes les heures
- supression des snapshots automatiques des vieux snapshots
- conservation de 48 snapshots sur 2 jours,
- puis conservation de 1 snapshot par semaines pendant 4 semaines,
- puis conservation de 1 snapshot par mois pendant 6 mois.
- export des snapshots vers un disque distants, l'export est extrèmement rapide car il se fait directement par block. Si je modifie un fichier video de 5Go de quelque Ko par exemple en ajoutant des sous-titres texte, seul les quelques bloques de fichiers modifiés vont être envoyés.
Btrbk se base sur le système de fichier btrfs, il est stable mais il ne faut pas utiliser les fonctions RAID5/RAID6.
BTRFS permet de creer des subvolumes qui agissent commes des partitions, on peut ensuite monter ces sous volumes comme des partitions.
Crééer un snapshots est instantané, btrfs va enregistrer l'état a un moment T et ne va enregistrer que la différence par rapport a l'état actuel. btrfs permet également de verifier l'écriture des fichiers (et de les réparer automatiquement pour les RAID1) et de comprimer les fichiers automatiquement.
Je vous invite a lire la présentation detaillés de btrfs sur le wiki d'archlinux
Mon fonctionnement
Je vous présente mon fonctionnement avec btrbk, ça pourra vous servir de base pour l'adapter ailleurs
Installation rapide sans explications
en root :
apt -qq upgrade && \
apt -yqq install btrbk btrfs-progs && \
btrfs subvolume snapshot / /rootfs && \
btrfs subvolume set-default /rootfs && \
reboot
après le reboot, la commande find est dangereuse en production :
mount -t btrfs -o default,subvolid=0 $(df / | tail -n1 | cut -f 1 -d" ") /mnt && \
find /mnt/ -maxdepth 1 ! -path /mnt/rootfs ! -path /mnt/ -exec rm -rf -- "{}" \; && \
unmount /mnt
Installation pas à pas.
une commande suffit :
apt upgrade && apt install btrbk btrfs-progs
Je vous conseille vivement de mettre votre système racine dans un subvolume, par défaut si vous choisissez d'installer votre système de fichier root avec btrfs il sera le subvolume racine, et btrbk n'aime pas faire un snapshot dans la source du snapshot
Vérifions si votre racine est dans un subvolume :
btrfs subvolum show /
/
Name: <FS_TREE>
UUID: 073fae3c-00cf-489c-8ed9-7586743bbb36
Parent UUID: -
Received UUID: -
Creation time: 2020-04-09 23:28:32 +0200
Subvolume ID: 5
Generation: 2363
Gen at creation: 0
Parent ID: 0
Top level ID: 0
Flags: -
Snapshot(s):
Après une installation classique, la racine est dans le subolume racine, c'est a dire le subvolid=5.
Etape 1: faire un snapshot de la racine "/" vers le subvolume "/rootfs"
btrfs subvolume snapshot / /rootfs
Etape 2: changer le subvolume par défaut
trouver l'id de votre subvolume "rootfs" :
btrfs subvolume list rootfs
ID 261 gen 2021 top level 5 path var/lib/containers/storage/btrfs/subvolumes/beee9f30bc1f711043e78d4a2be0668955d4b761d587d6f60c2c8dc081efb203
ID 263 gen 2379 top level 5 path rootfs
dans mon exemple j'ai 2 subvolumes 1 pour docker (261) et le rootfs, l'id qui nous intéresse est le 263
Remplacer le subvolume par défaut par l'id de notre rootfs.
btrfs subvolume set-default 263 /
(optionnel)
Si vous ne souhaitez pas modifier le subvolume par défaut, vous pourriez aussi ajouter dans votre fstab subvolid=263
ou subvol=rootfs
:
fstab par default (il faut changer le subvol par défaut):
UUID=cc[...]162f / btrfs defaults 0 0
fstab par id (il faut connaitre l'id)
UUID=cc[...]162f / btrfs defaults,subvolid=263 0 0
fstab par nom (juste a connaitre le nom du subvolume)
UUID=cc[...]162f / btrfs defaults,subvol=rootfs 0 0
Etape 3 : vérifier si tout est ok
on vérifie quelle est notre partition racine avec la commande
# btrfs subvolume show /
rootfs
Name: rootfs
UUID: 5377f842-c4bd-9b47-ba17-4cdca79423b5
Parent UUID: 073fae3c-00cf-489c-8ed9-7586743bbb36
Received UUID: -
Creation time: 2020-04-18 12:47:51 +0200
Subvolume ID: 263
Generation: 2399
Gen at creation: 2379
Parent ID: 5
Top level ID: 5
Flags: -
Snapshot(s):
Notre racine est bien dans un subvolume
Verifier que les logs du noyau avec la commande suivantedmesg | grep btrfs
. Si rien n'apparait c'est que tout est bon
Etape 4 nettoyer
Réfléchissons sur ce que nous venons de faire, nous venons de créer un snapshot de notre racine vers le subvolume rootfs. Nous allons avoir des fichiers en double à la fois dans le subvolume / et le subvolume rootfs. Nous pouvons supprimer sereinement tous les fichiers de subvolid=0 SAUF rootfs
# on monte notre racine, pensez a choisir le bon disque, ici sda2 ;)
mount -t btrfs -o default,subvolid=0 /dev/sda2 /mnt
ls /mnt
bin dev home initrd.img.old lib32 libx32 mnt proc rootfs sbin sys usr vmlinuz boot etc initrd.img lib lib64 media opt root run srv tmp var vmlinuz.old
# suppression des fichiers inutiles du subvolid=0, je veux bien concevoir que cette commande est un peu brutale, mais j'aime bien la simplicité :) (si vous avez une meilleure idée, je suis preneur :) )
find /mnt/ -maxdepth 1 ! -path /mnt/rootfs ! -path /mnt/ -exec rm -rf -- "{}" \;
pour faciliter mes restaurations j'ai monté mes subvolumes racines dans mnt:
mount -t btrfs -o default,subvolid=0 /dev/sda2 /mnt/disk-system/
mount -t btrfs -o default,subvolid=0 /dev/sdc1 /mnt/disk-backup/
#voici ce que ça donne chez moi
tree -L 2 /mnt
/mnt
├── disk-backup
│ ├── btrbk_snapshots
│ └── docs
├── disk-docker
└── disk-system
├── btrbk_snapshots
└── rootfs
# dans un dossier "disk-backup" les sauvegardes apparaissent comme des dossiers : pratique pour restaurer un fichier modifié récemment
tree -L 1 /mnt/disk-system/btrbk_snapshots/
/mnt/disk-system/btrbk_snapshots/
├── rootfs.20200414T0025
├── rootfs.20200415T0025
├── rootfs.20200416T0025
├── rootfs.20200417T0025
├── rootfs.20200417T0425
├── rootfs.20200417T0825
├── rootfs.20200417T1225
├── rootfs.20200417T1625
├── rootfs.20200417T2025
├── rootfs.20200418T0025
├── rootfs.20200418T0425
├── rootfs.20200418T0825
└── rootfs.20200418T1225
13 directories, 0 files
Configuration btrbk
La documentation est claire, et mon utilisation reste basique, vous pouvez associer ssh pour vos backups:
- source (SSH) --> destination (locale)
- source (locale) --> destination (SSH)
, je vous laisse regarder la documentation plutôt bien détaillée.
Petit point sur les définitions:
- snapshot = snapshot a un moment T de l'état des fichiers sur un même disque, si sda2 est notre partition racine, le snapshot sera sur sda2.
- target = sauvegarde disque secondaire qui servira de sauvegarde.
- subvolume = la source du snapshot
btrbk offre pas mal de possibilités notamment d'utiliser SSH et de faire des sauvegardes au format raw :
À titre d'exemple voici mon fichier /etc/btrbk/btrbk.conf
:
# ajoute une date au format long par exemple :
# rootfs.20200417T0425
timestamp_format long
# Conserve tous les snapshots pendant 1 jour, quels que soient leurs nombres
snapshot_preserve_min 1d
# conserve les snapshots journaliers pendant 4 jours
snapshot_preserve 4d
# conserve tous les snapshots pendant 2 jours, quels que soient leurs nombres
target_preserve_min 2d
# conserve les sauvegardes journalières pendant 15 jours, les sauvegarde hebdomadaire pendant 4 semaines, et sauvegarde mensuelle pendant 3 mois
target_preserve 15d 4w 3m
# les snapshots sont sur les répertoires qui sont sauvegardés
# les backups sont les sauvegardes sur le disque backup
snapshot_dir btrbk_snapshots
# sélection du subvolume rootfs dans le disk /mnt/disk-system puis demande :
# - fait un snapshot de rootfs
# - envoyer le snapshot rootfs a /mnt/disk-backup/btrbk_snapshots
volume /mnt/disk-system
subvolume rootfs
target send-receive /mnt/disk-backup/btrbk_snapshots
## backup sdd
# sélection du disque /mnt/disk-backup, dans ce disque selectionné le subvolume docs et faire un snapshot.
# allonger les règles de conservations.
volume /mnt/disk-backup
snapshot_preserve_min 7d
snapshot_preserve 14d
subvolume docs
on peut ensuite lancer la commande : btrbk run
btrbk run
--------------------------------------------------------------------------------
Backup Summary (btrbk command line client, version 0.27.1)
Date: Sat Apr 18 14:38:03 2020
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)
--------------------------------------------------------------------------------
/mnt/disk-system/rootfs
+++ /mnt/disk-system/btrbk_snapshots/rootfs.20200418T1438
>>> /mnt/disk-backup/btrbk_snapshots/rootfs.20200418T1438
/mnt/-backup/docs
+++ /mnt/disk-backup/btrbk_snapshots/docs.20200418T1438
le +++ = création d'un snapshot
le >>> = transfert d'un snapshot vers un autre disque
le temps de sauvegarde est inférieur a 3 secondes s'il y a peu de changement :
real 0m2,531s
user 0m0,630s
sys 0m0,356s
L'accès a nos sauvegarde se fait par le repertoire /mnt/disk-system/btrbk_snapshots/
Rollback système
Vous pouvez faire un rollback complet de votre système en faisant un snapshot d'une sauvegarde et de rendre ce dernier par défaut:
mv /mnt/disk-system/rootfs /mnt/disk-system/rootfs_old
btrfs subvolume snapashot /mnt/disk-system/btrbk_snapshots/rootfs.20200418T1438 /mnt/disk-system/rootfs
btrfs subvolume set-default /mnt/disk-system/rootfs
reboot
Je n'ai pas essayé, mais ce script grub permet de choisir sur quel snapshot booter pendant le démarrage de grub.
Automatiser le lancement de btrbk
Avec la commande de base :
systemctl enable --now btrbk.timer
.
J'ai augmenté la fréquence en modifiant le fichier systemd
systemctl edit --full btrbk.timer
[Unit]
Description=btrbk daily backup
[Timer]
OnCalendar=*-*-* 0/4:25:0
AccuracySec=1min
Persistent=true
[Install]
WantedBy=multi-user.target
Avec une tache cron en ajoutant la commande :
btrbk -q run
le -q
limite la sortie de btrbk.
Optimisation de BTRFS
BTRBK s'appuie sur les fonctionnalités de btrfs.
J'ai quelque recommandation pour ce système de fichier :
- faire
btrfs scrub /
mensuellement - les options de montages suivantes peuvent améliorer les performances :
ssd
optimisation pour les SSD, l'activation est normalement automatiquecompress=lzo
= (lzo est plus rapide, zstd meilleur ratio/vitesse) active la compression a la volé, ne réduit pas forcement les performances et icispace_cache
= activée par défaut (améliore les performances)noatime
= non spécifique a btrfs, désactive la date de dernier accès, réduit le nombre d'écritures.