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 automatique
    • compress=lzo = (lzo est plus rapide, zstd meilleur ratio/vitesse) active la compression a la volé, ne réduit pas forcement les performances et ici
    • space_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.
Répondre…