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
- Documentation OpenZFS : https://openzfs.github.io/openzfs-docs/
- Github : https://github.com/openzfs/zfs
- Sanoid / Syncoid : https://github.com/jimsalterjrs/sanoid
- TrueNAS Scale : https://www.truenas.com/truenas-scale/



















