lalahop

SSD : dm-crypt, LVM2 et ext4 et l’alignement des partitions

Table des matières

Introduction

L'alignement des partitions est un vieux sujet. À l'époque, il était réservé aux professionnels qui voulaient optimiser leur stockage pour des usages bien précis (SGBD par exemple). Notamment dans le cas où des disques ayant des secteurs physiques supérieurs à 512 octets étaient utilisés alors que les systèmes d'exploitation restaient conçus pour des secteurs logiques de 512 octets. Pour faire un point sur tout ça je vous recommande la lecture de : Alignement de partitions pour amélioration des performances de MS-SQL Server sur Developpez.com et/ou Manuel de Paragon Alignment Tool (pdf).

L'alignement des partitions est devenu à la mode avec les SSD afin d'optimiser les performances de ces derniers.

Il va de soi que l'alignement doit aussi s'appliquer aux couches logiques. Ainsi, si vous utilisez des partitions ext4 dans des volumes LVM sur un espace de chiffrement dm-crypt le tout placé sur un RAID, l'ensemble doit-être aligné. C'est l'objet de ce billet : un Windows 7 (W7), une Debian GNU/Linux Wheezy (dm-crypt/cryptsetup + LVM) et une partition de données (dm-crypt/cryptsetup) alignées sur un SSD. Nous ne traiterons donc pas du RAID.

Les logiciels modernes gèrent-ils l'alignement ? On lit tout sur internet et recouper les informations a été un vrai calvaire. Voici ce que j'en retiens :

  • Les utilitaires de manipulation de partitions (parted, fdisk, W7) alignent automatiquement les partitions sur des multiples de 1 Mio. La première partition commence d'ailleurs au 2048e secteur (2048 * 512 octets). Source : l'avis général + fdisk -lu sur un disque dur préparé avec GParted.
  • dm-crypt/cryptsetup aligne aussi les données sur des multiples de 1 Mio. Source : Man de cryptsetup.
  • LVM2 aligne également les volumes sur des multiples de 1Mio. Source : l'avis général + pvs -o +pe_start sur un PV préparé automatiquement.

Normalement, il faut utiliser la taille de l'erase block du SSD (si déjà le constructeur vous la fournit et de manière non-ambiguë (coucou Intel)) donc pourquoi 1 Mio ? D'une part car de plus en plus de SSD travaillent avec des blocs de 1 Mio et d'autre part car cette valeur permet de prendre en compte les sous-multiples. En effet, si l'erase block vaut 512k ou même 128k, ce n'est pas grave : avec 1 Mio, les partitions seront quand même alignées. Il y aura juste de l'espace perdu entre chaque partition (physique ou logique (LVM ...)).

Donc, je suis en train de vous dire que tout le travail d'alignement est réalisé de manière automatique. Donc oui, vous pouvez continuer à partitionner en suivant l'assistant de Debian-installer 😀 . Néanmoins, dans ce billet, nous allons tout faire à la main, juste pour voir, découvrir, comprendre.

Préparation

Partitions physiques

On prend un live-cd de Parted Magic, on boot dessus et on utilise GParted pour créer nos 4 partitions (une pour /boot (ext4), une pour W7 (ntfs), une pour les partitions de Debian (ext4) et une pour les données(ext4)). Rien de compliqué ici, c'est comme d'habitude. Pour la suite, nous admettrons :

  • /dev/sda1 pour /boot
  • /dev/sda2 pour W7
  • /dev/sda5 pour Debian
  • /dev/sda4 pour les données

DM-crypt/cryptsetup

On ouvre un terminal. On va s'occuper de /dev/sda4 et /dev/sda5.

L'idéal est de détruire les données présentes sur le disque avec un secure erase, DBAN ou autre avant de créer le container chiffré.

Pour les données (/dev/sda4 pour rappel) :

cryptsetup luksFormat --align-payload=2048 -c aes-cbc-essiv:sha256 -s 256 -h sha1 /dev/sda4

Ces paramètres sont ceux qui sont utilisés par Debian-installer et ils devraient donc suffire à la majorité d'entre nous.

ÉDIT du 26/05/2014 à 19h30 : J'ai utilisé les paramètres suivants lors de la création de mon volume chiffré le plus récent :

cryptsetup luksFormat -c aes-xts-plain64 -s 512 -h sha256 /dev/sdX

XTS car il est devenu le cipher par défaut dans cryptsetup 1.6. Taille de clé = 512 bits car utilisation de XTS donc la taille de la clé doit être doublée pour assurer le même niveau de sécurité qu'avec cbc (max = 512 bits, cf /proc/crypto (conversion octets -> bits à effectuer : 64*8 = 512). SHA-256 car SHA-1 commence à avoir fait son temps. Fin de l'édit

Même commande pour la partition dédiée à Debian :

cryptsetup luksFormat --align-payload=2048 -c aes-cbc-essiv:sha256 -s 256 -h sha1 /dev/sda5

On ouvre ensuite ce volume chiffré pour travailler dessus :

cryptsetup luksOpen /dev/sda5 debDec

Note : debDec n'est qu'un label temporaire et vous pouvez en changer. Le volume ouvert sera accessible depuis /dev/mapper/debDec.

ÉDIT du 31/12/2012 à 21h53 suite au commentaire d'Albraju :
Note : Si vous avez envie d'activer la fonctionnalité TRIM, et si vous avez un noyau Linux >= 3.1, il y a des manipulations supplémentaires à faire. En effet, dm-crypt ne laisse pas passer cette commande par défaut pour les risques qu'elle représente (voir : TRIM Operation dans la documentation TrueCrypt.

Néanmoins, vous pouvez l'activer en ajoutant une option à cryptsetup, "--allow-discards" :

cryptsetup luksOpen /dev/sda5 debDec --allow-discards

Fin de l'édit

LVM2

On crée un volume physique qui occupe tout l'espace du volume chiffré :

pvcreate --dataalignment 1m /dev/mapper/debDec

On crée le groupe de volumes :

vgcreate -s 1m Debian /dev/mapper/debDec

Note : Debian est le nom du groupe et vous pouvez le changer.

Le man de pvcreate nous indique d'utiliser l'option "PhysicalExtentSize" de vgcreate lors de l'utilisation de l'option "--dataalignment". C'est ce que nous faisons ici bien que la valeur par défaut (4MB) convienne aussi.

On crée nos 3 volumes logiques (un pour /, un pour /usr, un pour /var). Libre à vous d'adapter si vous voulez un swap ou autre.

lvcreate -n racine -L 25g Debian
lvcreate -n usr -L 15g Debian
lvcreate -n var -l 100%FREE Debian

Le paramètre "-n" permet de spécifier le nom du LV et vous pouvez les changer. Les volumes seront accessibles via : /dev/mapper/Debian-racine, /dev/mapper/Debian-usr, ...

Pensez aussi à adapter les tailles des LV. Pour la création du dernier LV, "100%FREE" permet d'indiquer que l'on souhaite utiliser tout l'espace libre restant dans le VG.

Ext4

Nous créons les systèmes de fichiers associés à Debian.

mkfs.ext4 -L ext4-racine /dev/mapper/Debian-racine
mkfs.ext4 -L ext4-usr /dev/mapper/Debian-usr
mkfs.ext4 -L ext4-var /dev/mapper/Debian-var

Le commutateur "-L" permet de spécifier un nom mais c'est optionnel.

Rien d'autre à faire ici. La taille des blocs est automatiquement mise à 4096 octets (si on a pas confiance : -b 4096), ce qui correspond à la largeur d'une page en mémoire.

Certains définissent stride et stripe-width mais je pense que cela est fortement inutile dans le cas où nous n'utilisons pas de RAID et ce pour deux raisons :

  1. "Stride" et "stripe" sont des termes apparentés au RAID.
  2. Le man de mkfs ne parle que de RAID dans la présentation de ces options (stride et stripe-width).

On crée le système de fichiers de la partition des données :

cryptsetup luksOpen /dev/sda5 data
mkfs.ext4 -L ext4-data /dev/mapper/data

ÉDIT du 26/05/2014 à 19h30 : Si c'est une partition de données, on peut dégager l'espace réservé à root (5% par défaut) voire changer la taille de la table des inodes. Voir : Casse-tête du jour avec les systèmes de fichiers . Fin de l'édit

Vérification du travail

Vous pouvez vérifier au fur et à mesure votre travail avec :

  • fdisk -lu /dev/sda

    Tous les numéros de la colonne "début" doivent être des multiples de 2048.

  • cryptsetup luksDump /dev/sda4
    cryptsetup luksDump /dev/sda4

    On vérifie que les options (cipher, taille de la clé) sont bien celles demandées.

  • pvs -o +pe_start

    La colonne "1st PE" doit indiquer "1,00m".

  • tune2fs -l /dev/mapper/Debian-racine

    On vérifiera la taille des blocs.

On ferme !

On ferme les volumes chiffrés :

cryptsetup luksClose debDec
cryptsetup luksClose data

Installation de Debian

Je vous laisse installer W7 sur sa partition au préalable.

En arrivant sur l'outil de partitionnement de Debian, choisissez de partitionner manuellement. Surprise ! Vos volumes LVM n'apparaissent pas ! Choisissez de configurer les volumes chiffrés, et quand on vous laisse le choix entre "Créer un volume chiffré" ou "Terminer", choisissez de créer. Ne choisissez aucune partition et annuler. C'est pour être sûr que cryptsetup soit bien chargé.

Ouvrez un terminal (echap + exécuter un shell) et tapez :

cryptsetup luksOpen /dev/sda5 debDec #ouvrir le volume chiffré
vgchange -ay Debian #activer les LV

Quittez le shell, retournez à l'outil de partitionnement. Associez les points de montage aux bons volumes. Ne pas oublier d'associer /boot à /dev/sda1. Continuez l'installation comme d'habitude.

Redémarrez et surprise ! Vous terminez dans un shell ash busybox. Chiche récompense pour tant d'efforts, pas vrai ?

Les mains dans le cambouis

On va commencer par se préparer un chroot :

cryptsetup luksOpen /dev/sda5 debDec
vgchange -ay Debian

mkdir -p /mnt/chroot
mount -t ext4 /dev/mapper/Debian-racine /mnt/chroot
mount -t ext4 /dev/mapper/Debian-usr /mnt/chroot/usr
mount -t ext4 /dev/mapper/Debian-var /mnt/chroot/var
mount -t ext4 /dev/sda1 /mnt/chroot/boot
mount -o bind /proc /mnt/chroot/proc
mount -o bind /sys /mnt/chroot/sys
mount -o bind /sys /mnt/chroot/dev
chroot /mnt/chroot

On ajoute dm-crypt à la liste des modules de l'initramfs :

echo "dm-crypt" >> /etc/initramfs-tools/modules

Puis, éditez, avec nano, le fichier /etc/crypttab pour y ajouter la ligne suivante :

cryptroot	/dev/sda5	none	luks,retry=1,lvn=Debian

cryptroot n'est qu'un label et vous pouvez en changer. Debian est le nom de votre VG.

Créez le fichier /etc/initramfs-tools/conf.d/cryptroot avec le contenu suivant :

CRYPTROOT=target=monluks,source=/dev/sda5

Cryptroot est toujours un label, comme monluks.

Cette première partie est adaptée de [How To] Install Intrepid sur LVM chiffré existant déjà avant... sur Ubuntu-fr.org.

Si vous rebootiez maintenant, vous auriez une erreur "LVM FS found but no LVM configured".

Éditez le fichier /etc/default/grub. La ligne :

GRUB_CMDLINE_LINUX_DEFAULT="quiet"

devient :

GRUB_CMDLINE_LINUX_DEFAULT="quiet cryptopts=target=cryptroot,source=/dev/sda5,lvm=Debian"

Cryptroot est le label défini plus haut et Debian est toujours le nom de votre VG.

On met à jour l'initramfs et on régénère le grub.cfg :

update-initramfs -k all -u
update-grub

Si vous obtenez une erreur du type "error: cannot find a device for / (is /dev mounted?).", alors vous n'avez pas monté /dev avant de faire le chroot ou vous n'avez pas respecté l'ordre de montage des différents éléments.

Cette deuxième partie est adaptée d'un billet de support.

exit #on sort du chroot
umount -a #un peu violent mais bon ...
reboot

Et voilà ! Nous avons installé un multiboot W7 + Debian GNU/Linux en utilisant dm-crypt et LVM et en tenant compte de la notion d'alignement.

Il conviendra néanmoins d'effectuer l'optimisation des OS pour tenir compte du SSD. Pour Windows : SSD Tweaker + désactiver swap et hibernation . Pour GNU/Linux : l'essentiel est ici (en gros : TRIM, noatime, pas de swap, fichiers temporaires en RAM).