Activer le TRIM sur une Debian chiffrée LUKS et partitionnée LVM

ven. 06 février 2015 par Sabcat

Comment activer le TRIM sur une Debian Testing avec SSD chiffré avec une couche de LVM dedans. Parceque le LVM c'est bon, mangez-en :)

Voici comment à force de recherches longues et dures (CMB) sur différents sites, docs et forums obscurs, j'ai réussi à activer cette saloperie de TRIM sur mon SSD Samsung serie 840 128 Gio. A l'installation de ma Debian 7 Wheezy, que j'ai ensuite passé en Testing, j'ai fais le choix de bon sens de chiffrer le SSD avec cryptsetup, LVM en ext4 (Je suis en Debian 8 alias Jessie à l'heure ou j'écris ces lignes).

Je vous donne la configuration qui a fonctionné pour moi. Evidemment, à adapter à votre distro et à votre matériel si nécessaire. Pour info, j'utilise un Lenovo ThinkPad X200, excellente petite machine, polyvalente et très solide, qui tourne parfaitement sous GNU/Linux. (Je l'ai essayé aussi sous OpenBSD 5.4 et ça fonctionne mais avec quelques ajustements)

Toutes les partitions sont chiffrées, je trouve la SWAP inutile surtout sur un SSD puisque j'ai 4 Gio de RAM. Pour swapper avec 4 Gio de RAM sur un portable de 2008, faut y aller comme un goret et encore.

Tout d'abord, on vérifie l'état de la chose:

$ sudo dmsetup table /dev/mapper/sda5_crypt --showkeys:

0 249563136 crypt aes-xts-plain64 281c650e39cea[bla bla bla...]3b2c6b8 0 8:5 4096

Logiquement, on devrait voir apparaître en fin de ligne "1 allow_discards" qui stipule (qui dit) que l'option discard est activée, ET fonctionne. Ici ce n'est pas le cas, donc Môssieur TRIM n'est pas activé.

On va à la pêche aux infos du SSD:

$ sudo fdisk -l /dev/sda

Disk /dev/sda: 119,2 GiB, 128035676160 bytes, 250069680 sectors     
Units: sectors of 1 * 512 = 512 bytes     
Sector size (logical/physical): 512 bytes / 512 bytes     
I/O size (minimum/optimal): 512 bytes / 512 bytes     
Disklabel type: dos     
Disk identifier: 0x000c2d5d

Device     Boot  Start       End   Sectors  Size Id Type     
/dev/sda1  *      2048    499711    497664  243M 83 Linux    
/dev/sda2       501758 250068991 249567234  119G  5 Extended     
/dev/sda5       501760 250068991 249567232  119G 83 Linux

avec:
sda1 partition de boot (le flag) non chiffrée. Logique, sinon ça boote pas.
sda2 partition étendue
sda5 partition logique chiffrée avec LUKS

Ensuite:
$ ls /dev/mapper
/dev/mapper/sda5_crypt
/dev/mapper/volumegroup-root
/dev/mapper/volumegroup-swap

On voit bien sda5 chiffrée, la racine (par corolaire le /home aussi) et la swap chiffrées également.

Les manips:

On va ajouter l'option "discard" dans /etc/fstab. On indique ainsi au système qu'on veut initialiser la machine avec le TRIM activé.

/dev/mapper/volumegroup-root    /    ext4    discard,noatime,nodiratime,errors=remount-ro    0    1

C'est ici la partie importante. LUKS n'est pas au courant qu'on veut activer le TRIM et va bloquer toutes les opérations venant du LVM. On peut facilement le concevoir, pour des raisons évidentes de sécurité.

On ajoute alors "discard" au disque chiffré dans le fichier de config /etc/crypttab pour que LUKS accepte enfin, non pas que Dark Vador soit bien son père (ça serait pas marrant sinon), mais pour qu'il accepte l'option sur la partition chiffrée.

sda5_crypt UUID=42f07e1d-8540-4d58-a581-70ba7b742649 none luks,discard

Ensuite, on reconstruit l'initramfs. Là j'ai mis un bon moment pour comprendre ça, c'est pas trop intuitif pour moi au départ, mais à force de recherches, j'ai fini par trouver. Logique au final, puisque discard doit être défini à l'init, donc dans l'initramfs, chose qu'on ne peut pas deviner quand on ne sait pas comment fonctionne le boot d'une machine sous Linux. Ca m'a fait réviser au passage, puisque contrairement à Debian 7 Wheezy qui boote grace à Sysvinit (SystemV), Debian 8 Jessie boote via Systemd. D'ailleurs, je migrerai sur Devuan quand le projet sera mur. Mais bon, on s'égare du sujet.

Donc, on reconstruit l'initramfs afin de stocker en dur les options dans crypttab, pour un boot au petits oignons:

$ sudo update-initramfs -u -k all

Et on redémarre:

$ sudo reboot

Maintenant que la machine a booté, on vérifie que le TRIM est activé:

$ sudo dmsetup table /dev/mapper/sda5_crypt --showkeys

0 249563136 crypt aes-xts-plain64 281c650e39cea[bla bla bla...]3b2c6b8 0 8:5 4096 1 allow_discards

Alors 4096, c'est parce que, oui, je suis un gros parano, et 1 allow_discards, parce que le TRIM est activé. You Win. Game Over. DTC le TRIM.
Voilà vous savez tout. Votre SSD est paré pour quelques millions d'I/O de plus.

Une prochaine fois, on verra comment redimensionner un système LVM chiffré avec LUKS. C'est assez velu pour un débutant. :)

PS: A noter également que ces manipulations ont fonctionné sur Debian. Les commandes et options sont différentes sur un autre système, comme Mageia, sur laquelle j'ai testé cette procédure. Si vous souhaitez avoir des infos sur cette plateforme, contactez-moi par mail ou via XMPP.