MergerFS – Projet Voskos

Si vous arrivez directement sur cet article, je vous invite à lire les précédents à partir d’ici. Cet article présente l’outil MergerFS, qui permet de merger plusieurs disques en un volume logique.

MergerFS

MergerFS permet l’union de disques de différentes tailles et différents types et différents systèmes de fichiers en un seul volume logique.
Le concept derrière cet outil est JBOD (Just a Bunch Of Disks). Je vous conseille le très bon article de Disk Internals sur le sujet.

Contrairement à RAID, j’ai trouvé que cet outil était très facile à mettre en place. Il permet l’ajout ou suppression de disque à chaud sans effort et la perte d’un disque n’implique que la perte des données présentes sur ce disque.

Nous préviendrons plus tard ce cas défaillance avec une bonne stratégie de backup et l’outil SnapRaid.

Installation

Comme expliqué précédemment, j’utilise une distribution Ubuntu (22.04 LTS). Le projet open-source est disponible sur Github : https://github.com/trapexit/mergerfs

Vous devez vous rendre sur la page Releases (https://github.com/trapexit/mergerfs/releases) et trouver le fichier correspondant à votre distribution et votre type de processeur (pour ma part mergerfs_2.38.0.ubuntu-jammy_amd64.deb).

Nous allons ensuite télécharger ce fichier et l’installer avec l’outil apt :

wget https://github.com/trapexit/mergerfs/releases/download/2.38.0/mergerfs_2.38.0.ubuntu-jammy_amd64.deb
apt install /tmp/mergerfs_2.38.0.ubuntu-jammy_amd64.deb

Préparation des disques

Considérons que nous avons deux disques (de même taille ou de tailles différentes) présents dans notre système.

L’outil lsblk permet de lister les disques, leurs partitions et d’autres informations :

root@voskos:~# lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda                         8:0    0   3,6T  0 disk
└─sda1                      8:1    0   3,6T  0 part /media/disk1
sdb                         8:16   0   2,7T  0 disk
└─sdb1                      8:17   0   2,7T  0 part /media/disk2

Vous devez avoir au moins une partition dans chaque disque (comme c’est le cas ici). Si vous utilisez des disques neufs, une procédure est nécessaire pour les initialiser. Vous pouvez utiliser l’outil interactif fdisk pour chaque disque :

fdisk /dev/sda
  • g pour créer une partition GPT
  • n -> 1 -> Entrée -> Entrée pour créer une partition de la taille maximale possible
  • w pour appliquer les changements

Nous allons maintenant appliquer un système de fichier ext4 à la partition nouvellement créée (vous pouvez choisir un autre format comme ZFS ou XFS) :

mkfs.ext4 /dev/sda1

Répétez ces opérations pour chaque disque à initialiser. Relancez la commande lsblk pour vérifier que tout est OK.

Montage des partitions

J’ai choisi de monter mes disques dans le répertoire /media (mais vous pouvez aussi choisir un autre dossier, par exemple /mnt). Nous créons deux répertoires, puis nous montons nos partitions sur ces répertoires :

mkdir /media/disk1
mkdir /media/disk2
mount /dev/sda1 /media/disk1
mount /dev/sdb1 /media/disk2

Cette configuration est temporaire, mais nous permet de vérifier que les montages sont corrects. Vous pouvez utiliser un autre utilitaire df, pour vérifier cela :

root@voskos:~# df -h
/dev/sdb1                          1,4T  895G  410G  69% /media/disk2
/dev/sda1                          3,6T  898G  2,6T  26% /media/disk1

Configuration de MergerFS

Nous devons d’abord créer un dossier cible qui sera notre volume logique unifié :

mkdir /media/storage

Le fichier /etc/fstab est le fichier de configuration utilisé au démarrage par le système pour monter tous les disques.
Nous allons donc indiquer dans ce fichier nos disques physiques et notre volume MergerFS.

Utilisons l’identification par UUID pour éviter tout souci dans le futur (changement de port, ajout de disques identiques). Listez les disques et copiez l’identifiant retourné par cette commande (à réitérer avec chaque disque) :

ls -l /dev/disk/by-uuid | grep sda1

Vous devriez obtenir quelque chose comme 098a0c40-beea-49a4-965b-e095c4b8681f

Éditez donc le fichier /etc/fstab pour monter les disques avec leur UUID respectif. Pour les paramètres en fin de ligne, indiquez :

  • le format de fichier (ext4 pour moi)
  • defaults pour les options de montage (il y a d’autres options pour des cas très spécifiques)
  • 0 car nous n’utilisons pas l’outil dump
  • 2 pour indiquer au système de vérifier ces disques en priorité basse lors de l’utilisation de fsck
# Mounting Western Digital
/dev/disk/by-uuid/098a0c40-beea-49a4-965b-e095c4b8681f /media/disk1 ext4 defaults 0 2

# Mounting Ironwolf
/dev/disk/by-uuid/17464878-2ac0-482b-add1-9b8b459ffa38 /media/disk2 ext4 defaults 0 2

Pour MergerFS, ajoutez la ligne suivante :

# MergerFS Volume
/media/disk* /media/storage fuse.mergerfs cache.files=partial,dropcacheonclose=true,ignorepponrename=true,category.create=epmfs,minfreespace=10G,fsname=mergerfs 0 2

Nous demandons d’unifier tous les disques montés depuis /media/disk* vers /media/storage avec le système fuse.mergerfs.

Pour les options, vous pouvez utiliser celles que j’ai données, mais je vous conseille de lire la documentation de MergerFS. Notamment la règle de choix du disque lors de l’écriture.
J’ai choisi l’option category.create=epmfs (epmfs), qui indique d’écrire dans le disque qui a le plus d’espace, à condition que le répertoire existe.

Une fois cette configuration effectuée, utilisez la commande mount pour monter tous les disques et notre nouveau volume MergerFS.

Vous pouvez utiliser l’outil DUF pour vérifier que tout est OK.

root@voskos:~# duf
╭──────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 5 local devices                                                                                  │
├─────────────────┬────────┬────────┬────────┬────────────────────────────┬───────┬────────────────┤
│ MOUNTED ON      │   SIZE │   USED │  AVAIL │           USE%             │ TYPE  │ FILESYSTEM     │             
├─────────────────┼────────┼────────┼────────┼────────────────────────────┼───────┼────────────────┤
│ /               │ 913.3G │ 153.3G │ 721.8G │ [###..............]  16.8% │ ext4  │ /dev/ubuntu-/lv│
│ /boot           │   1.9G │ 251.8M │   1.5G │ [##...............]  12.9% │ ext4  │ /dev/nvme0n1p2 │
│ /boot/efi       │   1.0G │   6.1M │   1.0G │ [.................]   0.6% │ vfat  │ /dev/nvme0n1p1 │
│ /media/disk1    │   1.3T │ 894.9G │ 409.4G │ [###########......]  65.1% │ ext4  │ /dev/sda1      │
│ /media/disk2    │   3.6T │ 156.7G │   3.2T │ [.................]   4.3% │ ext4  │ /dev/sdb1      │
╰─────────────────┴────────┴────────┴────────┴────────────────────────────┴───────┴────────────────╯
╭────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 1 fuse devices                                                                                 │
├────────────────┬──────┬──────┬───────┬────────────────────────────┬───────────────┬────────────┤
│ MOUNTED ON     │ SIZE │ USED │ AVAIL │           USE%             │ TYPE          │ FILESYSTEM │
├────────────────┼──────┼──────┼───────┼────────────────────────────┼───────────────┼────────────┤
│ /media/storage │ 8.5T │ 1.9T │  6.2T │ [####.............]  22.4% │ fuse.mergerfs │ mergerfs   │ 
╰────────────────┴──────┴──────┴───────┴────────────────────────────┴───────────────┴────────────╯

Vous pouvez aussi faire un test en exécutant les commandes suivantes :

# Création d'un fichier dans le disque 1
touch /media/disk1/test

# Création d'un fichier dans le disque 2
touch /media/disk2/test2

# Affichage des deux fichiers dans le volume MergerFS
ls /media/storage

Je vous recommande maintenant de toujours écrire directement dans /media/storage. MergerFS s’occupera de répartir automatiquement dans l’un des sous-disques selon votre politique d’écriture choisie.

Prochain article, nous parlerons de SnapRaid

Vous aimerez aussi...

1 réponse

  1. 21 décembre 2023

    […] MergerFS / SnapRaid […]

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *