Après les principaux systèmes de fichiers trouvés chez Microsoft, Apple et dans le monde Linux, nous nous penchons sur ZFS. Développé initialement par Sun, on le trouve dans plusieurs UNIX, quelques distributions, certaines gammes de NAS et même dans macOS pendant un temps. Ses caractéristiques sont nombreuses.
Alors que tous les noms de systèmes de fichiers sont composés généralement d’un sigle ayant un sens, ZFS n’en a pas particulièrement. Le « Z » renvoie, selon les personnes qui en parlent, à plusieurs significations, notamment zettabyte (zettaoctet) ou comme dernière lettre de l’alphabet, soulignant l’idée qu’il serait en quelque sorte l’aboutissement de ce que l’on peut faire de mieux dans le domaine.
Parmi tous les systèmes de fichiers déjà vus, ZFS est l’un des plus récents, avec APFS. Son développement a débuté en 2001. Il a été présenté et annoncé par Sun pour septembre 2004, mais il est arrivé six mois plus tard, intégré à Solaris, l’UNIX maison, puis dans OpenSolaris à la fin de la même année.
Dès le départ, ses caractéristiques ont fait de ZFS un système de fichiers à part. Il pourrait techniquement être la réponse à bien des problématiques de stockage, mais son fonctionnement particulier l’a réservé à certains scénarios. Des décisions justifiées ?
Lire notre dossier sur les systèmes de fichiers :
- Qu'est-ce qu'un système de fichiers ?
- Systèmes de fichiers : FAT12 à 32 et exFAT, conçus pour le grand public
- Systèmes de fichiers : NTFS et ReFS, pensés d’abord pour l’entreprise
- Systèmes de fichiers : de HFS et ses évolutions à APFS chez Apple
- Systèmes de fichiers : ext4 et Btrfs, les « frères ennemis » du monde Linux
ZFS, un système de fichiers hors normes
Les caractéristiques de ZFS sont peu communes. Dans les articles précédents, vous vous souvenez peut-être que l’arrivée du 64 bits avait profondément modifié les capacités des systèmes de fichiers concernés, comme dans NTFS et ext4. Dans le cas de ZFS, on parle de 128 bits.
Techniquement, la taille maximale des volumes et des fichiers est de 16 Eo, soit 16 millions de To. Un volume peut embarquer 2⁴⁸ fichiers, soit plus de 280 millions de milliards, ce qui correspond également au nombre maximal dans un répertoire. Il n’y a virtuellement aucune limite au nombre de fichiers qu’un volume peut ainsi stocker.
Des chiffres si élevés qu’ils ont fait dire au concepteur de ZFS, Jeff Bonwick, que « remplir en totalité un espace de stockage 128 bits consommerait, littéralement, plus d'énergie que de faire bouillir les océans ». Une phrase et une explication restées célèbres.
Comme on peut s’en douter, ZFS gère les noms longs (255 caractères). Pensé avant tout pour le monde UNIX, il reprend les autorisations POSIX (comme ext4 et Btrfs), auxquelles il ajoute les ACL (NFSv4). La hiérarchie de ZFS est en arbre B, comme la plupart des systèmes de fichiers modernes.
Bien que la taille des blocs soit par défaut de 128 ko, elle est en fait variable. Elle peut être adaptée selon les besoins au sein d’un même volume, que ce soit par l’administrateur ou par des processus automatisés. En cas de compression des données, elle est ainsi automatiquement activée.
Des caractéristiques bien spécifiques
L’approche retenue dès le départ tranche avec ce que l’on a pu voir jusqu’ici. ZFS virtualise partiellement la gestion du stockage, notamment celle des disques, ce que l’on peut rapprocher du fonctionnement des volumes logiques, que l’on retrouve par exemple dans APFS. Dans ZFS, il s’agit du Volume Manager, qui ajoute une couche d’abstraction intermédiaire entre les disques et le système de fichiers, donc avec le système d’exploitation. On parle ainsi parfois de ZFS comme d’une plateforme, car il reprend à son compte des fonctions trouvées habituellement dans le système d’exploitation lui-même.
Ce dernier verra ainsi des volumes mis à disposition depuis le Storage Pool. C’est à l’administrateur de déterminer quels vont être les besoins de stockage pour configurer des vdev (virtual device, ou appareil virtuel), c’est-à-dire des agrégats de disques ou de partitions. Chaque vdev peut être configuré avec ou sans redondance des données (choix du niveau de RAID) et selon des critères de performances spécifiques.
La gestion des vdev est souple, puisqu’ils peuvent être reconfigurés. On peut ainsi modifier le nombre de disques ou de partitions dans chaque vdev, augmenter ou diminuer sa capacité en ajoutant ou supprimant des disques, on peut déclarer un ou plusieurs disques en spare (redondance) dans chaque pool, etc.
Dans la gestion de l’ensemble, on trouve deux commandes essentielles. La première, zpool s’occupe des pools (agrégats). La seconde, zfs, gère les volumes et les datasets. Par exemple, si l’on souhaite créer un agrégat « nxi » de huit disques (nommés de a à h), dont deux utilisés en redondance, la commande est la suivante :
zpool create nxi raidz2 sd[abcdefgh]
ici, raidz2 est le type de RAID choisi pour établir la redondance. Avant d’aller plus loin, il faut donc aborder la manière dont ZFS s’occupe de l’intégrité des données.

Intégrité des données : c'est parti
C’est l’une des fonctions principales de ZFS : protéger l’intégrité des données. Des caractéristiques qui l’ont rendu populaire notamment auprès de certains constructeurs de NAS.
Premièrement, ZFS fait une utilisation différente des sommes de contrôle (checksum) en SHA-256. Comme dans Btrfs, elles sont utilisées aussi bien pour les données que les métadonnées. Mais au lieu d’être stockée dans le bloc de données concerné, une somme sera stockée dans le pointeur de ce bloc (bloc parent). Ce fonctionnement est répliqué dans l’intégralité de la hiérarchie du système de fichiers.
Ensuite, ZFS fonctionne – sans surprise cette fois – sur la base du copy-on-write. Comme nous l’avons expliqué plusieurs fois, cela signifie que les modifications sur des fichiers sont faites sur des copies de ces derniers, plutôt que sur les données originales. Ce qui signifie une augmentation de l’espace requis, mais pérennise les informations, puisqu’une opération échouée pourra être retentée ou des données pourront être restaurées.
Ce mécanisme est à la base des clones et snapshots, exactement comme dans Btrfs. Dans ZFS, on peut virtuellement créer autant d’instantanés que l’on souhaite, puisque leur nombre maximal est égal à celui du nombre maximal de fichiers dans un volume, soit 2⁴⁸. Ce fonctionnement peut être automatisé pour que ZFS crée de lui-même des snapshots ou des clones (les premiers sont en lecture seule, les seconds permettent l’écriture) à intervalles réguliers, avec suppression ou non des anciens.
ZFS a ses solutions RAID bien à lui
La gestion des modes RAID dans ZFS est particulière. Plutôt que d’employer des solutions matérielles, il est conseillé de laisser faire ZFS, qui a son propre fonctionnement logiciel.
ZFS peut utiliser les modes RAID classiques, mais on leur préfèrera RAID-Z, spécifique au système de fichiers. Semblable au RAID-5 (même schéma de parité), il tolère donc la panne d’un disque. Il dispose cependant d’un gros avantage sur son modèle : il permet d’éviter les trous d’écriture.
- siteStockage : c’est quoi un RAID et comment ça marche
- Stockage : on grimpe d’un cran avec les RAID 6, 10, 50, 60…
Dans une configuration RAID-Z, ZFS se sert de la copie sur écriture pour ajouter les nouvelles données aux côtés des anciennes, sans réécrire sur ces dernières. En outre, tout fichier, quelle que soit sa taille, a sa propre bande (full-strip, entrelacement total). En configuration RAID-Z, la séquence habituelle lecture-modification-écriture n’est pas utile. En cas de reconstruction, ZFS parcourt les métadonnées, une opération rendue possible car système de fichiers et matrice RAID se confondent, ZFS ayant une vue intégrée des vues logique et physique. Chaque bloc de données est alors validé par sa somme de contrôle.
Les checksums sont également utilisées pour effectuer de la « guérison automatique », quand des corruptions silencieuses de données se sont installées. Pour y remédier, ZFS compare chaque bloc lu à sa somme de contrôle. Si la réponse n’est pas bonne, le système de fichiers va lire les informations de parité correspondantes et répare les données. Une fois corrigées, elles sont envoyées au processus qui en a fait la demande.
Pour reprendre la commande donnée plus haut en exemple, raidz2 renvoie simplement à la configuration RAID-Z2, équivalente au RAID 6. Il existe une variante Z3, tolérant la panne de trois disques au sein d’une configuration RAID. RAID-Z supporte également le striping simple (RAID 0) et le mirroring (RAID 1).
À noter qu’une autre capacité est en cours de déploiement, après des années de travail : Raid-Z Expansion. Particulièrement attendue, elle permet d’ajouter un disque à une configuration RAID-Z déjà en place, opération impossible actuellement. Cette technologie fonctionne avec les configurations Z1, Z2 et Z3. La fonction est très récente. Elle est par exemple présente dans QuTS hero 5.1 (QNAP), sorti il y a un mois.
Pour les personnes comprenant bien l'anglais (ou sachant lire très rapidement les sous-titres sur YouTube), la chaine Lawrence Systems avait publié plusieurs vidéos sur ZFS, dont une portant sur la configuration des pools de stockage ZFS et de ses modes RAID-Z :
Des fonctions multiples et des caches à gogo
Parmi les autres fonctions disponibles dans ZFS, plusieurs sont directement présentes dans le traitement des entrées/sorties. À l’écriture, un bloc peut ainsi être compressé, chiffré, faire l’objet d’un contrôle avec sa somme ou dédupliqué.
La déduplication entre dans le champ des techniques visant à économiser la place quand on le peut. Avec la copie sur écriture par exemple, les données originales ne sont pas remplacées. Cependant, seules les parties différentes sont ajoutées : les données non modifiées ne sont présentes qu’en un seul exemplaire. Avec la déduplication, c’est un peu la même chose : les fichiers sont découpés en tronçons, chaque tronçon n’étant stocké qu’une fois. Si d’autres données possèdent les mêmes tronçons, des pointeurs s’occupent de référencer où trouver les informations « manquantes ».
Ce processus, dans le cas de ZFS, est très gourmand en mémoire vive. ZFS réclame en effet presque toute la mémoire disponible (au moins 75 %) pour y créer un cache en lecture nommé ARC (Adaptive Remplacement Cache). Le fonctionnement global est classique dans son approche : puisqu’il n’est pas possible de stocker l’intégralité des données en RAM, les informations les plus fréquemment demandées seront prioritaires dans le cache. Cette priorité est établie de manière dynamique selon l’ordre suivant : disque dur > SSD > RAM. Si la taille d’ARC – donc de la mémoire – est suffisante, les données n’auront pas besoin d’être lues depuis un disque dans la grande majorité des cas.
L2ARC (Level 2 Arc) est le deuxième niveau de cache en lecture, bien qu’optionnel, peut augmenter significativement les performances, notamment de la déduplication. Pour que L2ARC soit pleinement efficace, il doit être créé sur un disque rapide, idéalement un SSD véloce. Il faut également pouvoir y stocker l’intégralité de la table correspondante, dont la taille dépend bien sûr de la quantité de données sur les disques. Au même niveau, on peut aussi créer un ZIL (ZFS Intent Log), chargé de journaliser les flux d’écriture. Il est par défaut créé en mémoire, mais on peut le déporter vers un vdev dédié pour sécuriser les informations, et accompagné d’un miroir (la perte du ZIL peut corrompre tout l’agrégat de disques).
Une note tout de même sur cette dépendance à la RAM. Quand il est utilisé en entreprise, les serveurs ou équipements sont presque toujours accompagnés de mémoire ECC. ZFS peut être utilisé sans, mais puisque la mémoire est essentielle à son fonctionnement et qu’il en est friand, mieux ne pas lésiner sur les moyens, aucune erreur n’étant acceptable.
Pourquoi ZFS n’est-il pas plus utilisé aujourd’hui ?
On trouve ZFS dans certains produits et systèmes d’exploitation. Certains constructeurs de NAS l’utilisent dans leurs gammes, comme QNAP avec QuTS. Le système de fichiers est également géré par différents systèmes, notamment FreeBSD, NetBSD, FreeNAS et ZFSGuru. Et sous Linux ? C’est un peu plus compliqué.
La plupart des distributions n’intègrent pas de support pour ZFS. Il est possible cependant de l’installer, le plus souvent via la ligne de commande en passant par le gestionnaire de paquets présent dans le système. Sous Ubuntu par exemple, le support a été présent pendant un temps, mais les versions récentes ne l’ont plus. À chaque fois, il est possible d’installer ZFS, mais l’utiliser pour la partition root demande un peu de travail.
Pour comprendre un peu la situation, il faut savoir que le rachat de Sun Microsystems en 2010 par Oracle a changé la donne. Les sources du projet sont devenues fermées et OpenSolaris fut abandonné. En réaction, des développeurs ont réalisé un fork de ce dernier et repris les sources encore disponibles de ZFS pour créer OpenZFS, officiellement né en 2013. Parmi ses membres fondateurs, Matt Ahrens, l’un des principaux développeurs de ZFS.
En dix ans, la question d’une inclusion d’OpenZFS dans le noyau Linux a été de nombreuses fois remise sur le tapis. Son absence aujourd’hui s’explique surtout par les réactions épidermiques de Linus Torvalds sur le sujet. Il a déclaré à plusieurs reprises ne faire aucune confiance à Oracle, dont le comportement avec Java avait hérissé bien des développeurs.
En outre, il soutient qu’il existe une incompatibilité entre la GPLv2 du noyau Linux et la CCDL (Common Development and Distribution License) utilisée par OpenZFS. La CDDL est une licence créée par Sun à partir de la MPL (Mozilla Public License). Elle est reconnue comme libre par la Free Software Foundation, tout en étant incompatible avec la GPL, car elle possède un copyleft faible s’appliquant à chaque fichier. Richard Stallman en personne, auteur des GPL, y avait consacré une explication sur le site de la FSF. La consigne est, depuis, de ne pas utiliser CDDL si possible.
Pour autant, le grand public n’y perd sans doute rien. Les bénéfices de ZFS peuvent être immenses, mais sont taillés pour des configurations avec des disques multiples. Dans l’immense majorité des cas, les ordinateurs sont fournis avec un seul disque. Qu’il soit dur ou de type SSD ne change pas le constat : les fonctions de ZFS ne pourront pas s’y exprimer, car elles sont en bonne partie fondées sur la redondance et la parité. Les discussions à ce sujet sont nombreuses et régulières.
En dehors des questions de licence, cela peut expliquer aussi pourquoi certaines distributions, comme Fedora, se sont rapprochées de Btrfs ces dernières années.