Chapitre 318 minIntermédiaire
ZFS : pool, vdev, dataset, compression et ARC
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- expliquer ce que le copy-on-write et les sommes de contrôle apportent ;
- construire un pool à partir de vdevs en miroir ou en RAIDZ ;
- organiser les données en datasets et en zvols ;
- régler compression, quotas et taille de bloc ;
- lire l'état d'un pool avec
zpool statusetzfs list.
4 exercices corrigés1 schéma
ZFS est à la fois un système de fichiers et un gestionnaire de volumes : il regroupe les disques en un pool, les protège par des miroirs ou des parités appelés RAIDZ, et découpe l'espace du pool en datasets (des systèmes de fichiers) et en zvols (des disques virtuels). Il vérifie chaque bloc lu grâce à une somme de contrôle et ne réécrit jamais une donnée en place, ce qui rend les snapshots instantanés. Ce chapitre explique ces mécanismes, l'organisation d'un pool et les réglages qui comptent, avec les commandes qui permettent de les lire.
Un système de fichiers qui gère aussi les disques
Sur un serveur Linux classique, trois couches se superposent : le RAID (matériel ou mdadm), le gestionnaire de volumes (LVM), le système de fichiers (ext4, XFS). Chacune ignore ce que font les autres : le système de fichiers ne sait pas sur quel disque se trouve un bloc, le RAID ne sait pas quels blocs contiennent des données utiles. ZFS fait les trois à la fois. Né chez Sun Microsystems en 2005, il est développé aujourd'hui par le projet libre OpenZFS, utilisé par TrueNAS, Proxmox VE, FreeBSD et Ubuntu. TrueNAS 25.10 embarque OpenZFS 2.3 ; Proxmox VE 9.2, OpenZFS 2.4.
Copy-on-write et sommes de contrôle
Le copy-on-write. ZFS ne modifie jamais un bloc en place. Pour changer une donnée, il écrit la nouvelle version dans un bloc libre, puis met à jour les pointeurs qui y mènent, jusqu'à la racine de l'arbre, en une seule opération atomique. Deux conséquences :
- le système de fichiers est toujours cohérent sur le disque : une coupure de courant au milieu d'une écriture laisse l'ancienne version intacte ; il n'y a pas de
fsckà lancer au redémarrage ; - garder l'ancienne version ne coûte rien : il suffit de ne pas libérer ses blocs. C'est exactement ce qu'est un snapshot (chapitre 9).
Les sommes de contrôle. Chaque bloc est accompagné d'une somme de contrôle (checksum) rangée dans le bloc parent. À chaque lecture, ZFS recalcule la somme et la compare. Si elle diffère, le bloc est corrompu : un secteur abîmé, un câble défectueux, un bit retourné. ZFS lit alors la copie du miroir ou reconstruit le bloc à partir de la parité, renvoie la bonne donnée à l'application et répare le bloc fautif. C'est l'autoréparation. Un RAID classique, lui, ne sait pas quelle copie est la bonne quand deux copies diffèrent.
Pool, vdev et disques
Trois niveaux s'emboîtent.
- Le disque : un disque dur ou un SSD entier.
- Le vdev (virtual device) : un groupe de disques avec sa redondance. C'est au niveau du vdev que se joue la tolérance de panne.
- Le pool (ou zpool) : l'ensemble des vdevs. ZFS répartit les données entre tous les vdevs du pool, comme un RAID 0 de vdevs. L'espace du pool est commun à tous ses datasets.
| Type de vdev de données | Disques minimum | Capacité utile (n disques de taille C) | Pannes supportées par vdev | Équivalent |
|---|---|---|---|---|
| Disque seul (stripe) | 1 | C | 0 | Aucun |
| Miroir (mirror) | 2 | C | n − 1 | RAID 1 |
| RAIDZ1 | 3 | (n − 1) × C | 1 | RAID 5 |
| RAIDZ2 | 4 | (n − 2) × C | 2 | RAID 6 |
| RAIDZ3 | 5 | (n − 3) × C | 3 | Aucun |
| dRAID1 à dRAID3 | Plusieurs dizaines en pratique | Selon la largeur | 1 à 3 | RAIDZ avec secours répartis |
Le dRAID (RAIDZ distribué) répartit l'espace de secours sur tous les disques pour reconstruire beaucoup plus vite ; il vise les grandes baies de plusieurs dizaines de disques, pas un NAS de PME.
Plusieurs vdevs dans un pool. Deux miroirs de deux SSD forment un pool d'un seul tenant dont la capacité est celle de deux SSD, et dont les IOPS s'additionnent : chaque vdev traite ses propres accès. Pour les IOPS, retiens qu'un vdev RAIDZ offre à peu près les IOPS d'un seul disque, quel que soit son nombre de disques, alors que plusieurs miroirs les multiplient. D'où la règle d'usage : RAIDZ2 pour la capacité (archives, partages), miroirs pour les IOPS (disques de VM). C'est exactement le choix de Sorbier : un pool tank en RAIDZ2 de six disques durs, un pool vms de deux miroirs de SSD.
Les vdevs de soutien. À côté des vdevs de données, un pool peut recevoir des vdevs spécialisés.
| Vdev | Rôle | Quand l'ajouter |
|---|---|---|
| Log (SLOG) | Reçoit le journal des écritures synchrones (ZIL), sur un SSD rapide et fiable | Beaucoup d'écritures synchrones : NFS pour des VM, bases de données, iSCSI avec sync=always |
| Cache (L2ARC) | Second niveau de cache de lecture, sur SSD | Seulement quand la RAM est déjà au maximum et que les données lues souvent ne tiennent pas dans l'ARC |
| Special (métadonnées) | Stocke les métadonnées et les petits blocs sur SSD | Gros pools de disques durs avec beaucoup de petits fichiers. Sa perte détruit le pool : toujours en miroir |
| Spare (secours) | Disque de remplacement prêt à prendre le relais | Pour raccourcir le temps passé en mode dégradé |
Pour un NAS de PME, aucun n'est indispensable : une bonne quantité de RAM fait plus pour les performances qu'un cache L2ARC.
Faire grandir un pool
Un pool ZFS peut grandir de trois façons :
- Ajouter un vdev de même organisation : un second RAIDZ2 de six disques double la capacité de
tank. C'est la méthode classique, et la raison des emplacements libres dans le serveur de Sorbier. - Élargir un vdev RAIDZ d'un disque à la fois. L'expansion de RAIDZ est arrivée avec OpenZFS 2.3 ; dans TrueNAS, elle s'appelle Extend, dans l'écran de gestion des vdevs du pool. Les données déjà écrites gardent leur ancien rapport données/parité jusqu'à ce qu'elles soient réécrites.
- Remplacer tous les disques d'un vdev par des plus gros, un par un, en attendant chaque reconstruction : quand le dernier est remplacé, le vdev prend la nouvelle taille.
On ne peut en revanche pas facilement retirer un vdev : le retrait ne fonctionne qu'avec des pools composés de disques seuls et de miroirs, jamais dès qu'un vdev RAIDZ est présent. On ne transforme pas non plus un RAIDZ1 en RAIDZ2. Une erreur d'organisation se corrige en copiant les données ailleurs et en recréant le pool : réfléchis avant de cliquer.
Datasets et zvols
Un dataset est un système de fichiers ZFS, créé dans un pool. Les datasets forment une arborescence : tank/partages/linux est un enfant de tank/partages. Chaque dataset a ses propres réglages (compression, quotas, droits), hérités du parent sauf s'il les redéfinit, et ses propres snapshots. Tous se partagent l'espace libre du pool : il n'y a pas de partition à dimensionner. Sur TrueNAS, un dataset est monté sous /mnt/<pool>/<dataset>, par exemple /mnt/tank/archives.
Un zvol est un volume en mode bloc créé dans un pool : un disque virtuel de taille fixe, sans système de fichiers ZFS au-dessus. C'est ce qu'on présente en iSCSI (chapitre 8) et ce que Proxmox VE utilise pour les disques de VM sur un stockage ZFS local. Le client formate le zvol comme il veut.
Les propriétés qui comptent
| Propriété | Valeur par défaut | Ce qu'elle règle | Conseil |
|---|---|---|---|
compression | lz4 sur TrueNAS (hérité) | Compression à la volée des blocs écrits | Laisse LZ4 activé partout : il est si rapide qu'il accélère souvent les accès. zstd compresse mieux pour les archives froides. |
recordsize | 128K | Taille maximale des blocs d'un dataset | 1M pour les gros fichiers (vidéos, sauvegardes) ; 16K à 64K pour des bases de données |
volblocksize | 16K | Taille des blocs d'un zvol, fixée à sa création | Laisse la valeur par défaut, sauf besoin mesuré |
quota, refquota | Aucun | Plafond d'espace du dataset (avec ou sans ses enfants et snapshots) | Pour qu'un usage ne remplisse pas tout le pool |
reservation, refreservation | Aucune | Espace garanti au dataset | Pour qu'un usage critique ne manque jamais de place |
atime | Hérité du parent | Mise à jour de la date du dernier accès à chaque lecture | Désactive-le (Enable Atime décoché) : évite une écriture à chaque lecture |
sync | standard | Respect des demandes d'écriture synchrone | Ne mets jamais disabled sur des disques de VM ou une base : une coupure ferait perdre des écritures confirmées |
casesensitivity | Selon le préréglage (insensible pour SMB) | Distinction majuscules et minuscules | Fixée à la création, impossible à changer ensuite |
dedup | off | Déduplication des blocs identiques | Laisse-la désactivée : elle consomme énormément de RAM, environ 5 Go par To de données selon le guide matériel de TrueNAS |
Compression ou pas ? La compression ne gagne rien sur ce qui est déjà compressé : PDF, JPEG, vidéos, archives ZIP, sauvegardes chiffrées. Sur des disques de VM, des documents bureautiques ou des journaux, elle gagne souvent 30 % ou plus. La propriété compressratio affiche le résultat réel : sur les archives PDF de Sorbier, elle plafonne à 1,02x, contre 1,4x sur les disques des VM. Comme LZ4 abandonne très vite la compression d'un bloc qu'il n'arrive pas à réduire, la laisser activée ne coûte rien.
L'ARC : la RAM comme cache
ZFS garde en mémoire les données et les métadonnées récemment ou fréquemment lues, dans un cache appelé ARC (Adaptive Replacement Cache). L'ARC équilibre deux listes, les blocs utilisés récemment et les blocs utilisés souvent, pour qu'une lecture massive ponctuelle (une sauvegarde qui lit tout) ne chasse pas du cache les données vraiment utiles. Par défaut, OpenZFS laisse l'ARC grandir jusqu'à presque toute la mémoire (la plus grande des deux valeurs : la RAM moins 1 Gio, ou 5/8 de la RAM), et le rend quand le système en a besoin.
Lire l'état d'un pool en ligne de commande
Sur TrueNAS, tout se fait dans l'interface web : un pool créé à la main en ligne de commande ne serait pas connu du logiciel de gestion. Les commandes ZFS restent indispensables pour lire l'état du stockage et pour comprendre ce que fait l'interface. Elles se tapent dans System > Shell, ou en SSH si tu l'as activé.
zpool status tank
pool: tank
state: ONLINE
scan: scrub repaired 0B in 05:12:44 with 0 errors on Sun Nov 1 05:12:44 2026
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
6f1c2a7e-3b4d-4e8f-9a0b-1c2d3e4f5a61 ONLINE 0 0 0
0b9e4d21-77c3-4a5e-8f10-2e3d4c5b6a72 ONLINE 0 0 0
c4d5e6f7-1a2b-4c3d-9e8f-3a4b5c6d7e83 ONLINE 0 0 0
5e6f7a8b-2c3d-4e5f-8a9b-4c5d6e7f8a94 ONLINE 0 0 0
a1b2c3d4-3e4f-4a5b-9c8d-5e6f7a8b9ca5 ONLINE 0 0 0
d7e8f9a0-4f5a-4b6c-8d9e-6f7a8b9cadb6 ONLINE 0 0 0
errors: No known data errors
Lis-le de haut en bas : l'état du pool (ONLINE, DEGRADED, FAULTED), le dernier scrub (une vérification complète, chapitre 11), puis chaque vdev et chaque disque, désigné par l'identifiant de sa partition. Les trois colonnes comptent les erreurs de lecture, d'écriture et de somme de contrôle : elles doivent rester à 0.
zfs list -r -o name,used,avail,refer,mountpoint tank
NAME USED AVAIL REFER MOUNTPOINT
tank 9.21T 18.9T 256K /mnt/tank
tank/archives 8.95T 18.9T 8.95T /mnt/tank/archives
tank/partages 212G 18.9T 140K /mnt/tank/partages
tank/partages/linux 212G 18.9T 212G /mnt/tank/partages/linux
tank/proxmox 61.4G 18.9T 140K /mnt/tank/proxmox
tank/proxmox/iso 24.8G 18.9T 24.8G /mnt/tank/proxmox/iso
tank/proxmox/sauvegardes 36.6G 18.9T 36.6G /mnt/tank/proxmox/sauvegardes
USED est l'espace occupé par le dataset, ses enfants et ses snapshots ; REFER, les données visibles du dataset lui-même ; AVAIL, l'espace libre, commun à tous. Les unités sont binaires : T signifie TiB.
| Commande | Ce qu'elle affiche |
|---|---|
zpool list | Taille, espace alloué et libre, fragmentation et état de chaque pool |
zpool status -x | Seulement les pools qui ont un problème (« all pools are healthy » sinon) |
zpool iostat -v tank 5 | Activité de lecture et d'écriture par vdev et par disque, toutes les 5 secondes |
zfs get compression,compressratio tank/archives | La compression choisie et le gain obtenu |
zfs list -t snapshot -r tank/archives | Les snapshots d'un dataset et la place qu'ils occupent |
arc_summary | Taille et taux de succès de l'ARC |
Exercices
Exercice 1 sur 4 Le vocabulaire de ZFS Réussi À revoir
Associe chaque terme à sa définition : pool, vdev, dataset, zvol, ARC, scrub.
a. Disque virtuel en mode bloc, de taille fixe. b. Groupe de disques qui porte la redondance. c. Cache de lecture en mémoire vive. d. Système de fichiers ZFS, avec ses propres réglages et snapshots. e. Ensemble des vdevs, dont l'espace est partagé par tous les datasets. f. Lecture complète du pool pour vérifier les sommes de contrôle et réparer.
Voir la réponseMasquer la réponse de l'exercice 1
Pool → e ; vdev → b ; dataset → d ; zvol → a ; ARC → c ; scrub → f.
Tu avais trouvé ?
Exercice 2 sur 4 Quelle organisation ? Réussi À revoir
Moussa propose trois organisations pour huit disques durs de 8 To. Pour chacune, donne la capacité utile avant conversion (en To), le nombre de pannes supportées à coup sûr et une conséquence sur les performances.
- Un vdev RAIDZ2 de huit disques.
- Quatre miroirs de deux disques.
- Deux vdevs RAIDZ1 de quatre disques.
Voir la réponseMasquer la réponse de l'exercice 2
- RAIDZ2 de 8 : (8 − 2) × 8 = 48 To, 2 pannes quelconques. Un seul vdev RAIDZ : les IOPS sont à peu près celles d'un disque.
- Quatre miroirs : 4 × 8 = 32 To, 1 panne garantie (jusqu'à 4 si chacune touche un miroir différent, mais la perte des deux disques d'un même miroir détruit le pool). Quatre vdevs : environ quatre fois les IOPS d'un disque, idéal pour des VM.
- Deux RAIDZ1 de 4 : 2 × (4 − 1) × 8 = 48 To, 1 panne garantie seulement : deux pannes dans le même vdev détruisent tout le pool. Deux vdevs : environ deux fois les IOPS d'un disque.
Pour des archives sur des disques de 8 To, la première est la plus sûre à capacité égale avec la troisième : même 48 To, mais deux pannes quelconques supportées.
Tu avais trouvé ?
Exercice 3 sur 4 Lire zpool status Réussi À revoir
Que t'apprend cet extrait ? Que fais-tu ?
pool: tank
state: ONLINE
status: One or more devices has experienced an unrecoverable error. An
attempt was made to correct the error. Applications are unaffected.
scan: scrub repaired 1.25M in 05:20:11 with 0 errors on Sun Nov 1 05:20:11 2026
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
6f1c2a7e-3b4d-4e8f-9a0b-1c2d3e4f5a61 ONLINE 0 0 0
0b9e4d21-77c3-4a5e-8f10-2e3d4c5b6a72 ONLINE 0 0 14
c4d5e6f7-1a2b-4c3d-9e8f-3a4b5c6d7e83 ONLINE 0 0 0
Voir la réponseMasquer la réponse de l'exercice 3
Le scrub a trouvé des blocs dont la somme de contrôle était fausse sur le deuxième disque (14 erreurs CKSUM), et les a réparés (1,25 Mio) grâce à la parité : aucune donnée n'est perdue (0 errors, « Applications are unaffected »). Le pool reste ONLINE.
Il faut chercher la cause : consulter l'état SMART de ce disque (secteurs réalloués ou en attente), vérifier son câble ou son emplacement. Si le disque se dégrade, le remplacer (chapitre 11). Si tout est sain, remettre les compteurs à zéro avec zpool clear tank et surveiller : si les erreurs reviennent, le disque ou sa liaison est en cause.
Tu avais trouvé ?
Exercice 4 sur 4 Les bons réglages Réussi À revoir
Pour chaque dataset de Sorbier, propose une valeur de recordsize et de compression, et dis si un quota est utile.
tank/archives: des PDF de 200 Kio à 2 Mio, jamais modifiés.tank/proxmox/sauvegardes: des fichiers de sauvegardevzdumpde plusieurs gigaoctets, compressés par Proxmox en zstd.tank/partages/linux: des fichiers de configuration et des journaux texte, dans un partage utilisé par deux serveurs Linux.
Voir la réponseMasquer la réponse de l'exercice 4
recordsize=1M(fichiers moyens à gros, lus d'un bloc ; les fichiers plus petits que 1 Mio occupent un seul bloc à leur taille). Compression LZ4 laissée par défaut, même si le gain sera faible sur des PDF déjà compressés. Quota : utile pour que les archives ne remplissent pas le pool au détriment des sauvegardes.recordsize=1M(gros fichiers séquentiels). Compression LZ4 : sans gain sur des fichiers déjà compressés en zstd, mais sans coût. Quota indispensable : une rétention mal réglée remplirait le pool.recordsizepar défaut (128K). Compression LZ4, ou zstd pour un meilleur gain sur du texte. Quota raisonnable pour éviter qu'un journal emballé ne sature le pool.
Tu avais trouvé ?