| 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 08/04/2026, 17:29] – note geole | tutoriel:donnees_stockees_dans_un_systeme_de_fichiers_zfs [Le 13/05/2026, 16:29] (Version actuelle) – [Solution automatique.] geole |
|---|
| |
| [[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]] |
| |
| |
| 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. La taille minimale des partitions est de **64 Mo.** | 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 un exemple de 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 raidz1 /dev/sda18 /dev/sdb11</code> | <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> |
| * ''-f'' Indique de forcer le montage. | * ''-f'' Indique de forcer le montage. |
| - Permet de détruire le contenu des espaces disques sélectionnés. | - Permet de détruire le contenu des espaces disques sélectionnés. |
| * ''-m'' Indique le point de montage à utiliser. | * ''-m'' Indique le point de montage à utiliser. |
| * - Ne pas mettre cette option équivaut à effectuer le montage dans le point de montage racine **/**. | - Ne pas mettre cette option équivaut à effectuer le montage dans le point de montage racine **/**. |
| - Choisir **/media/** en 24.04 à cause des applications snap. | - Choisir **/media/** en 24.04 à cause des applications snap. |
| - Choisir **/run/media/** en 26.04 à cause des applications snap. | - Choisir **/run/media/** en 26.04 à cause des applications snap. |
| - Est obligatoire lorsque le logiciel n'est pas lui-même chiffré afin d'éviter que quiconque puisse en connaître la valeur. | - 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é. | - Sera à frapper **en mode aveugle** à chaque demande de montage ((Sauf à utiliser un service systemd)). Ce qui exclu quelque chose de compliqué. |
| * ''-O keylocation=/ / /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é. | * ''-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. | - 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é. | - Sera à frapper uniquement à l'initialisation du fichier. Ce qui permet quelque chose de compliqué. |
| <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. |
| <note tip>Si l'espace disque n'est pas chiffré, le montage automatique de cet espace disque est bien réalisé a 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> | <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> |
| ==== Solution standard==== | ==== Solution automatique. ==== |
| Un service **utilisateur** demande la valeur de la clé de chiffrement au moment de la connexion de l'utilisateur. | 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. |
| === Le script de montage === | ===== Réutilisation de cet espace disque par un autre O.S. ===== |
| <code bash>cat<<'EOF'>$HOME/ZFS.sh | ==== De type ubuntu ==== |
| #!/bin/bash | 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. |
| Data=MesDonneesPersonnelles | <code bash>sudo import MesDonneesPersonnelles</code> |
| Statut=$(zpool list $Data |tail -1 ) | ==== De type windows ==== |
| if [[ ! $Statut =~ "$Data" ]] ; then | 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. |
| echo Importation des données par le service USER de ZFS | |
| 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. | |
| |
| |