# Récupération de données sur une partition ZFS chiffré
## TLDR;
> Cela ne s'applique que pour une installation ZFS avec Ubuntu. Dans les autres cas, il faudra adapter les commandes à vos besoins.
- `zpool import rpool`
- `cryptsetup luksOpen /dev/zvol/rpool/keystore keystore`
- `mkdir /mnt/keystore && mount /dev/mapper/keystore /mnt/keystore/`
- `zfs load-key -L file:///mnt/keystore/system.key rpool`
- `zfs mount rpool/<your ZFS dataset>`
## Petite mise en contexte
> Attention, la suite que vous allez lire ne sert à rien !
Imaginez, vous êtes mardi midi et, après une petite matinée bien tranquille, il est l'heure d'aller enfin de sustenter. Cependant voilà, Ubuntu vous notifie qu'il est enfin temps de faire une petite mise à jour de Ubuntu 21.04 à 21.10 et en plus, vous avez 1h30 devant vous à ne rien faire (*enfin si, mais rien sur l'ordinateur*).
La journée commence bien, le soleil est radieux (*sous la pluie*), les oiseaux chantent (*et s'enfuient face à la tempête qui se prépare*) et vous mettez à jour Ubuntu.
Mais voilà, après un dernier petit redémarrage ... C'est Tchernobyl sur votre écran; beaucoup d'élément de l'interface sont complètement foirés et il est difficile de se déplacer pour faire quoi que ce soit. Il vous reste 13 minutes avant de reprendre, mais rien de grave, on est sur ZFS ! Une petite réstauration du dernier snapshot avant le cataclysme et zou, c'est reparti... **QUE NENI !** Enfin si, après avoir selectionné la snapshot à restaurer sur le GRUB, on arrive enfin à notre bon vieux Ubuntu, avec cependant un petit changement quelque peu ... bruyant ; le ventilateur fait presque autant de bruit que mon voisin qui passe la débrousailleuse dans mon bureau un dimanche matin (*non, personne ne fait ça*).
Le CPU s'emballe et environ un tiers des resources disponibles sont consommées par ... ZFS lui même. Impossible de travailler dans ces conditions et il reste 2 minutes avant de reprendre. Dans ces cas-là, par expérience, il est souvent plus simple de réinstaller le système à neuf plutôt que d'essayer de trouver une solution à un problème qui n'apparaît pas dans la première page Google.
Seulement voilà, il faudrait mieux récupérer certaines données avant de le réinstaller, d'autant plus quand est en charge de l'infrastructure et que notre binôme a pris sa journée. (*bon, il est vrai que faire un `do-release-upgrade` un midi dans ces conditions est probablement l'une des pires idées, mais rappelez-vous les oiseaux chantaient !*)
Et là, tout s'accélère; il faut au plus vite trouver une solution et c'est assez compliqué de trouver des informations précises sur comment récupérer ses données sur un Ubuntu utilisant ZFS et étant chiffré.
## Détails technique
Après tout ce *blabla* fort peu utile, on va entrer dans le vif du sujet.
Je passe sur le fait qu'il faille lancer un liveUSB d'Ubuntu (suffisement récent pour avoir ZFS intégré) et passer sur la partie essai d'Ubuntu.
Dans un premier temps, il va falloir importer le `pool ZFS` de notre ancien système. Pour cela, rien de plus simple, par défault, le pool se nomme généralement `rpool` (`root pool`). Un simple `zpool import rpool` suffit à l'importer.
Ensuite, passons au déchiffrement. Sous Ubuntu, par défaut, nous avons une partition au seins du pool qui est chiffré avec `LUKS` contenant la clé de chiffrement de nos partitions ZFS. Celui-ci étant généralement placé dans le dataset `rpool/keystore`, il suffit de faire un simple `cryptsetup luksOpen /dev/zvol/rpool/keystore keystore` en utilisant le même mot de passe que vous utiliser au boot pour déchiffrer cette partition, qui sera disponible sous `/dev/mapper/keystore`. Enfin, un petit `mount /dev/mapper/keystore /mnt/keystore/` et nous voilà avec la clé de déchiffrement du pool, prêt à l'emploi.
L'avant dernière étape consiste juste à utiliser cette clé pour déchiffrer notre pool: `zfs load-key -L file:///mnt/keystore/system.key rpool`.
Et voilà, nous sommes enfin près à monter les datasets ZFS que l'on souhaite pour en extraire les fichiers que l'on souhaite sauver. Par exemple, pour monter notre partition `home`, on peut faire `zfs mount rpool/home/<user>...` qui montera la partition dans le `/home`. Si l'on souhaite le monter ailleurs, il faudra penser à changer le point de montage avec un `zfs set mountpoint=/mon_dossier rpool/home/<user>...`.