Général 7 min de lecture · 1 503 mots

Stockage homelab : ZFS, NFS ou Ceph sur Proxmox – que choisir ?

Stockage homelab : ZFS, NFS ou Ceph sur Proxmox – que choisir ?
Général · 2026.05.29

Mon MS-01 tourne sur un seul NVMe : le Kingston OEM de 1 To livré avec le bundle. Un seul disque, ça veut dire un seul point de défaillance – si ce NVMe meurt, tout part avec lui : VMs, containers, snapshots. Les snapshots ZFS vivent sur le même pool que les données qu’ils protègent ; contre une panne disque, ils ne valent rien.

Ce qui me protège vraiment aujourd’hui, ce sont les backups PBS quotidiens vers le Synology (article 7 de la série). Mais la réponse structurelle, c’est de la redondance locale – et le MS-01 a trois slots NVMe dont deux encore libres. Ce guide couvre les options de stockage sous Proxmox, ma configuration actuelle, et le miroir ZFS prévu pour ces slots libres.

Les options de stockage Proxmox

Proxmox supporte plusieurs backends de stockage. Voilà comment je les catégorise sur un nœud unique :

Solution Redondance Snapshot VM Idéal pour
local-lvm (LVM-thin) OS Proxmox, démarrage rapide
ZFS (1 disque) ❌ (détecte sans corriger) Compression, snapshots, intégrité
ZFS mirror ✅ (2 disques) VMs et LXC sur nœud solo
NFS ❌ (dépend du NAS) ISO, backups, stockage partagé
Ceph ✅ (3+ nœuds) Cluster multi-nœuds
iSCSI ❌ (dépend cible) NAS enterprise

Ma configuration MS-01 actuelle :

  • Slot 1 (M.2 2280) : Kingston OEM 1 To (livré avec le bundle) – Proxmox OS + pool ZFS rpool pour toutes les VMs et données
  • Slots 2 + 3 (M.2 22110) : libres – réservés au futur miroir ZFS dédié aux données

ZFS en deux mots

ZFS est un filesystem + volume manager qui gère lui-même la redondance, l’intégrité et les snapshots. Pas besoin de RAID matériel, pas besoin de LVM par-dessus.

Pool ZFS (rpool)
  └── vdev (disque unique)
       └── nvme0n1 (Kingston OEM 1TB, slot 1)

Sur un vdev à disque unique, ZFS checksumme tout : il détecte la corruption silencieuse, mais n’a aucune copie saine pour la corriger. C’est déjà mieux qu’ext4 – on sait qu’un fichier est corrompu au lieu de le découvrir six mois plus tard – mais ça ne remplace pas la redondance.

Ce qu’apporterait un miroir : si un disque lâche, le pool reste lisible et fonctionnel. On remplace le disque mort, ZFS resynchronise. Aucun arrêt de service, aucune perte de données. Le prix : la moitié de la capacité totale, 2× 1 TB → 1 TB utilisable.

L’état actuel du pool

Identifier les disques :

lsblk -d -o NAME,SIZE,MODEL,SERIAL
# NAME      SIZE MODEL                      SERIAL
# nvme0n1 953.9G KINGSTON OM8TAP41024K1-A00 50026B7383BC8DAF

L’installeur Proxmox en mode ZFS a créé rpool sur la troisième partition du disque :

zpool status rpool
# pool: rpool
# state: ONLINE
# config:
# NAME         STATE     READ WRITE CKSUM
# rpool        ONLINE       0     0     0
#   nvme0n1p3  ONLINE       0     0     0

Le futur miroir ZFS

Le jour où les slots 2 et 3 recevront leurs deux NVMe 1 To, le pool de données se créera comme ça (en gardant rpool pour l’OS) :

zpool create -f \
  -o ashift=12 \
  -O compression=lz4 \
  -O atime=off \
  -O xattr=sa \
  -O dnodesize=auto \
  tank mirror /dev/nvme1n1 /dev/nvme2n1

Explication des options importantes :

ashift=12 – taille de secteur 4096 octets (4K), alignée sur les NVMe modernes. Un ashift trop bas dégrade les performances de manière permanente et non corrigeable ; le mettre à 12 dès la création est impératif.

compression=lz4 – compression transparente activée. LZ4 est quasi sans overhead CPU sur des NVMe modernes et économise 10–30% d’espace selon les données. À toujours activer.

atime=off – désactiver la mise à jour du timestamp d’accès. Réduit les écritures inutiles sur le pool.

xattr=sa – stocke les attributs étendus dans les inodes plutôt qu’en sous-répertoires. Nécessaire pour les performances Nextcloud et certains workloads Linux.

Ajouter le pool dans Proxmox

Depuis l’interface web : Datacenter > Storage > Add > ZFS.

ID      : tank
Pool    : tank
Thin provision : Oui (recommandé pour les snapshots VM)
Content : Disk image, Container

Ou en CLI :

pvesm add zfspool tank --pool tank --sparse 1 --content images,rootdir

Le stockage apparaît désormais dans la liste déroulante à la création de VM et LXC.

ZFS et la RAM : le point critique

ZFS maintient un cache mémoire appelé ARC (Adaptive Replacement Cache). Par défaut, il peut consommer jusqu’à 50% de la RAM disponible. Sur 32 Go de RAM, ça fait 16 Go potentiellement réservés au cache – c’est trop pour un homelab avec des VMs actives.

Mesure réelle après 72h de fonctionnement sans limite :

arc_summary | grep -E "ARC size|Maximum"
# ARC size (current)    : 14.2 GiB
# Maximum size          : 16.0 GiB

L’ARC avait pris 14 Go. Les VMs se disputaient les 18 Go restants avec Proxmox. Limiter à 4 Go est un compromis raisonnable sur 32 Go de RAM totale :

echo "options zfs zfs_arc_max=4294967296" > /etc/modprobe.d/zfs.conf
update-initramfs -u

Redémarrer pour que la limite soit prise en compte. Après redémarrage, l’ARC reste sous 4 Go et les VMs ont leur marge.

Pour surveiller l’ARC en temps réel :

# Surveillance simple
cat /proc/spl/kstat/zfs/arcstats | grep -E "^size|^c_max"

# Ou avec arc_summary (paquet zfsutils-linux)
arc_summary

NFS : intégrer le Synology DS414

Le DS414 tourne avec Synology DSM, connecté au switch stockage via SFP+ 10GbE. Il contient 4× WD Red Pro 4 TB en SHR (RAID Synology) – 8 To utilisables. Je l’utilise pour les backups PBS et les ISO, pas pour les VMs chaudes.

Configurer le partage NFS sur le DS414 :

Dans DSM : Panneau de configuration > Services de fichiers > NFS. Activer NFS, protocole NFS 4.1. Créer le dossier partagé proxmox-iso avec accès NFS pour 10.10.0.1/24 (réseau stockage), droits Read/Write, squash No mapping.

Côté Proxmox :

Datacenter > Storage > Add > NFS
  ID        : synology-ds414
  Server    : 10.10.0.100        ← IP DS414 sur le réseau stockage
  Export    : /volume1/proxmox-iso
  Content   : ISO image, VZDump backup file
  Max Backups : 3

NFS n’est pas adapté pour stocker des images de VM actives – la latence réseau est perceptible et les snapshots ZFS ne sont pas disponibles sur un volume NFS dans Proxmox. Réserver au stockage froid : ISO, backups PBS, archives.

La connexion passe par le bridge vmbr1 sur 10.10.0.0/24, pas par le LAN principal. Le traffic de stockage ne pollue pas le LAN 2.5GbE des VMs.

Ceph : non, pas pour un nœud unique

Ceph est un système de stockage distribué qui réplique chaque bloc de données sur trois nœuds minimum. Il est spectaculaire en cluster : migration live de VMs sans interruption, tolérance à la panne d’un nœud entier, scaling horizontal.

En mono-nœud, il n’a pas de sens. Ceph a besoin de 3 monitor nodes pour le quorum, consomme ~2 Go de RAM par OSD (disque), et nécessite des disques dédiés séparés des disques OS. Sur le MS-01, avec 3 slots NVMe dont un pour l’OS, les deux restants accueilleront le miroir ZFS.

Si tu envisages un cluster Proxmox à 3 nœuds, Ceph devient intéressant. Pour un homelab solo, ZFS + NFS couvre tous les besoins.

Scrub ZFS et maintenance

Un scrub ZFS vérifie l’intégrité de toutes les données sur le pool, bloc par bloc, en comparant les checksums. C’est ce qui détecte les corruptions silencieuses avant qu’elles deviennent un problème.

# Lancer un scrub manuellement
zpool scrub rpool

# Voir l'avancement
zpool status rpool
# scan: scrub in progress since Fri May 29 03:00:01 2026
# ~892.84M scanned at 148.81M/s, ~79.15M issued at 13.19M/s, 892.84M total
# ...

# Automatiser en cron (Proxmox a un scheduler intégré)
# Datacenter > Nodes > pve > Task scheduler
# Ou en crontab :
echo "0 3 * * 0 zpool scrub rpool" >> /etc/cron.d/zfs-scrub

Planifier un scrub hebdomadaire, de nuit. Sur des NVMe de 1 To, ça prend 30 à 60 minutes selon la charge.

Snapshots manuels avant toute mise à jour :

# Snapshot d'un zvol LXC (CT 150 = Pi-hole)
zfs snapshot rpool/data/subvol-150-disk-0@avant-maj-$(date +%Y%m%d)

# Rollback si problème
zfs rollback rpool/data/subvol-150-disk-0@avant-maj-20260529

# Lister les snapshots
zfs list -t snapshot -o name,creation,used | grep subvol-150

La limite de ma config actuelle

Sur un pool à disque unique, un scrub qui trouve des blocs corrompus ne peut rien réparer : ZFS voit l’erreur grâce aux checksums, la signale, mais n’a aucune copie saine où lire.

zpool status -v rpool
# errors: Permanent errors have been detected in the following files:
#         (liste des fichiers touchés)

Dans ce scénario, la seule issue est la restauration depuis backup – d’où le PBS quotidien vers le DS414, qui est aujourd’hui ma vraie ligne de défense.

Sur un miroir, le même scénario se répare tout seul : ZFS lit la copie saine sur l’autre disque et réécrit le bloc corrompu, sans interruption ni perte. C’est exactement ce que les slots 2 et 3 attendent. D’ici là : scrub hebdomadaire pour détecter tôt, backups quotidiens pour pouvoir restaurer.

Série « Homelab Proxmox MS-01 » – Article 6/10

À propos de l'auteur

Pascal Snijers

Pascal Snijers — SRE & Observability Engineer dans le secteur bancaire belge. Avant ça : 25 ans de Telecom BSS/OSS — billing, provisioning, support Tier 3 EMEA — et des ordinateurs depuis 1987. Ici, j'applique les pratiques SRE à mon homelab Proxmox, SLO compris.

Une remarque, un retour ?

Cet article est vivant - corrections, contre-arguments et retours de production sont les bienvenus. Trois canaux, choisissez celui qui vous convient.

Laisser un commentaire