Skip to main content

BTRFS

Présentation du système de fichiers btrfs :

Le système de fichiers btrfs (B-tree File System) est un système de fichiers moderne et avancé développé par Oracle. Il a été conçu pour répondre aux besoins des systèmes de stockage modernes, en offrant de nombreuses fonctionnalités intéressantes :

1. Copie sur écriture (Copy-on-Write) : Btrfs utilise la copie sur écriture, ce qui permet de créer rapidement des instantanés (snapshots) du système de fichiers sans consommer beaucoup d'espace disque.

2. Gestion du stockage : Btrfs permet de gérer facilement le stockage en utilisant des volumes logiques, des sous-volumes et des quotas. Cela facilite la gestion de l'espace disque.

3. Réplication et tolérance aux pannes : Btrfs prend en charge la réplication des données sur plusieurs disques, offrant ainsi une meilleure tolérance aux pannes.

4. Compression des données : Btrfs peut compresser les données en ligne, ce qui permet de réduire l'espace disque utilisé.

5. Déduplication : Btrfs peut détecter et supprimer les doublons de données, ce qui permet également de gagner de l'espace disque.

6. Équilibrage de charge : Btrfs peut automatiquement équilibrer la charge sur plusieurs disques pour optimiser les performances.

7. Vérification de l'intégrité des données : Btrfs peut vérifier l'intégrité des données et les corriger en cas d'erreurs.

Gestion BTRFS

Compression

Btrfs prend en charge la compression à la volée (transparent pour l'utilisateur), on renseigne la méthode et le niveau dans /etc/fstab.
Pour ma part, j'utilise l'algorithme qui a le meilleur compromis entre compression et performance.

Il suffit de rajouter cette option pour le montage :

compress=zstd:3

Dans cet exemple, j'utilise l'algorithme zstd et choisis le niveau 3, sachant que l'on peut aller de 1 à 15, niveau 1 très faible taux de compression, mais très grande rapidité, 15 énormes taux de compression, mais rapidité réduite.

On a donc la ligne dans le fichier fstab qui ressemble à ça :

UUID=aa78bd8c-d856-4059-b214-2be73e6d99aae /              btrfs   compress=zstd:3,subvol=/@,defaults 0 0

Documentation officielle.

Lister les volumes

sudo btrfs subvolume list ./

Dans l'exemple, on liste des sous-volumes qui se trouvent dans /.

Créer/restaurer un instantané.

Avant de commencer, il faut que le système de fichier BTRFS soit monter (de préférence à la racine) pour pouvoir créer et restaurer correctement les instantanés.

Dans mon exemple, j'ai créé un dossier /btrfs.

sudo mkdir /btrfs

Ensuite, j'ai renseigné le point de montage dans mon fichier fstab, la ligne 10 dans l'exemple :

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a device; this may
# be used with UUID= as a more robust way to name devices that works even if
# disks are added and removed. See fstab(5).
#
# <file system>             <mount point>  <type>  <options>  <dump>  <pass>
UUID=aa78bd8c-d856-4059-b214-2be73e6d99aae /              btrfs   compress=zstd:3,subvol=/@,defaults     0 0
UUID=aa78bd8c-d856-4059-b214-2be736d9e9aae /home          btrfs   compress=zstd:3,subvol=/@home,defaults 0 0
UUID=aa78bd8c-d856-4059-b214-2be736d9e9aae /btrfs         btrfs   defaults                               0 0
tmpfs                                      /tmp           tmpfs   defaults,noatime,mode=1777             0 0

Pour monter la partition.

sudo systemctl daemon-reload
sudo mount -a

Créer un instantané.

sudo btrfs subvolume snapshot /btrfs/@ /btrfs/@-$(date +%d-%m-%Y_%H-%M-%S)

Dans l'exemple, ont fait un instantané de la racine du système, la seconde partie est le chemin de l'instantané, à la fin, j'ai placé une variable pour l'horodater.

Restaurer un instantané.

Pour restaurer un instantané, il suffit d'utiliser la commande mv, le but de la manœuvre est d'intervertir le sous-volume de base avec l'instantané, puis on redémarre.

# Ont isole le sous-volume
sudo mv /btrfs/@ /btrfs/@_old
# ont déplace l'instantané en lieu et place du sous-volume
sudo mv /btrfs/@-05-02-2023_13-02-56 /btrfs/@
# ont redémarre l'ordinateur sur l'instantané
reboot

Démarrer sur un instantané sans restauration.

Il est possible de démarrer sur un instantané sans passer par une restauration.

Il faut avant tout connaitre le nom de l'instantané sur lequel ont désir démarré.

Dans ces manipulations, il se peut que la disposition clavier soit en QWERTY, voici un comparatif.

Systemd-boot.

Sur systemd-boot, au démarrage, restez appuyé sur la touche ECHAP du clavier.

Le menu systemd-boot apparait, laisser la ligne en surbrillance par défaut et appuyer sur la touche e pour accéder au mode édition.

image.png

Remplacer le @ par l'instantané souhaité.

image.png

Touche ENTRER pour démarrer sur l'instantané.

GRUB.

Sur GRUB, au démarrage, restez appuyé sur la touche SHIFT du clavier.

Le menu GRUB apparait, laisser la ligne en surbrillance par défaut et appuyer sur la touche e pour accéder au mode édition.
La ligne qui nous intéresse est celle commençant par linux.

image.png

Remplacer le @ par l'instantané souhaité.

image.png

Touche F10 pour démarrer sur l'instantané.

Maintenance.

Selon la documentation de Manjaro, le BTRFS n'a pas spécialement besoin de maintenance, il est conseiller de supprimer de temps à autre, de supprimer des instantanés non-utiliser pour libérer de l'espace.

Statistique

Voici une commande qui permet d'avoir des statistiques sur l'espace :

sudo btrfs filesystem usage -h /

Supprimer un instantané

La commande suivante permet de supprimer un instantané :

sudo btrfs subvolume delete /btrfs/@-05-02-2023_13-02-56

Scripts et configuration

Instantanés programmé

Sur Solus les mises à jour sont déployées le vendredi tard dans la nuit, je souhaite donc in instantané automatique chaque vendredi.

Voici le script que systemd va lancer tous les jours, le script contient une condition, c'est qu'on soit le 5ᵉ jour de la semaine.

Remplacer CHEMIN par le chemin voulu et enregistré à l'endroit voulu.

#!/bin/bash

# Vérifie si aujourd'hui est un vendredi (5)
if [ "$(date +%u)" -eq 5 ]; then
    # Placez ici les commandes que vous souhaitez exécuter
    btrfs subvolume snapshot /btrfs/@ /btrfs/@-$(date +%d-%m-%Y_%H-%M-%S)
    echo "@-$(date +%d-%m-%Y_%H-%M-%S) kernel $(uname -a | awk '{print $3}')" >> /CHEMIN/index.txt
    chown 1000:1000 /CHEMIN/index.txt
    clr-boot-manager mount-boot
    cp -r /boot/loader/entries /CHEMIN/entries-$(uname -a | awk '{print $3}')
    umount /boot
# Ajoutez d'autres commandes ici
else
    # Vous pouvez laisser cette ligne vide si vous ne voulez rien faire
    :
fi

Ensuite, il faut créer le service et le timer pour systemd.

Voici l'emplacement ou stocker les fichiers : /etc/systemd/system/ pour l'exemple, je vais les nommer btrfs_friday_snapshot

Pour le service, je crée dans le dossier /etc/systemd/system/ le fichier btrfs_friday_snapshot.service

[Unit]
Description=instantané BTRFS exécuté tous les vendredis

[Service]
Type=oneshot
ExecStart=/CHEMIN VERS DE SCRIPT/btrfs_friday_snapshot.sh

[Install]
WantedBy=multi-user.target

Pour le timer, je crée dans le dossier /etc/systemd/system/ le fichier btrfs_friday_snapshot.timer

[Unit]
Description=Timer pour exécuter un instantané BTRFS tous les vendredis

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

Ensuite, on relance, active et démarre le service systemd.

sudo systemctl daemon-reload
sudo systemctl start btrfs_friday_snapshot.timer
sudo systemctl start btrfs_friday_snapshot.service
sudo systemctl enable btrfs_friday_snapshot.timer
sudo systemctl enable btrfs_friday_snapshot.service

On peut contrôler qu'il soit bien lancé avec la commande :

systemctl list-timers