2022-06-11
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.
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. 🙂️
--------------------------------------------------------------------------------
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.
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 ? »
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.
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 !
--------------------------------------------------------------------------------
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) :
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
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...
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).
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".
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
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
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.
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
................................↑↑
--------------------------------------------------------------------------------
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.
--------------------------------------------------------------------------------
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 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 :
$ 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. 😉️
--------------------------------------------------------------------------------
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.
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.
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 :
« Atime and btrfs: a bad combination? »
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.
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.
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é.
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 ! 😁️
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.
--------------------------------------------------------------------------------