| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
| tutoriel:donnees_stockees_dans_un_systeme_de_fichiers_zfs [Le 13/02/2026, 14:42] – +discussion https://forum.ubuntu-fr.org/viewtopic.php?id=2094391 krodelabestiole | tutoriel:donnees_stockees_dans_un_systeme_de_fichiers_zfs [Le 13/05/2026, 16:29] (Version actuelle) – [Solution automatique.] geole |
|---|
| |
| {{tag>tutoriel Noble zfs chiffrement raid}} | {{tag>tutoriel Noble zfs chiffrement raid vétuste à_supprimer}} |
| ===== Introduction ===== | ===== Introduction ===== |
| ZFS est un [[:systeme_de_fichiers#systemes_de_fichiers_zfs|système de fichiers]] [[https://fr.wikipedia.org/wiki/Open_source|open source ]]pour la gestion de "[[https://fr.wikipedia.org/wiki/ZFS|très haute capacité de stockage]]". \\ | ZFS est un [[:systeme_de_fichiers#systemes_de_fichiers_zfs|système de fichiers]] [[https://fr.wikipedia.org/wiki/Open_source|open source ]]pour la gestion de "[[https://fr.wikipedia.org/wiki/ZFS|très haute capacité de stockage]]". \\ |
| ZFS est utilisable sous Ubuntu, sous [[https://openzfsonosx.org/wiki/Downloads#2.2.2|mac]] et sous [[https://github.com/openzfsonwindows/openzfs/releases/tag/zfswin-2.2.3rc5|windows]] \\ | ZFS est utilisable sous Ubuntu, sous [[https://openzfsonosx.org/wiki/Downloads#2.2.2|mac]] et sous [[https://github.com/openzfsonwindows/openzfs/releases/tag/zfswin-2.2.3rc5|windows]] \\ |
| Ce document traite de l'utilisation de ZFS à partir de la version 24.04 de ubuntu pour stocker les données des utilisateurs. \\ | 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 [[:/zfs|ici.]] |
| Pour toute version antérieure, se référer à [[:utilisateurs/bcag2/zfs|ce document.]] | Pour toute version antérieure, se référer à [[:utilisateurs/bcag2/zfs|ce document.]] |
| |
| [[https://wiki.ubuntu.com/Kernel/Reference/ZFS|Lire aussi le wiki Ubuntu en anglais.]] | [[https://wiki.ubuntu.com/Kernel/Reference/ZFS|Lire aussi le wiki Ubuntu en anglais.]] |
| | [[https://openzfs.github.io/openzfs-docs/man/index.html|et les commandes]] |
| |
| |
| ===== Pré-requis ===== | ===== Pré-requis ===== |
| Soit disposer d'une version ubuntu ZFS **24.04** chiffrée[[https://doc.ubuntu-fr.org/_media/tutoriel/installer_ubuntu_avec_subiquity/41.png?w=600&tok=1d4597|installée]] dans la totalité d'un disque dur pouvant être externe. \\ | Soit disposer d'une version ubuntu ZFS **24.04/26.04** chiffrée[[https://doc.ubuntu-fr.org/_media/tutoriel/installer_ubuntu_avec_subiquity/41.png?w=600&tok=1d4597|installée]] dans la totalité d'un disque dur pouvant être externe. \\ |
| Soit disposer d'une version ubuntu **24.04** installée de façon classique dans une partition EXT4 ou BTRFS. \\ | Soit disposer d'une version ubuntu **24.04/26.04** installée de façon classique dans une partition EXT4 ou BTRFS. \\ |
| Lors de l'installation de la version standard 24.04.1, il est nécessaire d'ajouter le paquet **[[apt>zfs-zed|zfs-zed]]** | Pour utilisation avec la version standard 24.04, il est nécessaire d'ajouter le paquet **[[apt>zfs-zed|zfs-zed]]** \\ |
| Lors de l'installation de la version standard 26.04, il est nécessaire d'ajouter le paquet **[[apt>zfs-utils|zfs-utils]]** | Pour utilisation avec la version standard 26.04, il est nécessaire d'ajouter le paquet **[[apt>zfs-utils|zfs-utils]]** |
| |
| ===== Création de l'enveloppe de stockage ===== | ===== Création de l'enveloppe de stockage ===== |
| Bien entendu, il est possible de ne pas choisir l'option de chiffrement et de ne pas utiliser la redondance. \\ | 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. ==== | ==== Sélection de l'espace disque. ==== |
| Grâce à l'application [[https://doc.ubuntu-fr.org/gparted|gparted]], fabriquer deux partitions de tailles identiques. de préférence dans deux disques différents. \\ | Grâce à l'application [[https://doc.ubuntu-fr.org/gparted|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. | 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 ==== | !==== 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 la commande à exécuter. | 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. |
| <code bash>sudo zpool create -f -m /media/ZFS -O encryption=on -O keyformat=passphrase -O keylocation=prompt -o feature@lz4_compress=enabled MesDonneesPersonnelles raidz /dev/sda18 /dev/sdb11 | <code bash>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</code> |
| Enter new passphrase: | * ''-f'' Indique de forcer le montage. |
| cannot create 'MesDonneesPersonnelles': Passphrase too short (min 8).</code> \\ | - Permet de détruire le contenu des espaces disques sélectionnés. |
| * ''-f'' indique de forcer le montage. | * ''-m'' Indique le point de montage à utiliser. |
| * ''-m'' indique le point de montage à utiliser. J'ai choisis **media** à cause des applications snap. | - Ne pas mettre cette option équivaut à effectuer le montage dans le point de montage racine **/**. |
| * ''-O encryption=on'' indique Option de chiffrement activée. | - Choisir **/media/** en 24.04 à cause des applications snap. |
| * ''-O keyformat=passphrase'' Indique Option de format de la phrase de chiffrement au format lisible. | - Choisir **/run/media/** en 26.04 à cause des applications snap. |
| * ''-O keylocation=prompt'' indique Option de saisie de la phrase au clavier d'où le choix du format lisible. | * ''-O encryption=on'' Indique que l'option de chiffrement est activée. |
| * ''-o feature@lz4_compress=enabled'' indique option de compression **LZ4** activée. La littérature semble conseiller cette option. | - Le chiffrement n'est pas obligatoire. Mais il empêche assez efficacement les intrus d'accéder au contenu. |
| * ''[[https://www.recuperation-donnees-raid.com/raid-z|raidz]]'' Indique que l'accès aux partitions se fait dans ce format équivalent au format [[https://doc.ubuntu-fr.org/raid_logiciel|raids5]]. On pouvait ne rien mettre ou mettre **mirror** équivalent du RAID1. | - 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. |
| | - 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. |
| | - Est obligatoire lorsque le logiciel n'est pas lui-même chiffré afin d'éviter que quiconque puisse en connaître la valeur. |
| | - Sera à frapper **en mode aveugle** à chaque demande de montage ((Sauf à utiliser un service systemd)). Ce qui exclu quelque chose de compliqué. |
| | * ''-O keylocation=file:/ / /etc/secret'' (( Attention: Les 2 premiers slashs ne sont pas suivis d'espace)) Indique que la valeur de la phrase de chiffrement est stockée dans le fichier indiqué. |
| | - Est utilisable lorsque le logiciel est lui-même chiffré. Ce qui normalement exclu le risque que quiconque puisse en connaître la valeur. |
| | - 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. |
| | - La littérature semble conseiller cette option. |
| | - 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. |
| | * ''[[https://www.recuperation-donnees-raid.com/raid-z|raidz1]]'' Indique qu l'accès aux partitions se fait dans ce format équivalent au format [[https://doc.ubuntu-fr.org/raid_logiciel|raids5]]. La perte d'un élément de l'ensemble est alors admise. |
| | - On pourrait ne rien mettre. Dans ce cas les disques/partitions seront traités à la manière du [[:///lvm|LVM.]] La perte d'un support entraîne la perte de la totalité des supports. |
| | - On pourrait mettre ''mirror'' équivalent du RAID1. |
| | - On pourrait aussi mettre ''raidz2'' ou ''raidz3''. La perte de 2 voir 3 éléments de l'ensemble est alors admise. |
| | - **Se souvenir que le format ''raidzN'' ne protège absolument pas des erreurs fonctionnelles.** |
| | * ''/dev/sda18 /dev/sdb11'' Sont les partitions à utiliser |
| | - Il est possible d'en ajouter par la suite |
| | - 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. | A l'issue de cette commande réussie, le point de montage ''/media/ZFS'' est automatiquement créé et accessible en écriture. |
| | <note tip>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** </note> |
| <note tip>Si l'une des partitions est stockée dans un disque externe, n'utiliser le nommage **/dev/sdXn** qui peut évoluer en fonction des montages, mais le nom réel de la partition **/dev/disk/by-id/xxxxxxxxxx** </note> | |
| ===== Réutilisation de cet espace disque lors d'un nouveau démarrage ===== | ===== 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. | 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. |
| <code bash>sudo zfs mount -vl MesDonneesPersonnelles</code> | <code bash>sudo zfs mount -vl MesDonneesPersonnelles</code> |
| Le mot de déchiffrement sera demandé à l'écran de l'utilisateur. | Le mot de déchiffrement sera demandé à l'écran de l'utilisateur. |
| ==== Solution standard==== | <note tip>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.</note> |
| Un service **utilisateur** demande la valeur de la clé de chiffrement au moment de la connexion de l'utilisateur. | ==== Solution automatique. ==== |
| === Le script de montage === | Des services utilisateur [[:/systemd|systemd]] peuvent prendre en charge ce montage afin de [[https://forum.ubuntu-fr.org/viewtopic.php?pid=22895246#p22895246|simplifier]] cette contrainte. |
| <code bash>cat<<'EOF'>$HOME/ZFS.sh | ===== Réutilisation de cet espace disque par un autre O.S. ===== |
| #!/bin/bash | ==== De type ubuntu ==== |
| Data=MesDonneesPersonnelles | 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. |
| Statut=$(zpool list $Data |tail -1 ) | <code bash>sudo import MesDonneesPersonnelles</code> |
| if [[ ! $Statut =~ "$Data" ]] ; then | ==== De type windows ==== |
| echo Importation des données par le service USER de ZFS | 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. |
| sudo zpool export $Data ### Pour se prémunir des noms de partitions des disques externes susceptible de changer de valeur si besoin | |
| sudo zpool import -f $Data | |
| fi | |
| sudo zfs set mountpoint=/media/$Data $Data | |
| for (( i=1; i < 9; i++ )); do | |
| echo itération-$i dans le service USER de ZFS | |
| Statut=$(zfs get mounted $Data |tail -1 ) | |
| if [[ $Statut =~ "no" ]] ; then | |
| ret=`DISPLAY=:1 zenity --entry --title="Montage de la partition $Data ($i/8)." --text "veuillez fournir la phrase de déchiffrement de $Data." ` | |
| sleep 2 | |
| sudo zfs mount -l $Data <<<$ret | |
| else i=10 | |
| fi | |
| done | |
| if [[ ! $Statut =~ "yes" ]] ; then | |
| DISPLAY=:1 zenity --error --text "La partition $Data n'est pas disponible; veuillez investiguer!" | |
| fi | |
| EOF | |
| sleep 1 | |
| chmod +x /$HOME/ZFS.sh | |
| cat $HOME/ZFS.sh | |
| $HOME/ZFS.sh</code> | |
| === Le script d'automatisation === | |
| <code bash>mkdir -pv $HOME/.config/systemd/user | |
| cat <<'EOF'>$HOME/.config/systemd/user/ZFS.service | |
| [Unit] | |
| Description=Montage de la partition de données personnelles. | |
| DefaultDependencies=no | |
| [Service] | |
| Type=simple | |
| ExecStartPre=echo Montage de la partition de données personnelles ZFS. | |
| ExecStart=/home/%u/ZFS.sh | |
| ExecStopPost=echo Le ontage de la partition de données personnelles ZFS est terminé. | |
| StandardOutput=journal+console | |
| [Install] | |
| WantedBy=default.target | |
| EOF | |
| sleep 1 | |
| systemctl --user stop ZFS.service ; systemctl --user disable ZFS.service ; systemctl --user daemon-reload; | |
| systemctl --user enable ZFS.service ; systemctl --user start ZFS.service | |
| systemctl --user --no-pager -l status ZFS.service</code> | |
| |
| **La valeur de la clé de déchiffrement doit être dans un fichier**. Il existe quatre solutions: | |
| - Le logiciel est déjà chiffré. Dans ce cas la valeur de la clé de chiffrement peut être dans un fichier stocké sous** /root**. Solution aisément installable. | |
| - Le logiciel n'est pas chiffré, La clé de chiffrement peut être dans une clé usb que l'utilisateur branche au moment de se connecter et enlève aussitôt la connexion réalisée. C'est la solution privilégiée par les concepteurs. Solution aisément installable avec un risque de perdre la clé ou qu'elle soit lue par une personne non-habilitée. | |
| - La clé de déchiffrement est stockée dans le [[:seahorse|trousseau de clé]]. | |
| - Un service **système** demande à l'utilisateur la valeur de la clé de chiffrement, la stocke dans un fichier, ouvre la structure chiffrée et détruit le contenu du fichier. Cela ne laisse que quelques instants cette valeur disponible à la vue de tout le monde.... C'est un développement personnel susceptible d'être amélioré par qui connaît mieux. \\ Il est basé sur les services de [[:/systemd|systemd]] qui semblent destinés à se passer d'utilisateur. Le dialogue à l'écran étant inconnu. | |
| S'affranchir de la contrainte des mots de passe si cela n'a pas déjà été fait: | |
| <code bash>echo $USER ALL = '(ALL)' NOPASSWD: /usr/sbin/zpool, /usr/sbin/zfs |sudo tee /etc/sudoers.d/zfsbis</code> | |
| Devenir administrateur en frappant **sudo -i** pour définir la nouvelle commande de création de l'espace à utiliser. | |
| <code bash>echo -n LeBonMotDeDéchiffrement | tee /root/ZFS.pwd | |
| wc /root/ZFS.pwd ; cat /root/ZFS.pwd | |
| zpool create -f -m /media/ZFS -O encryption=on -O keyformat=passphrase -O keylocation=file:///root/ZFS.pwd -o feature@lz4_compress=enabled MesDonneesPersonnelles raidz /dev/sda18 /dev/sdc11 | |
| shred /root/ZFS.pwd</code> | |
| Penser à personnaliser la première ligne et le nom retenu pour la désignation de l'espace de stockage. | |
| === Le script de montage avec demande de mot de passe la connexion.=== | |
| <code bash>cat<<'EOF'>/root/ZFS.sh | |
| #!/bin/bash | |
| Data=MesDonneesPersonnelles | |
| echo Entrée dans le service USER de ZFS | tee -a /dev/kmsg | |
| for (( i=1; i < 300; i++ )); do | |
| MOI=$(loginctl list-users | head -2 | tail -1) | |
| IDn=$(echo $MOI | cut -d" " -f1) ; IDx=$(echo $MOI | cut -d" " -f2) ; | |
| if [[ $IDn -gt 999 ]] ; then | |
| i=300 | |
| else | |
| sleep 1 | |
| echo itération-1-$i dans le module USER de ZFS | tee -a /dev/kmsg | |
| fi | |
| done | |
| for (( i=1; i < 9; i++ )); do | |
| echo itération-2-1-$i dans le service USER de ZFS | tee -a /dev/kmsg | |
| Statut=$(zfs get mounted $Data |tail -1 ) | |
| if [[ $Statut =~ "no" ]] ; then | |
| ret=`sudo -u $IDx DISPLAY=:1 zenity --entry --title="Montage de la partition $Data ($i/8)." --text "veuillez fournir la phrase de déchiffrement de $Data." ` | |
| echo $ret > /root/ZFS.pwd | |
| sleep 1 | |
| zfs mount -vl $Data | |
| shred -n 0 -z /root/ZFS.pwd | |
| else i=10 | |
| fi | |
| done | |
| if [[ ! $Statut =~ "yes" ]] ; then | |
| sudo -u $IDx DISPLAY=:1 zenity --error --text "La partition $Data n'est pas disponible; veuillez investiguer!" | |
| fi | |
| EOF | |
| sleep 1 | |
| chmod +x /root/ZFS.sh | |
| cat /roo/ZFS.sh | |
| /root/ZFS.sh</code> | |
| Penser à personnaliser la troisième ligne. Cela ne coùte rien de l'essayer. | |
| === Le script de montage avec avec utilisation du trousseau de clé.=== | |
| Voir chapitre dédié. | |
| === Le script d'automatisation === | |
| <code bash>cat <<'EOF'>/etc/systemd/system/ZFS.service | |
| [Unit] | |
| Description=Montage de la partition de données personnelles. | |
| DefaultDependencies=no | |
| [Service] | |
| Type=simple | |
| TimeoutSec=5minutes | |
| ExecStartPre=echo Montage de la partition de données personnelles ZFS. | tee -a /dev/kmsg | |
| ExecStartPre=sleep 60 | |
| # Temps approximatif pour l'arrivée de l'écran d'accueil | |
| ExecStartPre=echo Montage de la partition de données personnelles ZFS ( Fin de sommeil ) | tee -a /dev/kmsg | |
| ExecStart=/root/ZFS.sh | |
| ExecStopPost=echo Montage de la partition de données personnelles ZFS est terminé | tee -a /dev/kmsg | |
| StandardOutput=journal+console | |
| StandardError=journal+console | |
| [Install] | |
| WantedBy=multi-user.target | |
| EOF | |
| sleep 1 | |
| ##### Essais. | |
| systemctl stop ZFS.service ; systemctl disable ZFS.service ; systemctl --user daemon-reload; | |
| systemctl enable ZFS.service ; systemctl start ZFS.service | |
| systemctl --no-pager -l status ZFS.service | |
| exit</code> | |
| ==== Solution avec utilisation du trousseau de clé==== | |
| Il est nécessaire d'installer une application permettant de mettre à jour le trousseau de clé et de récupérer son contenu sans utiliser le mode graphique. Voir [[https://forum.ubuntu-fr.org/viewtopic.php?id=2094167|cette discussion]] | |
| - Installer un logiciel. <code bash>sudo apt install libsecret-tools</code> | |
| - Y stocker la phrase secrète.<code bash>secret-tool store --label='Pour accéder à la partition ZFS' keyn valuen </code> La réponse à la première question est la valeur de la clé de chiffrement. Il faudra par la suite fournir son mot de passe pour valider l'opération . Il semble risqué d'en mettre un autre qu'il faudrait alors gérer. | |
| - Vérifier que la clé de chiffrement correspond bien. <code bash>echo -n .$(secret-tool lookup keyn valuen).</code> | |
| - En cas de gros problème, il est possible de supprimer cette saisie <code bash>rm -v $HOME/.local/share/keyrings/Trousseau_de_clés_par_défaut.keyring </code> | |
| |
| puis créer le script de montage de la partition. <code bash>cat<<'EOF'>$HOME/ZFS.sh | |
| #!/bin/bash | |
| Data=MesDonneesPersonnelles | |
| |
| if [[ ! $Statut =~ "$Data" ]] ; then | |
| echo Importation des données par le service USER de ZFS | |
| sudo zpool clear $Data | |
| sudo zpool export $Data ### Pour se prémunir des noms de partitions des disques externes susceptible de changer de valeur si besoin | |
| sudo zpool import -f $Data | |
| fi | |
| sudo zfs set mountpoint=/media/$Data $Data | |
| sudo zfs mount -l $Data <<<$(secret-tool lookup keyn valuen) | |
| Statut=$(zfs get mounted $Data |tail -1 ) | |
| [ ! $Statut =~ "yes" ]] ; then | |
| DISPLAY=:1 zenity --error --text "La partition $Data n'est pas disponible; veuillez investiguer!" | |
| fi | |
| EOF | |
| sleep 1 | |
| chmod +x /$HOME/ZFS.sh | |
| cat $HOME/ZFS.sh | |
| $HOME/ZFS.sh </code> | |
| Le script d'automatisation reste identique au précédant. \\ | |
| Nota. Si le trousseau de clé a été fabriqué avant la création de la partition, cette technique est utilisable pour fournir la phrase de déchiffrement lors de cette création. | |
| |
| |