Introduction

ZFS est un système de fichiers open source pour la gestion de "très haute capacité de stockage".
ZFS est utilisable sous Ubuntu, sous mac et sous windows
Ce document traite de l'utilisation de ZFS à partir de la version 24.04 de ubuntu pour stocker les données des utilisateurs.
Sa présentation générale est ici. Pour toute version antérieure, se référer à ce document.

Lire aussi le wiki Ubuntu en anglais. et les commandes

Pré-requis

Soit disposer d'une version ubuntu ZFS 24.04/26.04 chiffréeinstallée dans la totalité d'un disque dur pouvant être externe.
Soit disposer d'une version ubuntu 24.04/26.04 installée de façon classique dans une partition EXT4 ou BTRFS.
Pour utilisation avec la version standard 24.04, il est nécessaire d'ajouter le paquet zfs-zed
Pour utilisation avec la version standard 26.04, il est nécessaire d'ajouter le paquet zfs-utils

Création de l'enveloppe de stockage

Ce tuto montre un cas d'utilisation en structure sécurisée nécessitant au moins deux partitions avec des données chiffrées.
Bien entendu, il est possible de ne pas choisir l'option de chiffrement et de ne pas utiliser la redondance.

Sélection de l'espace disque.

Grâce à l'application gparted, fabriquer deux partitions de tailles identiques, de préférence dans deux disques différents.
Si les partitions utilisées sont déjà formatées ZFS, il est nécessaire de les reformater (en EXT4 par exemple) car la création sera refusée. Sinon, les partitions peuvent être déclarées non-formatées. La taille minimale des partitions est de 64 Mo. !

Mise disposition de cet espace disque

La mise à disposition pour l'utilisateur de cet espace prévu, se fait obligatoirement en ligne de commande.
L'auto-documentation (man zpool create) n'est pas mauvaise mais elle dispose de peu d'exemples pratiques.
Voici un exemple de commande à exécuter.

sudo zpool create -f -m /media/ZFS -O encryption=on -O keyformat=passphrase -O keylocation=prompt -o feature@lz4_compress=enabled MesDonneesPersonnelles raidz1 /dev/sda18 /dev/sdb11
  • -f Indique de forcer le montage.
    1. Permet de détruire le contenu des espaces disques sélectionnés.
  • -m Indique le point de montage à utiliser.
    1. Ne pas mettre cette option équivaut à effectuer le montage dans le point de montage racine /.
    2. Choisir /media/ en 24.04 à cause des applications snap.
    3. Choisir /run/media/ en 26.04 à cause des applications snap.
  • -O encryption=on Indique que l'option de chiffrement est activée.
    1. Le chiffrement n'est pas obligatoire. Mais il empêche assez efficacement les intrus d'accéder au contenu.
    2. Il est alors nécessaire de préciser le format du chiffrement et le lieu de récupération de la phrase.
  • -O keyformat=passphrase Indique que l'Option de format de la phrase de chiffrement est au format lisible.
    1. La taille doit être au minima de 8 caractères.
  • -O keylocation=prompt Indique que de la phrase de chiffrement sera récupéré depuis le clavier.
    1. Est obligatoire lorsque le logiciel n'est pas lui-même chiffré afin d'éviter que quiconque puisse en connaître la valeur.
    2. Sera à frapper en mode aveugle à chaque demande de montage 1). Ce qui exclu quelque chose de compliqué.
  • -O keylocation=file:/ / /etc/secret 2) Indique que la valeur de la phrase de chiffrement est stockée dans le fichier indiqué.
    1. Est utilisable lorsque le logiciel est lui-même chiffré. Ce qui normalement exclu le risque que quiconque puisse en connaître la valeur.
    2. Sera à frapper uniquement à l'initialisation du fichier. Ce qui permet quelque chose de compliqué.
  • -o feature@lz4_compress=enabled Indique que l'option de compression LZ4 activée.
    1. La littérature semble conseiller cette option.
    2. Ne pas s'attendre à des merveilles. Souvent les énormes fichiers sont déjà compressés.
  • MesDonneesPersonnelles Est le nom choisi pour l'accès à cet espace disque.
  • raidz1 Indique qu l'accès aux partitions se fait dans ce format équivalent au format raids5. La perte d'un élément de l'ensemble est alors admise.
    1. On pourrait ne rien mettre. Dans ce cas les disques/partitions seront traités à la manière du LVM. La perte d'un support entraîne la perte de la totalité des supports.
    2. On pourrait mettre mirror équivalent du RAID1.
    3. On pourrait aussi mettre raidz2 ou raidz3. La perte de 2 voir 3 éléments de l'ensemble est alors admise.
    4. Se souvenir que le format raidzN ne protège absolument pas des erreurs fonctionnelles.
  • /dev/sda18 /dev/sdb11 Sont les partitions à utiliser
    1. Il est possible d'en ajouter par la suite
    2. Il est impossible d'en retrancher.

A l'issue de cette commande réussie, le point de montage /media/ZFS est automatiquement créé et accessible en écriture.

Si l'une des partitions est stockée dans un disque externe, n'utiliser pas le nommage /dev/sdXn qui peut évoluer en fonction des montages, mais le nom réel de la partition /dev/disk/by-id/xxxxxxxxxx

Réutilisation de cet espace disque lors d'un nouveau démarrage

Le logiciel ZFS étant actuellement en phase expérimentale, il n'est pas facile de savoir si l'oubli de rendre disponible auprès de l'utilisateur ces données chiffrées, est définitif ou sera réparé.
Voici trois palliatifs.

Solution manuelle

Lorsque l'utilisateur se connecte, il doit penser à monter la structure zfs s'il souhaite l'utiliser. La seule solution est la ligne de commande. C'est simplement:

sudo zfs mount -vl MesDonneesPersonnelles

Le mot de déchiffrement sera demandé à l'écran de l'utilisateur.

Si l'espace disque n'est pas chiffré, le montage automatique de cet espace disque est bien réalisé à condition que ses caractéristiques soient restées identiques. Notamment que l'O.S. qui veut l'utiliser soit celui que venait de l' utiliser.

Solution automatique.

Des services utilisateur systemd peuvent prendre en charge ce montage afin de simplifier au quotidien cette contrainte.

Réutilisation de cet espace disque par un autre O.S.

De type ubuntu

Si cet espaace est chiffré en utilisant un fichier de chiffrement, il faut penser à cŕéer un tel fichier avec le bon contenu dans cet O.S.
Dans tous les cas, il est nécessaire d’importer l’espace en utilisant cette commande.

sudo import MesDonneesPersonnelles

De type windows

En plus des contraintes ubuntu, comme les noms de fichiers n’utilisent pas la méme norme, il sera nécessaire de modifier les noms des disques décrivant les entités utilisées, le nom du point de montage qui devient UneLettre: et le nom du fichier contenant la phrase de déchiffrement.
Si ces modifications sont faites en dur, un retour dans ubuntu, obligera à remettre en état.

Quelques essais

Une utilisation classique pour sauvegarder les données personnelles

Création du répertoire

sudo mkdir /media/ZFS/$USER
sudo chown -Rv $USER  /media/ZFS/$USER 
sudo chmod 775 /media/ZFS/$USER 

Déplacement des répertoires

mv -v Documents Images Modèles Musique Public Téléchargements Vidéos    /media/ZFS/$USER 

Création les liens

ln -s  /media/ZFS/$USER/Documents ; ln -s  /media/ZFS/$USER/Images ; ln -s   /media/ZFS/$USER/Modèles   ; ln -s   /media/ZFS/$USER/Musique ; ln -s  /media/ZFS/$USER/Public ; ln -s  /media/ZFS/$USER/Téléchargements ; ln -s   /media/ZFS/$USER/Vidéos
mv -v Bureau /media/ZFS/$USER && ln -s /media/ZFS/$USER/Bureau 

Figer le changement

cp -v /etc/xdg/user-dirs.conf $HOME/.config && sed -i 's/True/False/' $HOME/.config/user-dirs.conf 

Une utilisation possible avec utilisation de quotas.

Cela passe par la création des sous-ensembles (équivalents aux sous-répertoires).
Il n'est pas obligatoire de limiter.
On constate que la limite du remplissage semble bien fixée à 80% de l'espace prévu.

sudo zfs create -o quota=15G  MesDonneesPersonnelles/sports
sudo zfs create -o quota=5G  MesDonneesPersonnelles/sports/Foot
 
rsync -av --stats /media/$USER/Commun/Football/* /media/ZFS/sports/Foot/a 
sending incremental file list
Finale4.mp4
Finale5.mp4
rsync: [receiver] write failed on "/media/ZFS/sports/Foot/a/Finale5.mp4": Disk quota exceeded (122)
rsync error: error in file IO (code 11) at receiver.c(380) [receiver=3.2.7]
rsync: [sender] write error: Broken pipe (32)
 
df -htzfs | grep -E "Taille|Mes"
Sys. de fichiers                                 Taille Utilisé Dispo Uti% Monté sur
MesDonneesPersonnelles                              43G    240M   42G   1% /media/ZFS
MesDonneesPersonnelles/sports                       11G    256K   11G   1% /media/ZFS/sports
MesDonneesPersonnelles/sports/Foot                 5,0G    4,1G  982M  81% /media/ZFS/sports/Foot

Sauvegarder des O.S.

Sauvegarder un UBUNTU

sudo mkdir /media/ZFS/Ubuntu
time sudo rsync -avx / /media/ZFS/Ubuntu
sent 7.823.372.276 bytes  received 3.206.862 bytes  10.484.365,89 bytes/se
real	12m26,492s

Sauvegarder un Windows

sudo partclone.ntfs -c -d -s /dev/sda4 -o /media/ZFS/Windows.sda4.pcl
Current block:   18174668, Total block:   18175999, Complete: 100.00%           
Durée totale : 00:16:54, Ave. Rate:   2,77GB/min, 100.00% completed!

Quelques commandes utiles

Connaitre la place disque utilisée

 df -htzfs | grep -E "Taille|Mes" && zfs get all MesDonneesPersonnelles | grep ratio
Sys. de fichiers                                 Taille Utilisé Dispo Uti% Monté sur
MesDonneesPersonnelles                              43G     32G   12G  74% /media/ZFS
MesDonneesPersonnelles/sports                       11G    256K   11G   1% /media/ZFS/sports
MesDonneesPersonnelles/sports/Foot                 5,0G    4,1G  982M  81% /media/ZFS/sports/Foot
MesDonneesPersonnelles  compressratio         1.53x                    -
MesDonneesPersonnelles  refcompressratio      1.60x  

Agrandir l'espace disque

Pas d'autre choix que l'ajout de deux partitions de même taille mais pas obligatoirement la même que les deux premières partitions.

sudo zpool add -f  MesDonneesPersonnelles raidz /dev/sdc12 /dev/sdc13
 
zpool status MesDonneesPersonnelles
  pool: MesDonneesPersonnelles
 state: ONLINE
config:
 
	NAME                    STATE     READ WRITE CKSUM
	MesDonneesPersonnelles  ONLINE       0     0     0
	  raidz1-0              ONLINE       0     0     0
	    sda18               ONLINE       0     0     0
	    sdc11               ONLINE       0     0     0
	  raidz1-1              ONLINE       0     0     0
	    sdc12               ONLINE       0     0     0
	    sdc13               ONLINE       0     0     0

La commande suivante aurait pu fonctionner. Mais....

 sudo zpool attach -f  MesDonneesPersonnelles raidz1-0 /dev/sdc12
cannot attach /dev/sdc12 to raidz1-0: can only attach to mirrors and top-level disks 

Remplacer un disque

time sudo zpool replace -fw MesDonneesPersonnelles  /dev/sdc13 /dev/sda10
real	33m6,724s
user	0m0,007s
sys	0m0,012s
 
zpool status MesDonneesPersonnelles 
  pool: MesDonneesPersonnelles
 state: ONLINE
  scan: resilvered 36.1G in 00:33:01 with 0 errors on Fri Jun 14 17:36:18 2024
config:
 
	NAME                    STATE     READ WRITE CKSUM
	MesDonneesPersonnelles  ONLINE       0     0     0
	  raidz1-0              ONLINE       0     0     0
	    sda18               ONLINE       0     0     0
	    sdc11               ONLINE       0     0     0
	  raidz1-1              ONLINE       0     0     0
	    sdc12               ONLINE       0     0     0
	    sda10               ONLINE       0     0     0
 
errors: No known data errors

Partage réseau

Avant de pouvoir autoriser le partage réseau, pour éviter l'erreur NFS share creation failed , il est nécessaire d'installer la couche Réseau: Voir le paragraphe 3.1.
L'autorsation ZFS se fait alors facilement.
Exemple pour un niveau intermédiaire:

zfs get sharenfs MesDonneesPersonnelles/sports
NAME                           PROPERTY  VALUE     SOURCE
MesDonneesPersonnelles/sports  sharenfs  off       local
 
sudo zfs set  sharenfs=on MesDonneesPersonnelles/sports
 
zfs get sharenfs MesDonneesPersonnelles/sports
NAME                           PROPERTY  VALUE     SOURCE
MesDonneesPersonnelles/sports  sharenfs  on        local

Il reste alors à régler la configuration du NFS telle que décrite dans le paragraphe 3.2

Traitement de quelques incidents

Incident inhérent la conception de zfs

La fabrication d'un espace de stockage ZFS se fait en utilisant les noms courts des partitions. Par exemple SDC11.
Le premier risque est que la lettre de la partition change. Spécialement le cas si la partition est stockée dans un disque externe.
Le second risque est que le numéro de partition change. Dans un environnement UBUNTU, il faut lancer une commande spécifique (sgdisk). Mais si le disque côtoie windows et que son gestionnaire de partition est lancé, cette renumérotation est systématique.
Dans les deux cas, au final, l'espace est dégradé.

zpool status MesDonneesPersonnelles
  pool: MesDonneesPersonnelles
 state: DEGRADED
status: One or more devices could not be used because the label is missing or
	invalid.  Sufficient replicas exist for the pool to continue
	functioning in a degraded state.
action: Replace the device using 'zpool replace'.
   see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-4J
  scan: scrub repaired 0B in 00:04:11 with 0 errors on Sat Jun 15 19:25:40 2024
config:
 
	NAME                      STATE     READ WRITE CKSUM
	MesDonneesPersonnelles    DEGRADED     0     0     0
	  raidz1-0                DEGRADED     0     0     0
	    sda18                 ONLINE       0     0     0
	    17089491904315129872  UNAVAIL      0     0     0  was /dev/sdc11
	  raidz1-1                DEGRADED     0     0     0
	    9901095314787895760   UNAVAIL      0     0     0  was /dev/sdc12
	    sda10                 ONLINE       0     0     0  block size: 512B configured, 4096B native
 
errors: No known data errors

Après quelques tâtonnements dont l'un empêchait l'utilisateur de se connecter après un reboot inutile, la bonne réparation (faite en mode root dans ce contexte) est d'exporter et de réimporter la structure sans vouloir lancer des réparations.

sudo zpool export MesDonneesPersonnelles
sudo zpool import MesDonneesPersonnelles

Il était probablement inutile de bricoler pour retrouver la lettre C et les numéros 11 et 12.

Importation dans une version 22.04

sudo apt install zfs-zed --simulate 
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances... Fait
Lecture des informations d'état... Fait      
zfs-zed est déjà la version la plus récente (2.1.5-1ubuntu6~22.04.4).
zfs-zed passé en « installé manuellement ».
0 mis à jour, 0 nouvellement installés, 0 à enlever et 3 non mis à jour.
 
sudo zpool import -f Commun
This pool uses the following feature(s) not supported by this system:
	com.klarasystems:vdev_zaps_v2
cannot import 'Commun': unsupported version or feature

Comme une fonctionnalité activée ne peut pas s'invalider, il aurait fallu créer l'espace en indiquant de ne pas utiliser la fonctionnalité!

Evolution vers la version 26.04

Des fonctionnalités nouvelles apparaissent. Les activer, risque de ne plus rendre possible l'utilisation de la partition sous windows10 (ou ubutu24.04 ? ). A noter qu'une partition créée en 26.04 est accessible en 24.04.

zpool status Commun
  pool: Commun
 state: ONLINE
status: Some supported and requested features are not enabled on the pool.
	The pool can still be used, but some features are unavailable.
action: Enable all features using 'zpool upgrade'. Once this is done,
	the pool may no longer be accessible by software that does not support
	the features. See zpool-features(7) for details.
config:
 
	NAME                                        STATE     READ WRITE CKSUM
	Commun                                      ONLINE       0     0     0
	  raidz1-0                                  ONLINE       0     0     0
	    sda30                                   ONLINE       0     0     0
	    ata-TOSHIBA_MQ01UBD100_Z39DTAA3T-part2  ONLINE       0     0     0
 
errors: No known data errors

Annexes

1)
Sauf à utiliser un service systemd
2)
Attention: Les 2 premiers slashs ne sont pas suivis d'espace