Création de la partition système

Pour accueillir dans cette unique partition l'ensemble du système, le tout étant chiffré, il va falloir superposer plusieurs couches logicielles. La mise en place se divise donc en plusieurs étapes, correspondant à ces différentes couches :

  • une partition LUKS (Linux Unified Key Setup) qui servira de conteneur chiffré pour les couches supérieures,
  • une couche LVM (Logical Volume Management) pour pouvoir créer plusieurs volumes logiques dans un conteneur LUKS unique,
  • un système de fichier dans chaque volume logique.

Avant de détailler ces étapes, assurons-nous que nous avons bien installé tous les programmes nécessaires :

apt install cryptsetup lvm2 btrfs-progs

Contrairement à ce que l'on pourrait penser, il est parfaitement possible d'installer des paquets supplémentaires sur un système live, cette installation ne sera simplement pas persistente.

Création du conteneur chiffré

On commence par créer la partition LUKS avec la commande suivante :

cryptsetup luksFormat --type luks2 --verify-passphrase /dev/nvme0n1p2

Notez qu'à ce stade, il n'est pas encore question de l'utilisation du TPM. La clé de chiffrement est protégée, de façon classique, par une phrase de passe qu'il faudra saisir pour déchiffrer la partition. Le déchiffrement automatique par le TPM sera mis en place plus tard car cela doit être fait depuis le système que nous nous apprêtons à installer, et donc lorsque celui-ci sera opérationnel et que nous aurons pu démarrer dessus.

Même si elle ne sera plus utilisée au quotidien, la phrase de passe définie ici restera toutefois en place et servira de clé de secours, en cas de problème. Par exemple si le système ne démarre plus et que l'on a besoin de démarrer depuis un autre support (une clé USB live, par exemple). Il est donc important de bien la choisir : elle ne doit pas être trop simple pour ne pas affaiblir le chiffrement du disque, mais il faudra pouvoir s'en souvenir, alors même qu'on ne l'utilisera pas au quotidien.

On va ensuite ouvrir la partition LUKS :

cryptsetup open /dev/nvme0n1p2 nvme0n1p2_crypt

Le dernier paramètre de cette commande est un nom totalement arbitraire que l'on donne au volume déchiffré. Du point de vue du fonctionnement de LUKS, ce nom n'est pas enregistré et pourrait donc changer à chaque nouvelle ouverture. Il sera toutefois utilisé plus loin dans une configuration persistente, il faut donc choisir tout de suite un nom qui sera conservé ensuite. Utiliser le nom du volume sous-jacent suffixé par _crypt semble être une convention courante, mais cela n'a rien d'obligatoire.

Le contenu en clair de la partition est désormais accessible dans /dev/mapper/nvme0n1p2_crypt.

Mise en place de la gestion de volumes logiques

L'étape suivante est d'initialiser la gestion des volumes logiques. Pour cela, on va d'abord définir notre partition en tant que Volume Physique (PV, d'après les initiales anglaises) :

pvcreate /dev/mapper/nvme0n1p2_crypt

On crée ensuite un Groupe de Volumes (VG) constitué de notre unique PV. Contrairement au PV, nous devons nommé notre VG. Là encore le nom est arbitraire, mais choisir une convention de nommage et s'y tenir permet de s'y retrouvé par la suite. C'est d'autant plus important que l'on ne manipulera pas ce nom quotidiennement, il faut donc choisir un nommage qui sera facile à comprendre le jour ou on devra y remettre le nez après plusieurs mois ou années. Sur un PC portable ou de bureau, il est assez peu probable d'avoir plusieurs VG sur la même machine, je nomme donc tout simplement mes VG d'après le nom d'hôte préfixé par vg_. Si la machine doit s'appeler, par exemple, rocannon, cela donne :

vgcreate vg_rocannon /dev/mapper/nvme0n1p2_crypt

On peut maintenant créer les Volumes Logiques (LV) qui accueilleront les différents systèmes de fichiers dont nous avons besoin. Le nombre de LV dépend du choix du type de système de fichier : j'utilise ici une unique partition Btrfs (qui sera organisée en sous-volumes à l'étape suivante) et une partition d'échange (swap). Je crée donc les deux LV correspondant :

lvcreate -n lv_swap -L 8G vg_rocannon
lvcreate -n lv_racine -l 100%FREE vg_rocannon

Là encore, les noms sont totalement arbitraires. La remarque faite plus haut sur la pertinence de suivre une convention de nommage cohérente reste valable, ici j'utilise le préfixe lv_ suivi d'un mot décrivant l'usage du volume.

Notez la nuance entre les options -L, qui indique la taille absolue, et -l, qui permet d'exprimer une taille en fonction de l'espace libre restant (et aussi d'autres possibilités, cf. la page de manuel de lvcreate).

Je ne traite pas ici de la question de la pertinence d'une partition de swap sur une machine moderne avec beaucoup de mémoire physique, ni de la question de sa taille. Sur ce sujet on peut se référer, entre autre, à cet article.

Création des systèmes de fichiers

Ça n'est pas, à proprement parler, un système de fichier, mais la création de l'espace d'échange vient assez naturellement à ce stade du processus :

mkswap /dev/vg_rocannon/lv_swap

On crée ensuite le système de fichier btrfs :

mkfs.btrfs /dev/vg_rocannon/lv_racine

Un des avantages de Btrfs est la possibilité de créer des sous-volumes au sein du même système de fichier. Je trouve ce sytème plus flexible que LVM pour séparer, par exemple, /home de la racine /. C'est la raison pour laquelle j'ai créé un seul LV avec un seul système Btrfs. Nous alons maintenant créer les sous-volumes, ce qui nécessite d'abord de monter (temporairement) la partition. On le fait ici directement dans le /mnt du système depuis lequel on travaille :

mount /dev/vg_rocannon/lv_racine /mnt
cd /mnt
btrfs subvolume create racine
btrfs subvolume create home
umount /mnt

Je n'ai créé ici de sous-volume que pour la racine et /home. Si vous souhaitez séparer de la racine d'autres points de montage, comme /usr, /var ou /tmp, il faut aussi leur créer chacun son sous-volume. On ne fixe pas de taille à ce stade, mais Btrfs permet de fixer des quotas pour les sous-volumes, je ne détaille pas cet aspect dans ce guide, cela est bien documenté, par exemple dans la page de manuel de la commande btrfs-quota.

Bilan d'étape

Cette première phase de préparation est maintenant terminée, et nous allons pouvoir passer à l'installation proprement dite. Avant cela, je discute un peu plus, ci-dessous, des choix faits en terme de partitionnement. Vous pouvez sans problème sauter cette partie et passer au chapitre suivant.

On pourrait s'attendre à ce que le choix d'utiliser les sous-volumes de Btrfs permette de se passer totalement de la couche LVM, ce qui aurait simplifié l'ensemble. C'est uniquement la partition d'échange qui rend ici LVM nécessaire. Plusieurs solutions auraient permis d'éviter cela, mais aucune ne me semble satisfaisante :

  • la première est de mettre la swap dans sa propre partition directement sur le disque mais il aurait alors fallu lui créer son propre volume LUKS. En effet, un système chiffré mais avec une swap en clair ne servirait plus à rien : il serait tout à fait possible que des données sensibles, (y compris la clé de chiffrement du volume LUKS) aterrissent dans la swap, et soient donc accessibles en clair. Cela aurait aussi rendu moins flexible une éventuelle modification de la taille de la swap, et le processus de déchiffrement au démarrage aurait été un peu plus complexe.
  • la seconde est de ne pas avoir de swap du tout, mais d'après l'article cité plus haut (dont l'auteur est un des principaux développeurs du noyau Linux…), ça n'est pas une bonne idée. Mais si vous choisissez de vous passer totalement de swap, vous pouvez alors sauter l'étape LVM et créer directement le système Btrfs à la place du PV.
  • la troisième est d'utiliser un fichier de swap, plutôt qu'une partition. C'est sans doute une solution beaucoup plus flexible : non seulement elle nous aurait permit d'éviter la couche LVM, mais elle permet de modifier plus facilement la taille de la swap si nécessaire. Malheureusement, les fichiers de swap s'accomodent mal du system de Copy-on-Write qui est à la base de Btrfs (voir à ce sujet la documentation de Btrfs). Choisir un autre système de fichier, comme ext4, aurait permit d'utiliser un fichier de swap, mais cela aurait aussi nécessité de réintroduire LVM pour pouvoir séparer /home de la partition racine. Et même dans ce cas, les fichiers de swap ont la réputation d'être moins performants, mais surtout moins largement utilisés, donc moins testés et moins fiables.