ZFS on Linux : le filesystem ultime

ZFS on Linux : le filesystem ultime

ZFS combine filesystem et gestionnaire de volumes : snapshots, compression, deduplication, RAID-Z, replication, integrity checking. Le filesystem que tout admin sysadmin sérieux devrait connaitre.

Introduction

ZFS (Zettabyte File System), porte d'OpenSolaris a Linux :

  • Checksum SHA-256 sur chaque bloc (detection silent data corruption)
  • Snapshots et clones quasi-instantanes
  • Compression transparente (LZ4, ZSTD, gzip)
  • Deduplication (optionnelle, RAM-intensive)
  • RAID-Z (RAID5/6 sans le "write hole")
  • Replication async (zfs send/zfs receive)
  • Volumes virtuels (ZVOL) pour iSCSI/VM
  • Limites pratiques : 256 zettabytes

Cas d'usage : serveurs de fichiers, backup, stockage VM, NAS, datalakes.

Prerequis

  • VPS / serveur Linux Debian 12 / Ubuntu 24.04
  • 8 Go RAM minimum (ZFS aime la RAM)
  • Acces root
  • Au moins 2 disques (ou partitions) pour les mirrors/RAIDZ

Etape 1 : Installation

Ubuntu (natif depuis 20.04)

sudo apt update
sudo apt install -y zfsutils-linux
zfs version

Debian (contrib repo)

sudo nano /etc/apt/sources.list
# Ajoutez "contrib" sur les lignes principales

sudo apt update
sudo apt install -y zfs-dkms zfsutils-linux
sudo modprobe zfs
zfs version

Etape 2 : Lister les disques

lsblk
sudo fdisk -l

Identifiez les disques sans donnees (ex: /dev/sdb, /dev/sdc). Utilisez les /dev/disk/by-id/ pour la stabilite :

ls -lh /dev/disk/by-id/

Etape 3 : Creer un pool simple

sudo zpool create datapool /dev/disk/by-id/ata-WDC_WD20EFRX_xxx
sudo zpool status
sudo zfs list

Le pool datapool est monte automatiquement dans /datapool.

⚠️ Pour la production, ne creez jamais un pool sur un seul disque. Faites du mirror ou raidz.

Etape 4 : Mirror (RAID1)

sudo zpool create datapool mirror \
    /dev/disk/by-id/ata-WDC_WD20EFRX_aaa \
    /dev/disk/by-id/ata-WDC_WD20EFRX_bbb

Tolere 1 disque perdu, perf lecture doublee, ecriture identique au single.

Etape 5 : RAID-Z (RAID5)

Pour 4 disques avec 1 parite (tolere 1 disque mort) :

sudo zpool create datapool raidz \
    /dev/disk/by-id/ata-disk-1 \
    /dev/disk/by-id/ata-disk-2 \
    /dev/disk/by-id/ata-disk-3 \
    /dev/disk/by-id/ata-disk-4

RAID-Z2 (RAID6, tolere 2 disques) :

sudo zpool create datapool raidz2 disk1 disk2 disk3 disk4 disk5 disk6

RAID-Z3 (3 parites) pour 8+ disques.

Etape 6 : Datasets

Un dataset = un sous-FS dans le pool, avec ses propres proprietes :

sudo zfs create datapool/home
sudo zfs create datapool/var
sudo zfs create datapool/backups
sudo zfs list

Chaque dataset peut avoir ses propres reglages :

sudo zfs set compression=zstd datapool/backups
sudo zfs set compression=lz4 datapool/home
sudo zfs set atime=off datapool
sudo zfs set recordsize=1M datapool/backups
sudo zfs set recordsize=16K datapool/var/lib/mysql

Etape 7 : Compression

sudo zfs set compression=lz4 datapool
sudo zfs get compression,compressratio datapool

LZ4 est rapide et gratuit en CPU. ZSTD compresse mieux mais coute plus. Pour des donnees froides, ZSTD-19.

sudo zfs set compression=zstd-19 datapool/archives

Etape 8 : Snapshots

sudo zfs snapshot datapool/home@avant-update
sudo zfs list -t snapshot

Les snapshots sont instantanees, COW (copy-on-write), space-efficient. Vous pouvez en faire des milliers.

Roll back :

sudo zfs rollback datapool/home@avant-update

⚠️ Detruit tous les changements posterieurs.

Acces en lecture seule sans rollback :

ls /datapool/home/.zfs/snapshot/avant-update/

Cloner un snapshot en dataset writeable :

sudo zfs clone datapool/home@avant-update datapool/home-test

Supprimer :

sudo zfs destroy datapool/home@avant-update

Etape 9 : Replication (zfs send/receive)

Snapshoter et envoyer vers un autre serveur :

sudo zfs snapshot datapool/home@2026-05-17
sudo zfs send datapool/home@2026-05-17 | ssh root@backup-server "zfs receive backuppool/home"

Incremental (envoie seulement les changements depuis le snapshot precedent) :

sudo zfs send -i datapool/home@2026-05-16 datapool/home@2026-05-17 | ssh root@backup-server "zfs receive backuppool/home"

Pour de la replication automatique, utilisez sanoid + syncoid :

sudo apt install -y sanoid
sudo nano /etc/sanoid/sanoid.conf
[datapool/home]
    use_template = production

[template_production]
    hourly = 36
    daily = 30
    monthly = 6
    yearly = 3
    autosnap = yes
    autoprune = yes
sudo systemctl enable --now sanoid.timer

Sanoid fait les snapshots, syncoid les replique :

syncoid --recursive datapool/home root@backup:backuppool/home

Etape 10 : ARC tuning

ZFS utilise un cache RAM (ARC). Par defaut, jusqu'a 50% de la RAM. Pour limiter :

sudo nano /etc/modprobe.d/zfs.conf
options zfs zfs_arc_max=4294967296    # 4 Go en bytes
options zfs zfs_arc_min=1073741824    # 1 Go
sudo update-initramfs -u
sudo reboot

Surveillez l'ARC :

arc_summary
sudo cat /proc/spl/kstat/zfs/arcstats

Etape 11 : Maintenance et scrub

Scrub = verification d'integrite complete du pool. Lit toutes les data et compare aux checksums.

sudo zpool scrub datapool
sudo zpool status datapool

Programmez un scrub mensuel via cron :

0 2 1 * * /usr/sbin/zpool scrub datapool

Apres scrub :

sudo zpool status -v datapool

Si erreurs ECC detectees, ZFS les repare automatiquement (si redondance suffisante).

Etape 12 : Operations avancees

Ajouter un disque (hotspare)

sudo zpool add datapool spare /dev/disk/by-id/ata-new-disk

ZFS replace automatiquement un disque mort par le spare.

Remplacer un disque mort

sudo zpool replace datapool old-disk new-disk

Ajouter du cache (L2ARC) sur SSD

sudo zpool add datapool cache /dev/disk/by-id/nvme-cache-disk

Ajouter un log device (SLOG) sur NVMe (pour ZIL)

sudo zpool add datapool log /dev/disk/by-id/nvme-slog

Tres utile pour les workloads synchrones (databases, NFS).

Exporter / importer un pool

sudo zpool export datapool                           # detacher
sudo zpool import datapool                           # rattacher
sudo zpool import -d /dev/disk/by-id/ datapool       # recherche dans un dir

Depannage

Pool en etat DEGRADED

Un disque a un probleme :

sudo zpool status -v

Identifiez le disque, remplacez-le :

sudo zpool replace datapool /dev/disk/by-id/bad-disk /dev/disk/by-id/new-disk
sudo zpool status         # surveiller le resilver

"out of memory"

L'ARC est trop gros. Limitez zfs_arc_max (voir Etape 10).

Performance dégradée

zpool iostat -v datapool 5

Verifiez si un disque est lent (latence elevee). Pensez a ajouter un SLOG ou L2ARC.

Pool perdu apres reboot

sudo zpool import
sudo zpool import datapool

Activez auto-import au boot :

sudo systemctl enable zfs-import-cache.service zfs-mount.service

Quota / limit atteinte

sudo zfs set quota=50G datapool/home
sudo zfs set quota=none datapool/home    # retirer

Commandes utiles

# Pool
sudo zpool create / destroy / status / import / export
sudo zpool list
sudo zpool iostat -v 5
sudo zpool scrub datapool

# Dataset
sudo zfs create datapool/foo
sudo zfs destroy datapool/foo
sudo zfs list
sudo zfs list -t snapshot
sudo zfs get all datapool/foo

# Snapshots
sudo zfs snapshot datapool/foo@snap1
sudo zfs rollback datapool/foo@snap1
sudo zfs clone datapool/foo@snap1 datapool/foo-clone

# Replication
sudo zfs send datapool/foo@snap1 | ssh remote zfs receive otherpool/foo
sudo zfs send -i @snap1 datapool/foo@snap2 | ssh remote zfs receive otherpool/foo

# Stats
arc_summary
sudo zpool history
sudo zfs get compressratio datapool

# ARC
sudo cat /proc/spl/kstat/zfs/arcstats | grep size

Conclusion

ZFS est le couteau suisse du stockage Linux :

  • Integrite (checksums + scrub)
  • Snapshots / replication instantanes
  • Compression / dedup
  • RAID-Z robuste

Limites :

  • RAM-hungry (1 Go par TB recommande)
  • License CDDL incompatible GPL (pas dans le kernel officiel Linux)
  • Pas de shrink de pool

Pour aller plus loin :

  • Utilisez sanoid/syncoid pour automatiser snapshots et replication
  • Combinez avec TrueNAS Scale pour une UI complete et NAS turnkey
  • Pour des perfs max, ajoutez SLOG NVMe + L2ARC SSD

Ressources

Rejoignez notre serveur communautaire Discord

Pour toute question, suggestion ou simplement pour discuter avec la communauté, rejoignez-nous sur Discord !

900+Membres