Dawan Proxmox VE — TSSR

Chapitre 3 — Réseau et stockage

4. ZFS — le système de fichiers qui se souvient de tout

La grande majorité des administrateurs Linux s'appuie historiquement sur ext4, xfs ou LVM pour gérer leurs disques. Ces solutions fonctionnent bien, mais elles partagent une faiblesse commune : elles font confiance aux données qu'elles lisent.

Si un disque retourne silencieusement des données corrompues — le "bit rot" — le système de fichiers ne s'en aperçoit pas. ZFS a été conçu précisément pour résoudre ce problème.

ZFS combine en un seul outil ce que LVM, mdadm et ext4 font séparément : la gestion des volumes, le RAID logiciel, les snapshots et le système de fichiers lui-même. Pas besoin de contrôleur RAID matériel coûteux : ZFS s'en charge en logiciel. Des checksums sur chaque bloc de données détectent toute corruption silencieuse ; en mode miroir ou RAIDZ, ZFS la corrige.

Avant ZFS, quatre couches empilées (ext4, LVM, RAID, disques) ; avec ZFS, un seul outil qui fait système de fichiers, gestionnaire de volumes et RAID et vérifie chaque bloc par checksum

Pas de ZFS ni de Ceph sur des SSD grand public — c'est l'avertissement que répètent les contributeurs de Proxmox. ZFS et Ceph demandent au disque de garantir chaque écriture synchrone (sync). Un SSD grand public, sans protection contre la coupure de courant, ne peut le faire qu'en vidant son cache à chaque fois.

Les performances s'effondrent, et l'usure s'accélère au point de consommer la durée de vie du disque en quelques mois. Les SSD d'entreprise à condensateurs (PLP, power loss protection) acquittent ces écritures depuis leur cache protégé, sans ce coût.

Sans ce budget, une installation simple — ext4 et de bonnes sauvegardes — vaut mieux qu'un ZFS sur du matériel inadapté. En atelier, avec des disques virtuels, la question ne se pose pas ; elle se pose avant tout déploiement en production.

4.1 Vocabulaire ZFS et niveaux RAID

ZFS introduit son propre vocabulaire qu'il faut maîtriser avant de taper la première commande. Un vdev (virtual device) regroupe un ou plusieurs disques physiques avec une stratégie de redondance donnée.

Un zpool est constitué d'un ou plusieurs vdevs — c'est l'unité de stockage visible de l'extérieur. Si vous perdez un vdev entier, vous perdez tout le zpool : la résilience ne se fait jamais d'un vdev à l'autre, uniquement à l'intérieur d'un même vdev.

Un zpool peut ensuite héberger des datasets (systèmes de fichiers virtuels) et des zvols (volumes logiques en mode bloc). La taille d'un dataset peut être limitée par quota.

Niveau Équivalent RAID classique Tolérance de panne Disques minimum
stripe RAID 0 Aucune 1
mirror RAID 1 1 disque par vdev 2
RAIDZ1 RAID 5 1 disque 3
RAIDZ2 RAID 6 2 disques 4
RAIDZ3 — 3 disques 5

En RAIDZ, la capacité utile est celle de N − 1 disques (RAIDZ1), N − 2 (RAIDZ2) ou N − 3 (RAIDZ3). Ainsi, 3 disques de 10 Go en RAIDZ1 donnent environ 20 Go utiles.

RAIDZ face au RAID 5 classique. Le RAID 5 connaît le write hole : une coupure en pleine écriture peut laisser données et parité incohérentes. RAIDZ écrit de façon atomique, grâce au copy-on-write (§4.2), et sa largeur de bande s'adapte à chaque écriture.

En cas de panne, il ne reconstruit que les blocs réellement utilisés, là où le RAID 5 reconstruit tout le disque. Et chaque bloc porte une somme de contrôle.

Un pool accepte aussi des vdev spécialisés, en plus des vdev de données :

vdev Rôle
spare Disque de rechange, prêt à remplacer un disque défaillant du pool
cache L2ARC : un SSD qui prolonge le cache de lecture tenu en mémoire
log SLOG : un SSD rapide qui reçoit le journal des écritures synchrones
special Les métadonnées et les petits blocs, sur un support rapide

Dans le contexte de l'atelier, les VMs imbriquées disposent de disques supplémentaires (/dev/sdc, /dev/sdd). Un pool miroir sur ces deux disques est l'exercice de référence pour s'entraîner.

Niveaux de redondance ZFS : miroir, RAIDZ-1, RAIDZ-2 et stripe, avec la répartition des blocs de données et de parité

4.2 Le Copy-on-Write : pourquoi ZFS ne corrompt jamais un fichier en cours d'écriture

Le Copy-on-Write (CoW) est le mécanisme qui rend les snapshots ZFS quasi-instantanés et garantit l'intégrité des données à tout moment. Avec le CoW, toute modification d'un fichier écrit les données modifiées à côté du fichier original, jamais par-dessus.

Imaginons un fichier constitué de blocs A, B, C et D. La plupart des systèmes de fichiers classiques écriraient les nouvelles données par-dessus le bloc C, sur place.

Avec le Copy-on-Write, ZFS copie les nouvelles données dans une nouvelle zone. Une fois la copie terminée, il met à jour les métadonnées du fichier pour pointer vers cette nouvelle zone. Le bloc C original est libéré ultérieurement par un processus en tâche de fond.

Il ne peut donc jamais exister d'état où les données sont à moitié écrites dans le fichier. Celui-ci est toujours soit dans son ancienne version complète, soit dans la nouvelle version complète. Une coupure de courant en plein milieu d'une écriture ne corrompt jamais un fichier ZFS — au pire, l'écriture n'a simplement pas eu lieu.

Un arbre de sommes de contrôle. ZFS range ses blocs dans un arbre de Merkle : chaque bloc contient la somme de contrôle des blocs qu'il désigne. Au sommet, l'uberblock décrit l'état complet du pool.

Une écriture se termine en remplaçant cet uberblock d'un coup. C'est pourquoi un pool ZFS n'a jamais besoin de fsck après une coupure : il repart du dernier uberblock valide.

Copy-on-Write ZFS : modifier le bloc C écrit les nouvelles données ailleurs sur le disque et met à jour les métadonnées, sans jamais écrire par-dessus l'original

Conséquence directe pour les snapshots : un snapshot ZFS ne fait que figer un pointeur vers l'état des métadonnées à cet instant. Tant que rien n'est modifié, le snapshot ne consomme aucun espace disque supplémentaire.

Revenons à la définition de base : un système de fichiers range des données sur des disques et tient le registre de ce qui est où. ZFS fait en plus le travail du RAID et des volumes. Son vocabulaire, du disque au bloc :

Terme Ce que c'est Dans le laboratoire
Disque Un disque physique sdc et sdd
vdev Un groupe de disques avec sa redondance (miroir, RAIDZ) mirror-0
zpool L'espace de stockage, fait d'un ou plusieurs vdev ; si un vdev entier tombe, tout le pool est perdu datapool
Dataset Un système de fichiers dans le pool, avec ses propriétés (quota, compression) datapool/vms
zvol Un volume en mode bloc, pour le disque d'une VM Les disques des VM sur le stockage ZFS (§4.5)
Copy-on-write Une donnée modifiée s'écrit ailleurs ; le pointeur bascule une fois l'écriture finie Une coupure ne laisse jamais un fichier à moitié écrit
Snapshot Un état figé, instantané, qui ne coûte que les blocs modifiés ensuite datapool/vms@avant-migration (§4.4)
Checksum Une somme de contrôle par bloc, vérifiée à chaque lecture et par le scrub zpool status : colonne CKSUM

Avec le copy-on-write, les pointeurs désignent toujours soit l'ancien bloc, soit le nouveau, jamais un bloc à moitié écrit. C'est pourquoi les snapshots sont instantanés, et une coupure de courant sans danger pour la cohérence.

Où voir ZFS sur votre nœud :

Notion Où la voir
Le pool, ses vdev et ses disques Nœud → Disks → ZFS ; zpool status (état ONLINE, mirror-0, sdc, sdd)
Les datasets et l'espace zfs list
Les snapshots zfs list -t snapshot
Le stockage Proxmox posé dessus Datacenter → Storage : type ZFS ; /etc/pve/storage.cfg : zfspool