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 GPTn -> 1 -> Entrée -> Entrée
pour créer une partition de la taille maximale possiblew
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’outildump
2
pour indiquer au système de vérifier ces disques en priorité basse lors de l’utilisation defsck
# 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
1 réponse
[…] MergerFS / SnapRaid […]