Skip to content

MergerFS - Pool de Stockage Unifié

MergerFS est un système de fichiers FUSE qui fusionne plusieurs disques indépendants en un seul point de montage unifié, sans RAID ni striping.

Informations

Paramètre Valeur
Version 2.40.2
Type FUSE (Filesystem in Userspace)
Point de montage /mnt/storage
Disques sources /mnt/disk1, /mnt/disk2 (extensible /mnt/disk*)
Capacité totale actuelle ~1.8TB (2x 916GB)
Politique création mfs (Most Free Space)

Concept et Architecture

Principe de Fonctionnement

MergerFS n'est PAS :

  • ❌ Un RAID (pas de striping, parity, ou mirroring)
  • ❌ Un système de fichiers distribué (chaque fichier réside sur UN disque)
  • ❌ Une solution de backup ou protection données

MergerFS EST :

  • ✅ Un proxy transparent unifiant plusieurs mount points
  • ✅ Un gestionnaire intelligent de placement fichiers
  • ✅ Un système permettant d'ajouter des disques sans reformatage
  • ✅ Une couche logique au-dessus de systèmes de fichiers existants

Schéma Architecture

graph TB
    Apps[Applications<br/>Jellyfin, Sonarr, Radarr, SABnzbd]
    Apps --> |Accèdent à| Storage[/mnt/storage<br/>MergerFS v2.40.2]

    Storage --> |Policy: mfs| Disk1[/mnt/disk1<br/>WD Blue 1TB<br/>487GB utilisés]
    Storage --> |moveonenospc| Disk2[/mnt/disk2<br/>WD Red 1TB<br/>321GB utilisés]
    Storage -.-> |Futurs disques| DiskN[/mnt/disk*]

    Disk1 --> Dev1[/dev/sdc1<br/>ext4 916GB]
    Disk2 --> Dev2[/dev/sdd1<br/>ext4 916GB]

    style Storage fill:#e1f5ff
    style Disk1 fill:#fff4e6
    style Disk2 fill:#fff4e6

Vue Unifiée Transparente

Ce que voient les applications :

ls -la /mnt/storage/
drwxr-xr-x 12 1000 1000  4096 Jan 25 14:30 media/
drwxr-xr-x  3 1000 1000  4096 Jan 26 02:15 downloads/
drwxr-xr-x  5 root root  4096 Dec 10 18:00 documents/
drwxr-xr-x  4 root root  4096 Jan 15 09:00 backups/

Réalité physique sous-jacente :

# disk1 contient: media/ downloads/ documents/
# disk2 contient: media/ backups/ photos/ music/
# Fusion transparente par MergerFS

Conséquence importante :

  • Fichier media/movie.mkv existe sur disk1 OU disk2, pas les deux
  • Si disk1 défaille: perte fichiers disk1 uniquement
  • Si disk2 défaille: perte fichiers disk2 uniquement
  • D'où nécessité SnapRAID pour protection → Voir SnapRAID

Configuration Active

Installation

# Version depuis GitHub (plus récente que Debian repos)
wget https://github.com/trapexit/mergerfs/releases/download/2.40.2/mergerfs_2.40.2.debian-bookworm_amd64.deb
dpkg -i mergerfs_2.40.2.debian-bookworm_amd64.deb

Vérification version :

mergerfs -V
# mergerfs v2.40.2

Configuration fstab

Fichier : /etc/fstab

/mnt/disk* /mnt/storage fuse.mergerfs allow_other,use_ino,cache.files=auto-full,moveonenospc=true,category.create=mfs,dropcacheonclose=true,minfreespace=50G 0 0

Paramètres clés :

Option Description Raison
/mnt/disk* Wildcard incluant tous disques Ajout disque automatique sans modifier config
allow_other Autorise accès non-root LXC containers (user 1000:1000) peuvent lire/écrire
use_ino Utilise inode numbers sources Cohérence hardlinks, compatibilité rsync
cache.files=auto-full Cache métadonnées + data +30-50% performance opérations répétées
moveonenospc=true Déplace fichier si disque plein Évite erreurs ENOSPC en production
category.create=mfs Most Free Space Création sur disque avec plus d'espace libre
dropcacheonclose=true Libère cache au fermeture Évite saturation RAM (32GB système)
minfreespace=50G Refuse création si <50GB Marge sécurité (films 4K ~40GB max)

Montage Actuel

mount | grep mergerfs
1:2 on /mnt/storage type fuse.mergerfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other)

Vérification capacité :

df -h | grep storage
1:2         1.8T  808G  932G  47% /mnt/storage

Utilisation Pratique

Création de Fichiers (Policy mfs)

Algorithme Most Free Space :

# État actuel disques
df -h | grep disk
# /dev/sdc1  916G  487G  429G  54% /mnt/disk1
# /dev/sdd1  916G  321G  595G  36% /mnt/disk2

# Création fichier 15GB (SABnzbd download)
dd if=/dev/zero of=/mnt/storage/media/movie.mkv bs=1M count=15000

# MergerFS choisit disk2 (595GB > 429GB libre)
ls -la /mnt/disk2/media/movie.mkv  # ✓ Existe
ls -la /mnt/disk1/media/movie.mkv  # ✗ N'existe pas

Vérification placement :

# Trouver disque physique d'un fichier
getfattr -n user.mergerfs.srcmounts /mnt/storage/media/movie.mkv
# Retourne: /mnt/disk2

Lecture Transparente

Lecture uniforme quel que soit disque source :

# Jellyfin lit fichier (peu importe disk1 ou disk2)
cat /mnt/storage/media/movie.mkv | head -c 1M

# MergerFS redirige vers bon disque automatiquement
# Performances identiques à lecture directe disque

Gestion Espace Plein

Scénario : disk1 presque plein, download 50GB

# disk1: 40GB libres (< minfreespace 50GB)
# disk2: 595GB libres (> minfreespace 50GB)

# Téléchargement SABnzbd dans /mnt/storage/downloads/
# MergerFS ignore disk1 automatiquement
# Fichier créé sur disk2 ✓

Si tous disques <50GB :

Error: ENOSPC (No Space Left on Device)
# Signal d'ajouter disque au pool!

Opérations Courantes

Vérifier État Pool

# Capacité globale
df -h /mnt/storage

# État chaque disque
df -h | grep disk

# Nombre fichiers total
find /mnt/storage -type f | wc -l

Rechercher Fichiers par Disque

# Lister tous fichiers sur disk1
find /mnt/disk1 -type f

# Lister tous fichiers sur disk2
find /mnt/disk2 -type f

# Compter fichiers par disque
echo "Disk1: $(find /mnt/disk1 -type f | wc -l)"
echo "Disk2: $(find /mnt/disk2 -type f | wc -l)"

Rééquilibrage Manuel (optionnel)

Si déséquilibre trop important (ex: disk1 90%, disk2 30%) :

# Déplacer manuellement gros fichiers peu utilisés
rsync -avh --remove-source-files /mnt/disk1/oldbackup/ /mnt/disk2/oldbackup/

# Ou utiliser mergerfs.balance (outil communautaire)
# https://github.com/trapexit/mergerfs-tools

Note : Policy mfs prévient déséquilibre à long terme (nouveaux fichiers vont sur disque le plus vide).

Monitoring

Commandes Rapides

# Capacité temps réel
watch -n 5 'df -h | grep -E "disk|storage"'

# Charge I/O
iostat -x 5 | grep sd[cd]

# Performance MergerFS
top | grep mergerfs  # CPU usage

Alertes Recommandées

Seuils critiques :

  • ⚠️ Capacité totale >85% : Planifier ajout disque
  • ⚠️ Un disque >90% : Déplacer fichiers manuellement
  • 🚨 Tous disques <100GB : Ajout disque urgent

Script monitoring simple :

#!/bin/bash
# /usr/local/bin/check-storage.sh

THRESHOLD=85
USAGE=$(df -h /mnt/storage | tail -1 | awk '{print $5}' | sed 's/%//')

if [ $USAGE -gt $THRESHOLD ]; then
    echo "WARNING: Storage at ${USAGE}% (threshold ${THRESHOLD}%)"
    # Envoyer notification (mail, ntfy, etc.)
fi

Troubleshooting

Problème : Permission Denied

Symptôme : Applications dans LXC ne peuvent pas écrire

Cause : Option allow_other absente ou permissions filesystem

Solution :

# Vérifier option active
mount | grep mergerfs | grep allow_other
# Doit contenir "allow_other"

# Si absent, remonter avec option
umount /mnt/storage
mount /mnt/storage

# Vérifier permissions disques sources
ls -ld /mnt/disk1 /mnt/disk2
# Doit être accessible par user applicatif (ex: 1000:1000)

Problème : Fichier Introuvable

Symptôme : Fichier visible dans /mnt/storage mais cat échoue

Cause : Disque source démonté ou défaillant

Diagnostic :

# Identifier disque source
getfattr -n user.mergerfs.srcmounts /mnt/storage/problematic.mkv

# Vérifier si disque monté
mount | grep disk1
mount | grep disk2

# Vérifier santé disque
smartctl -H /dev/sdc
smartctl -H /dev/sdd

Solution : Remonter disque ou récupérer via SnapRAID si défaillant.

Problème : Performance Lente

Symptôme : Vitesse lecture/écriture <50 MB/s

Causes possibles :

  1. Disque défaillant : Vérifier SMART status
  2. Cache désactivé : Vérifier option cache.files=auto-full
  3. CPU saturé (rare) : Top | grep mergerfs >50%

Diagnostic :

# Test vitesse directe disque
dd if=/mnt/disk1/testfile of=/dev/null bs=1M count=1000
# Doit être >100 MB/s pour HDD 7200rpm

# Test vitesse via MergerFS
dd if=/mnt/storage/testfile of=/dev/null bs=1M count=1000
# Overhead doit être <5%

Ressources

Voir Aussi


Dernière mise à jour : 27 janvier 2026