Guide d'installation d'Ubuntu dans une partition Btrfs chiffrée

2022-06-11

Couverture de l'article

Dans mon précédent article, je vous avais présenté Btrfs, un système de fichiers moderne et rempli de fonctionnalités qui peuvent s'avérer très utiles au quotidien. Aujourd'hui, on va passer à la pratique : on va voir comment installer Ubuntu 22.04 (Jammy Jellyfish) dans une partition Btrfs chiffrée (LUKS), avec le système ("/") et les données ("/home") séparés dans deux sous-volumes.

précédent article

Je vais aussi profiter de cet article pour vous expliquer comment utiliser les sous-volumes et les snapshots de Btrfs et pendant qu'on y est, je vous présenterai Timeshift, un petit outil graphique bien pratique. 😉️

Enfin, on verra les petits trucs à faire après l'installation pour améliorer les performances de Btrfs et pour utiliser un fichier d'échange (swap).

--------------------------------------------------------------------------------

⚠️ Warning

--------------------------------------------------------------------------------

ATTENTION : La partie « Installation d'Ubuntu ) du présent article n'est plus valable pour Ubuntu 23.04 et les versions plus récentes. Ubiquity, le logiciel d'installation d'Ubuntu, a été complètement réécrit et propose (pour le moment en tout cas) des options plus que limitées. J'essayerai de sortir une version à jour du guide d'installation pour la prochaine LTS si j'en ai le temps.

Les autres parties de l'article sont quant à elles toujours valides, vous pouvez donc vous y référer sans problème. 😉️

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

📝️ Note:

--------------------------------------------------------------------------------

Note : Dans ce guide, je pars du principe que vous possédez déjà un média d'installation d'Ubuntu, et que vous savez l'installer de manière « classique ». Être à l'aise avec la ligne de commande (ou en tout cas ne pas y être allergique) est également préférable. 🙂️

--------------------------------------------------------------------------------

Contents

Avant de commencer

Avant de se lancer tête baissée dans l'installation, je pense qu'il est important de faire rapidement le point sur deux composantes essentielles de notre installation : Btrfs et LUKS.

Le système de fichiers Btrfs

Btrfs est l'un des systèmes de fichiers les plus avancés disponibles actuellement sous Linux. Il offre de nombreuses fonctionnalités, comme la copie sur écriture, la gestion de sous-volumes, la possibilité de prendre des snapshots, la compression sélective des données,... Il ne gère par contre pas le chiffrement, c'est pourquoi nous allons utiliser un volume LUKS pour pallier à ce manque.

Si vous souhaitez en apprendre davantage sur Btrfs, je vous invite à lire mon précédent article : « Btrfs : révolution ou catastrophe ? Où en est-on aujourd'hui ? ».

« Btrfs : révolution ou catastrophe ? Où en est-on aujourd'hui ? »

Volume chiffré (LUKS)

LUKS, pour Linux Unified Key Setup spécifie une manière de chiffrer une partition ou un disque. Sous Linux, il est implémenté à travers dm-crypt.

LUKS

dm-crypt

Le fonctionnement de LUKS est relativement simple. Lors de la création d'un volume chiffré, une clef principale est générée ; elle servira à chiffrer l'ensemble des données du volume. Cette clef est elle-même chiffrée à l'aide d'un mot de passe spécifié par l'utilisateur. Lorsque l'on veut accéder à un volume LUKS, un mot de passe nous est donc demandé. Ce mot de passe est utilisé pour déchiffrer la clef principale, qui donne alors accès aux données.

Ce système de double clef est très intéressant car il permet de modifier le mot de passe de l'utilisateur sans avoir besoin de rechiffrer (et donc de réécrire) tout le disque. Seule la clef principale a besoin d'être rechiffrée avec le nouveau mot de passe, ce qui est quand même beaucoup plus rapide. 😁️

Il est de plus possible de disposer de plusieurs mots de passe distincts pour déchiffrer la même partition (jusqu'à 8 pour être précis). Ça peut être pratique si plusieurs utilisateurs ont besoin d'accéder au même volume, ou dans le cas d'une entreprise, pour que le service informatique dispose d'une clef de secours au cas où l'utilisateur perdrait son mot de passe. 🙃️

Je ne vous en dis pas plus sur LUKS pour cette fois-ci, mais si le sujet vous intéresse, n'hésitez pas à me le signaler, j'en ferai peut-être un article plus tard. 😃️

--------------------------------------------------------------------------------

⚠️ Warning

--------------------------------------------------------------------------------

ATTENTION : Avant de se lancer dans le chiffrement d'un disque, il est important de bien comprendre qu'en cas de perte du mot de passe, il ne sera plus possible d'accéder aux données. Il est donc essentiel de s'en souvenir ou de sauvegarder quelque part un mot de passe de secours !

--------------------------------------------------------------------------------

Installation d'Ubuntu

Maintenant qu'on sait tout ce que l'on doit savoir, on peut se lancer. Démarrez donc votre machine sur le média d'installation et lancez Ubiquity, le logiciel d'installation d'Ubuntu.

Les premières étapes sont sans surprises :

Les 3 premières étapes de l'installation d'Ubuntu

--------------------------------------------------------------------------------

📝️ Note:

--------------------------------------------------------------------------------

Note : La disposition de clavier que vous configurez ici sera également utilisée au démarrage de la machine pour entrer le mot de passe du volume LUKS, il est donc important de bien sélectionner la bonne.

--------------------------------------------------------------------------------

Une fois les questions de bases répondues, on va passer à la partie qui nous intéresse : le partitionnement.

Pour commencer, Ubiquity nous demande quel type d'installation on souhaite effectuer (4). Il y a plusieurs options de partitionnement assistées dont les choix varient en fonction de ce qui est présent sur la machine (dans mon cas il n'y a qu'un seul choix car le disque est vierge). Et tout à la fin il y a l'option « Autre chose » pour gérer le partitionnement nous-mêmes. C'est cette option qu'il va nous falloir choisir pour pouvoir créer notre partition Btrfs dans un volume chiffré.

Installation d'Ubuntu : type d'installation

On passe ensuite sur l'outil de partitionnement (5.1).

Installation d'Ubuntu : Outil de partionnement

Je vous propose de partitionner le disque de la manière suivante :

+---------+-----------+-----------------+------+----------------------------------------------------------------+
| Disque  | Partition | Taille          | Type | Point de montage / Description                                 |
+=========+===========+=================+======+================================================================+
| **sda** |                                                                                                     |
+---------+-----------+-----------------+------+----------------------------------------------------------------+
|         | sda1      | 1 Go            | ext4 | ``/boot`` - Contiendra GRUB et les noyaux Linux                |
+---------+-----------+-----------------+------+----------------------------------------------------------------+
|         | sda2      | 1 Go            | EFI  | ``/boot/efi`` - Contiendra le nécessaire pour démarrer en UEFI |
+---------+-----------+-----------------+------+----------------------------------------------------------------+
|         | sda3      | *Tout le reste* | LUKS | Volume chiffré qui contiendra notre partition Btrfs            |
+---------+-----------+-----------------+------+----------------------------------------------------------------+

--------------------------------------------------------------------------------

📝️ Note:

--------------------------------------------------------------------------------

Note : Mon disque s'appelle sda car il s'agit du premier disque SATA de la machine. Le vôtre peut avoir un nom différent, comme sdb ou encore nvme0n1 dans le cas d'un SSD NVMe.

--------------------------------------------------------------------------------

--------------------------------------------------------------------------------

⚠️ Warning

--------------------------------------------------------------------------------

IMPORTANT : Partition d'échange (swap)

Les plus attentifs remarqueront que je n'ai pas prévu de partition d'échange (ou partition swap). Il est en effet préférable de ne pas rajouter de partition swap non chiffrée puisque du contenu s'y retrouverait en clair.

Il faut cependant savoir que si on ne configure pas de partition swap, Ubuntu créera automatiquement un fichier swap à la place. Le problème, c'est que compte tenu des spécificités de Btrfs, ce fichier ne fonctionnera pas une fois l'installation terminée.

Avec mes 24 Go de RAM, je n'ai personnellement pas besoin de ce fichier d'échange, mais je vous expliquerais plus loin dans l'article comment le faire fonctionner. 😉️

--------------------------------------------------------------------------------

On commence donc par créer la première partition en cliquant sur le bouton [+], puis on remplit les informations suivantes (5.2) :

Installation d'Ubuntu : Outil de partionnement : Ajout de la partition /boot

--------------------------------------------------------------------------------

📝️ Note:

--------------------------------------------------------------------------------

Note : Si le bouton [+] n'est pas cliquable, sélectionnez d'abord la ligne « espace libre » dans la liste des partitions.

Si cette ligne n'est pas présente, c'est que votre disque est vierge et ne contient encore aucune table de partition. Il faudra alors cliquer sur le bouton « Nouvelle table de partition... » pour la créer.

--------------------------------------------------------------------------------

On passe ensuite à la partition EFI. On clique encore une fois sur le bouton [+] et on renseigne les informations suivantes (5.3) :

Installation d'Ubuntu : Outil de partionnement : Ajout de la partition EFI

On va maintenant s'occuper du volume chiffré, mais avant ça, lisez bien l'encart ci-dessous.

--------------------------------------------------------------------------------

⚠️ Warning

--------------------------------------------------------------------------------

ATTENTION : En temps normal, l'assistant d'installation n'écrit rien sur le disque tant qu'on a pas validé le partitionnement en cliquant sur « Installer maintenant ». Mais lorsque l'on crée un volume chiffré, il applique les changements immédiatement, et sans prévenir. Il est donc encore temps de s'arrêter là si vous avez oublié de sauvegarder des données !

--------------------------------------------------------------------------------

Maintenant que vous êtes prévenus, on va procéder à la création du volume LUKS. Encore une fois, on clique sur le bouton [+] et on commence à remplir avec les informations suivantes (5.4) :

Une fois le champ « Utiliser comme » rempli, plein de nouvelles options s'ajoutent à la fenêtre. Voici une courte description des principaux éléments :

Installation d'Ubuntu : Outil de partionnement : Ajout du volume chiffré

Une fois toutes les informations remplies, cliquez sur le bouton « OK ». Ubiquity va appliquer les changements sur le disque, ce qui prendra entre quelques dizaines de secondes et plusieurs heures suivant les choix que vous avez faits. 😅️

Une fois les changements appliqués, on peut voir qu'un nouveau « disque » nommé <nom_partition>_crypt est affiché dans l'installateur. Il s'agit d'une vue sur l'intérieur de notre volume chiffré (5.5). Par défaut Ubuntu y a créé une partition ext4, il nous faudra la modifier pour la formater en Btrfs.

Installation d'Ubuntu : Outil de partionnement : visualisation du volume chiffré

On sélectionne donc la partition et on clique sur le bouton « Modifier... ». Il ne nous reste plus qu'à remplir les informations suivantes dans la boîte de dialogue (5.6) :

Installation d'Ubuntu : Outil de partionnement : modification de la partition ext4 en partition Btrfs

On se retrouve au final avec le partitionnement suivant :

+----------------+------------+-----------------+-------+----------------------------------------------------------------------------+
| Disque         | Partition  | Taille          | Type  | Point de montage / Description                                             |
+================+============+=================+=======+============================================================================+
| **sda3_crypt** |                                                                                                                   |
+----------------+------------+-----------------+-------+----------------------------------------------------------------------------+
|                | sda3_crypt |                 | btrfs | ``/`` - Contiendra le système et les données dans des sous-volumes séparés |
+----------------+------------+-----------------+-------+----------------------------------------------------------------------------+
| **sda**        |                                                                                                                   |
+----------------+------------+-----------------+-------+----------------------------------------------------------------------------+
|                | sda1       | 1 Go            | ext4  | ``/boot`` - Contiendra GRUB et les noyaux Linux                            |
+----------------+------------+-----------------+-------+----------------------------------------------------------------------------+
|                | sda2       | 1 Go            | EFI   | ``/boot/efi`` - Contiendra le nécessaire pour démarrer en UEFI             |
+----------------+------------+-----------------+-------+----------------------------------------------------------------------------+
|                | sda3       | *Tout le reste* | LUKS  | Volume chiffré qui contient notre partition Btrfs                          |
+----------------+------------+-----------------+-------+----------------------------------------------------------------------------+

Vous pouvez à présent cliquer sur le bouton « Installer maintenant » et finir de répondre aux questions de l'installateur :

Dernières étapes de l'installation d'Ubuntu

Une fois l'installation terminée, il vous sera proposé de redémarrer. Pensez bien à sauvegarder la clef de secours si vous avez coché cette option (et que l'installateur l'a configuré sans erreur...) puis cliquez sur « Redémarrer maintenant ».

Installation d'Ubuntu : redémarrage final

Si tout s'est bien passé, vous devriez vous retrouver devant un écran vous demandant de rentrer votre mot de passe pour déchiffrer le disque :

Démarrage d'Ubuntu : demande du mot de passe pour déchiffrer la partition

Sous-volumes

Dans l'introduction de cet article, je vous avais dit que l'on séparerait le système ("/") des données ("/home"), et pourtant, on a rien fait de spécial à ce sujet lors de l'installation.

Contrairement à Anaconda, l'installateur de Fedora, qui permet de gérer les sous-volumes Btrfs à l'installation, Ubiquity, ne permet quant à lui aucune configuration. Lorsqu'on lui demande une partition Btrfs et qu'on lui indique "/" comme point de montage, il crée automatiquement deux sous volumes :

Si on jette un coup d'œil au fichier "/etc/fstab", on peut constater que c'est bien le cas :

# <file system>         <mount point>  <type>  <options>              <dump>  <pass>
/dev/mapper/sda3_crypt  /              btrfs   defaults,subvol=@      0       1
/dev/mapper/sda3_crypt  /home          btrfs   defaults,subvol=@home  0       2

Je ne vous ai gardé que les lignes qui nous intéressent ci-dessus. On peut voir que la partition "/dev/mapper/sda3_crypt" y est présente deux fois, mais avec des options de montage différentes.

L'option subvol permet en effet de définir le chemin vers le sous-volume qui nous intéresse. Et oui, j'ai bien dit le chemin, relatif à la racine du volume par défaut. Je vous explique tout ça.

Pour commencer, il faut savoir que lorsque l'on accède à une partition Btrfs sans spécifier d'options supplémentaires, on accède à un sous-volume un peu spécial que l'on nomme le « sous-volume par défaut ». On évite généralement de placer notre système ou nos données directement dans ce sous-volume ; on préfère y stocker les autres sous-volumes et leurs snapshots.

Si vous souhaitez voir le contenu du sous-volume par défaut, il suffit de le monter à l'aide d'une commande similaire à celle-ci :

$ sudo mount /dev/mapper/sda3_crypt /mnt

On peut alors lister les éléments présents dans le volume :

$ ls -l /mnt

drwxr-xr-x 1 root root 196 juin   6 13:02 @
drwxr-xr-x 1 root root  10 mai   31 14:00 @home

Comme vous pouvez le voir ci-dessus, on y retrouve nos deux sous-volumes : "@" et "@home", qui nous apparaissent comme de simples dossiers.

Les sous-volumes peuvent être imbriqués les uns dans les autres sans restriction particulière et il est possible de naviguer dedans avec les outils habituels... :

$ cd /mnt/@

$ ls

bin   cdrom  etc   lib    lib64   media  opt   root  sbin  srv       sys  usr
boot  dev    home  lib32  libx32  mnt    proc  run   snap  swapfile  tmp  var

... y comprit avec votre navigateur de fichier graphique :

Capture d'écran du sous-volume par défaut dans Nautilus

--------------------------------------------------------------------------------

📝️ Note:

--------------------------------------------------------------------------------

Note : Vous avez dû remarquer que le nom des sous-volumes commence par "@". Il s'agit d'une convention pour différencier plus facilement un sous-volume d'un simple dossier ; il n'y a aucune obligation de les nommer ainsi.

--------------------------------------------------------------------------------

Voyons maintenant comment on peut manipuler nos sous-volumes...

Lister les sous-volumes

Pour lister l'ensemble des sous-volumes existants, vous pouvez utiliser la commande suivante :

$ sudo btrfs subvolume list /

ID 256 gen 117 top level 5 path @
ID 257 gen 117 top level 5 path @home

Le dernier paramètre, "/", est le chemin vers un système de fichiers Btrfs. En gros ça marchera du moment que le chemin que vous indiquez se trouve sur un système de fichiers Btrfs (vous pouvez essayer avec "/var" par exemple), et cela échouera dans le cas contraire (vous pouvez essayer avec "/proc" si vous voulez tester).

Créer un sous-volume

Pour créer un sous-volume, la commande à utiliser est la suivante :

$ cd /home/flozz
$ btrfs subvolume create @example

Create subvolume './@example'

Ici, le sous-volume "@example" sera créé dans le dossier courant, c'est-à-dire dans mon dossier personnel.

Relistons les sous-volumes pour vérifier :

$ sudo btrfs subvolume list /

ID 256 gen 128 top level 5 path @
ID 257 gen 128 top level 5 path @home
ID 263 gen 128 top level 257 path @home/flozz/@example

On peut constater ici qu'un sous volume "@example" a été créé dans le dossier "flozz/" à l'intérieur du sous-volume "@home".

Supprimer un sous-volume

Pour supprimer un sous-volume, il y a deux possibilités : passer par la commande btrfs ou utiliser un bon vieux rm.

Avec la commande btrfs :

$ cd /home/flozz
$ sudo btrfs subvolume delete @example

Delete subvolume (no-commit): '/home/flozz/@example'

Avec rm :

$ cd /home/flozz
$ rm -r @example

Dans tous les cas, on peut constater que notre sous-volume a bien été supprimé :

$ sudo btrfs subvolume list /

ID 256 gen 128 top level 5 path @
ID 257 gen 128 top level 5 path @home

Déplacer un sous-volume

Tout comme un dossier standard, un sous-volume peut être renommé ou déplacé à l'aide de la commande mv :

$ cd /home/flozz
$ mv @example @nouveau-nom

Et encore une fois, on peut vérifier que ça a bien marché en listant les sous-volumes :

$ sudo btrfs subvolume list /

ID 256 gen 144 top level 5 path @
ID 257 gen 144 top level 5 path @home
ID 266 gen 138 top level 257 path @home/flozz/@nouveau-nom

On a fait le tour des principales choses à savoir sur les sous-volumes et leur manipulation. Si vous voulez en apprendre davantage, vous pouvez lire la documentation officielle de Btrfs.

la documentation officielle de Btrfs

Utilisation des snapshots de Btrfs

Btrfs offre la possibilité de prendre des instantanés (ou snapshots en anglais) des sous-volumes. Ces instantanés sont des « photographies » d'un sous-volume à un instant donné. Ils peuvent servir à sauvegarder l'état du système avant de le bricoler pour pouvoir revenir en arrière en cas de pépin.

Le seul truc à savoir sur les snapshots, c'est que ce ne sont en fait que des sous-volumes, mais qui contiennent des données dès le départ (celles du sous-volume d'origine). En dehors de leur création, on pourra donc les gérer avec les mêmes commandes vues précédemment.

Créer un snapshot

Prenons un exemple concret : imaginons que je veuille mettre à jour mon Ubuntu vers la version suivante. Avant de me lancer dans la migration, qui pourrait échouer pour une raison ou pour une autre, je vais créer un instantané du système.

Pour commencer je vais monter le sous-volume par défaut pour accéder au sous-volume "@" qui contient mon système :

$ sudo mount /dev/mapper/sda3_crypt /mnt

Puis je vais créer le snapshot à l'aide de la commande suivante :

$ sudo btrfs subvolume snapshot /mnt/@ /mnt/@.backup

Create a snapshot of '/mnt/@' in '/mnt/@.backup'

Si on veut s'assurer que l'instantané a bien été créé, il suffit de lister les sous-volumes :

$ sudo btrfs subvolume list /

ID 256 gen 169 top level 5 path @
ID 257 gen 159 top level 5 path @home
ID 268 gen 168 top level 5 path @.backup

Je peux à présent procéder sereinement à ma migration.

--------------------------------------------------------------------------------

📝️ Note:

--------------------------------------------------------------------------------

Note : Les snapshots sont accessible en lecture / écriture par défaut. Il est possible de les créer en lecture seule en rajoutant l'option "-r" a la commande lors de leur création :

$ sudo btrfs subvolume snapshot -r /mnt/@ /mnt/@.backup

................................↑↑

--------------------------------------------------------------------------------

Restaurer un snapshot

Imaginons maintenant que les choses aient mal tourné et que je souhaite revenir en arrière. Pour restaurer un snapshot, il suffit de remplacer le sous-volume d'origine par son snapshot.

Comme tout à l'heure, on commence par monter le sous-volume par défaut :

$ sudo mount /dev/mapper/sda3_crypt /mnt

Puis il suffit de bouger les « dossiers » avec la commande mv :

$ mv /mnt/@ /mnt/@.a-jetter
$ mv /mnt/@.backup /mnt/@

--------------------------------------------------------------------------------

📝️ Note:

--------------------------------------------------------------------------------

Note : Il est, je pense, préférable de faire cette manipulation à froid, c'est-à-dire depuis un live CD / USB. Ceci dit, faire ce changement à chaud fonctionne quand même mais il faudra redémarrer pour qu'il prenne effet.

--------------------------------------------------------------------------------

Snapshots et sous-volumes imbriqués

Comme je vous l'ai dit lorsque l'on a abordé les sous-volumes de Btrfs, il est possible de créer des sous-volumes dans des sous-volumes. Il y a cependant un petit détail a savoir au sujet des snapshots dans ce genre de configurations.

Si vous avez un sous-volume @A qui contient un sous-volume @B et que vous faites un instantané de @A, le sous-volume @B qu'il contient ne fera pas partie du snapshot. Il sera remplacé par un dossier vide. Les sous-volumes agissent comme des « barrières » pour les snapshots.

Voilà, c'était un petit détail qu'il me semblait important de mentionner pour vous éviter de mauvaises surprises. 😁️

Pour plus d'information à ce sujet, vous pouvez consulter la documentation de Btrfs.

consulter la documentation de Btrfs

Timeshift : un outil bien pratique

Timeshift est un outil graphique pour manipuler et automatiser la prise de snapshots. Il est disponible dans les dépôts, et peut donc être installé avec la commande suivante :

Timeshift

$ sudo apt install timeshift

Au premier démarrage, Timeshift affichera un assistant de configuration. On peut globalement laisser les paramètres par défaut qui devraient convenir à la plupart des situations :

Étapes de configuration de Timeshift

Une fois configuré, on arrive devant l'interface principale de Timeshift qui permet de gérer les instantanés et d'en prendre manuellement au besoin :

Capture d'écran de Timeshift avec un snapshot

Si vous vous demandez où Timeshift sauvegarde ses instantanés, sachez qu'ils sont rangés dans le dossier "/timeshift-btrfs/snapshots/" situé dans le sous-volume par défaut de la partition Btrfs.

On peut les voir en naviguant dans ce dossier :

$ sudo mount /dev/mapper/sda3_crypt /mnt
$ cd /mnt/timeshift-btrfs/snapshots
$ ls -l

drwxr-xr-x 1 root root 20 juin   7 13:38 2022-06-07_13-38-01

$ ls -l 2022-06-07_13-38-01/

drwxr-xr-x 1 root root 188 juin   6 13:23 @            # <-- instantané du système
-rw-r--r-- 1 root root 414 juin   7 13:38 info.json    # <-- métadonnées de Timeshift

On peut également les afficher en listant les sous-volumes :

$ sudo btrfs subvolume list /

ID 257 gen 212 top level 5 path @home
ID 268 gen 213 top level 5 path @
ID 269 gen 207 top level 5 path timeshift-btrfs/snapshots/2022-06-07_13-38-01/@

--------------------------------------------------------------------------------

⚠️ Warning

--------------------------------------------------------------------------------

IMPORTANT : Je tiens à préciser un petit détail en passant : les snapshots Btrfs sont très pratiques pour revenir en arrière lors d'une fausse manip', mais ne constituent pas des sauvegardes. Si votre disque dur tombe en panne, ou que vous écrasez votre partition Btrfs par erreur (formatage, mauvaise utilisation de la commande dd,...), les instantanés ne vous sauveront pas. 😉️

--------------------------------------------------------------------------------

Quelques trucs à faire après l'installation

Je vais maintenant vous présenter quelques petits trucs à faire après l'installation pour optimiser le fonctionnement de Btrfs et pour réparer le fichier d'échange si jamais vous en avez besoin.

Optimisation : désactiver l'access time (noatime)

Sous Linux, plusieurs horodatages sont enregistrés pour chaque fichier :

Ici on va s'attarder sur l'horodatage atime, qui peut nous causer divers soucis.

Premièrement, le simple fait de lire un fichier va provoquer une écriture sur le disque, ce qui réduit les performances globales, quel que soit le système de fichiers utilisé.

Ensuite, en raison de son mécanisme de copie sur écriture et de ses snapshots, Btrfs a un problème bien plus grave avec atime : dans certaines circonstances, lire un fichier peut consommer de l'espace disque supplémentaire. Oui, vous avez bien lu ! 😵️

--------------------------------------------------------------------------------

📝️ Note:

--------------------------------------------------------------------------------

Voici un exemple de cas problématique :

Imaginons que vous avez un sous-volume Btrfs plein de photos (disons plusieurs dizaines de milliers). Maintenant vous effectuez un snapshot de ce sous-volume. Jusque là tout va bien : le snapshot ne consomme pas spécialement d'espace disque supplémentaire grâce à la déduplication des données.

Puis vous ouvrez le dossier contenant vos photos dans votre navigateur de fichier préféré, et celui-ci commence à générer des miniatures pour chaque photo. Pour faire cela, il lit les fichiers et provoque donc la mise à jour du atime de chacun d'entre eux.

Étant donné que ces données ne sont pas modifiées sur place à cause du copy-on-write, cette modification provoque dans un premier temps la réécriture des métadonnées à un autre endroit du disque, ce qui dégrade les performances de lecture et crée de la fragmentation. Et comme on a un snapshot de notre sous-volume, les précédentes métadonnées sont conservées en plus des nouvelles (puisque toujours utilisées par le snapshot). On a donc consommé de l'espace disque simplement en naviguant dans un dossier. 👍️

--------------------------------------------------------------------------------

Certains diront que cette problématique a été réduite depuis que les systèmes de fichiers sont montés avec l'option "reltime" par défaut. Cette option fait en sorte que l'horodatage atime d'un fichier ne soit écrit, au maximum, qu'une seule fois par jour (si le fichier n'a pas été modifié). Ça limite surtout les problèmes de performance en lecture des fichiers auxquels on accède fréquemment, mais ça ne résout en rien la consommation supplémentaire d'espace disque présentée ci-dessus.

Étant donné que cette métadonnée est la plupart du temps inutile (dans les faits seuls de très rares logiciels, comme le client email Mutt, en ont réellement besoin), le mieux à faire est de la désactiver.

Mutt

Pour cela, il suffit de rajouter "noatime" aux options de montage dans le fichier "/etc/fstab", ce qui donne chez moi :

# <file system>         <mount point>  <type>  <options>                      <dump>  <pass>
/dev/mapper/sda3_crypt  /              btrfs   defaults,noatime,subvol=@      0       1
/dev/mapper/sda3_crypt  /home          btrfs   defaults,noatime,subvol=@home  0       2

# ..................................................... ↑↑↑↑↑↑↑↑

(Je n'ai conservé que les lignes intéressantes dans l'exemple ci-dessus.)

Pour appliquer immédiatement les changements sans avoir à redémarrer, vous pouvez utiliser la commande suivante :

$ sudo mount -a -o remount

Sources :

La documentation de Btrfs

« Atime and btrfs: a bad combination? »

Faire fonctionner le fichier d'échange (swapfile)

Comme je vous l'ai indiqué lors de l'installation d'Ubuntu, si on ne crée aucune partition swap, Ubuntu nous créera automatiquement un fichier swap à la place. On peut le trouver à la racine de notre système de fichiers :

$ ls -lh /swapfile

-rw------- 1 root root 461M mai   31 13:58 swapfile

On peut également constater sa présence dans le fichier "/etc/fstab" :

# <file system>  <mount point>  <type>  <options>  <dump>  <pass>
/swapfile        none           swap    sw         0       0

Cependant, si on regarde les swaps actifs, on se rend compte qu'il n'y en a aucun :

$ cat /proc/swaps

Filename             Type  Size    Used  Priority

Et si on essaye d'activer manuellement notre fichier d'échange, cela échoue lamentablement :

$ sudo swapon -a

swapon: /swapfile : échec de swapon: Argument invalide

Mais que se passe-t-il donc ? L'utilisation d'un fichier swap est-elle possible avec une partition Btrfs ?

Oui, il est possible d'utiliser un fichier swap avec Btrfs, mais il y a quelques contraintes à respecter pour que cela puisse fonctionner... Et visiblement l'installateur d'Ubuntu n'est pas très au point de ce côté-là. On va donc devoir faire le travail nous-mêmes. 😅️

Pour commencer, vous pouvez supprimer le fichier swap créé par Ubuntu, car il prend de la place et ne nous sert à rien :

$ sudo rm /swapfile

Ensuite, on va créer un sous-volume pour contenir notre fichier d'échange. Ceci est nécessaire, car lorsque le swapfile sera en cours d'utilisation, il ne sera plus possible de snapshoter le sous-volume qui le contient. On va donc l'isoler dans un sous-volume dédié.

On monte donc le sous-volume par défaut :

$ sudo mount /dev/mapper/sda3_crypt /mnt

Et on crée le sous-volume pour le fichier swap :

$ sudo btrfs subvolume create /mnt/@swap

On désactive ensuite la copie sur écriture sur tout le « dossier », de manière à ce que les fichiers que l'on va créer dedans aient également cette fonctionnalité désactivée :

$ sudo chattr +C /mnt/@swap

On peut maintenant recréer le fichier swapfile dans notre sous-volume :

$ sudo fallocate -l 100M /mnt/@swap/swapfile

--------------------------------------------------------------------------------

📝️ Note:

--------------------------------------------------------------------------------

Note : Ici je crée un fichier swap de 100 Mo car je n'ai pas beaucoup de place dans la machine virtuelle que j'utilise pour mes expérimentations. Vous pouvez bien sûr créer un fichier d'échange plus grand. Par exemple, pour en créer un de 2 Go, vous pouvez remplacer "-l 100M" par "-l 2G".

--------------------------------------------------------------------------------

On corrige ensuite ses permissions, car le fichier d'échange ne doit être accessible que par l'utilisateur root :

$ sudo chmod 600 /mnt/@swap/swapfile

Et enfin, on le formate :

$ sudo mkswap /mnt/@swap/swapfile

Le fichier d'échange est maintenant prêt, il ne nous reste plus qu'à configurer le système pour monter le sous-volume "@swap" quelque part et utiliser le fichier qui s'y trouve comme espace d'échange.

Pour ce faire, on commence par créer un dossier vide qui servira de point de montage :

$ sudo mkdir /swap

Puis on édite le fichier "/etc/fstab", dans lequel il faudra remplacer la ligne qui commence par "/swapfile" par celles-ci :

# <file system>         <mount point>  <type>  <options>                                <dump>  <pass>
/dev/mapper/sda3_crypt  /swap          btrfs   defaults,noatime,nodatacow,subvol=@swap  0       2
/swap/swapfile          none           swap    sw                                       0       0

--------------------------------------------------------------------------------

📝️ Note:

--------------------------------------------------------------------------------

Note : Pensez bien à remplacer "/dev/mapper/sda3_crypt" par le chemin vers votre volume chiffré s'il est différent du mien !

--------------------------------------------------------------------------------

Pour tester que tout fonctionne, on a plus qu'à monter notre sous-volume "@swap" à l'aide de la commande suivante :

$ sudo mount -a

Et à activer le fichier d'échange :

$ sudo swapon -a

Si tout s'est bien passé, on devrait maintenant voir notre swapfile listée dans "/proc/swaps" :

$ cat /proc/swaps

Filename        Type  Size    Used  Priority
/swap/swapfile  file  102396  0    -2

Si vous souhaitez en apprendre davantage sur l'utilisation d'un swapfile avec Btrfs, je vous invite à lire la documentation officielle.

la documentation officielle

Trousse de secours : accéder manuellement au volume chiffré

Si jamais, pour une raison ou pour une autre, vous avez besoin d'accéder à votre volume chiffré depuis un live CD ou depuis une autre machine, sachez que c'est très facilement faisable.

Méthode graphique

Il est possible de monter le volume LUKS en quelques clics depuis le navigateur de fichier Nautilus :

Capture d'écran du déverrouillage d'un volume LUKS dans Nautilus

Il ne vous reste plus qu'à entrer votre mot de passe pour déverrouiller le volume chiffré.

Méthode en ligne de commande

Si vous n'avez pas accès à Nautilus ou que vous préférez la ligne de commande, ce n'est pas beaucoup plus compliqué :

Pour déverrouiller le volume chiffré, utilisez la commande suivante :

$ sudo cryptsetup luksOpen /dev/sda3 sda3_crypt

où :

Et pour monter la partition Btrfs, on utilise tout simplement la commande mount :

$ sudo mount /dev/mapper/sda3_crypt /mnt

                         ↑↑↑↑↑↑↑↑↑↑
                   nom que vous avez indiqué
                 lors de la commande précédente

Et voilà, c'est tout ! 😁️

Conclusion

Comme vous avez pu le constater, installer Ubuntu dans une partition Btrfs chiffrée n'est pas très compliqué. Il serait cependant appréciable que l'installateur d'Ubuntu propose une meilleure intégration de Btrfs, en permettant la configuration des sous-volumes par exemple. Il serait également bien que le support des volumes chiffrés s'améliore.

J'aurais voulu aborder encore plein de sujets autour de Btrfs et de LUKS dans cet article, mais il commençait à devenir beaucoup trop long, alors j'en parlerais peut-être dans de futurs articles.

J'espère en tout cas que ce petit guide a pu vous être utile. N'hésitez pas à poser vos questions ou à poster vos retours d'expériences en commentaire ! 😉️

--------------------------------------------------------------------------------

EDIT 2023-10-15 : Ajout d'un warning sur l'obsolescence du guide d'installation à partir d'Ubuntu 23.04.

--------------------------------------------------------------------------------

L'image de couverture de cet article est dérivée d'une photo de Hannes Grobe, placée sous licence cc by-sa 4.0.

une photo de Hannes Grobe

cc by-sa 4.0

--------------------------------------------------------------------------------

🏠 Accueil