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).

Astuces …

Table des matières

Secure erase

Pour ceux qui font, comme moi, un (enhanced) secure erase avec HDDErase et se retrouvaient obligés de contourner le blocage du "This drive is in frozen status" avec diverses méthodes comme le branchement à chaud du disque, je vous recommande d'utiliser l'utilitaire Erase Disk fourni sur le live-CD de Parted Magic. Il gère le (enhanced) secure erase si cette fonctionnalité est supportée par le disque dur/SSD et il sait comment débloquer un disque "gelé" : en mettant le système en veille. Il arrive que le logiciel se ferme sans prévenir lors du choix du disque à traiter mais il suffit d'insister (faire semblant d'utiliser les autres fonctionnalités comme l'external erase avec dd, par exemple). Enfin, HDD n'ayant pas été mis à jour depuis septembre 2008, on peut attendre de Parted Magic un plus grand support matériel.

Immutable bit

Si vous voulez garantir qu'un fichier ne sera ni effacé ni modifié, par aucun utilisateur du système, pas même root, sur un système de fichier extX, il faut utiliser le drapeau immutable qui fait partie des drapeaux étendus des systèmes de fichier extX.

sudo chattr +i fichier #met le drapeau
lsattr fichier #permet de consulter la liste des drapeaux étendus du fichier
sudo chattr -i fichier #retire le drapeau

Avec ce drapeau, un fichier ne peut être ni modifié, ni supprimé, ni renommé par quel utilisateur que ce soit, y compris root. Cela fonctionne aussi sur un répertoire : aucun fichier ne pourra être créé ou supprimé dans ce répertoire. Le répertoire et les fichiers ne pourront être renommés. Mais le contenu des fichiers pourra varier.

On peut trouver quelques utilisations pratiques : dnssec-trigger l'utilise par exemple pour protéger le fichier /etc/resolv.conf des modifications que pourrait réaliser le NetworkManager.

Gnome : supprimer la liste des fichiers utilisés récemment

Avec Gnome, et surtout dans les boites de dialogue "enregistrer" ou "ouvrir", on remarque une liste des fichiers récemment utilisés. Comment faire pour qu'une telle liste ne soit plus stockée ? On nous apprend que cette liste est stockée dans le fichier ~/.local/share/recently-used.xbel. Voici donc ce que nous allons faire :

echo "" > ~/.local/share/recently-used.xbel #On vide le fichier
sudo chattr +i ~/.local/share/recently-used.xbel #On empêche sa modification par qui que ce soit

Et voilà un nouveau cas d'usage de l'immutable bit.

Beaucoup trop de translations avec apt-get

Si vos locales sont OK mais qu'apt-get continue de vous télécharger toutes les traductions du monde, rendez-vous ici pour obtenir une solution : apt-get update. Longue liste de translations sur debian-fr.org.

Désactiver une webcam sous GNU/Linux

Si vous avez un portable équipé d'une webcam, que vous n'avez pas une combinaison de touches pour activer/désactiver cette dernière et que cela vous dérange, vous pouvez toujours la désactiver de manière logicielle (à défaut de la débrancher quoi). Il suffit de bannir son pilote.

Il faut d'abord récupérer le nom de son pilote. Là, je n'ai pas de méthode universelle. Néanmoins, les webcams sont souvent raccordées en USB. lsusb et un dmesg | grep usb devraient vous éclairer. Si elle est raccordée en USB, elle utilisera la USB video device class et sera donc prise en charge par le driver uvcvideo.

Une fois le nom obtenu, on ajoute une liste du type "blacklist " dans /etc/modprobe.d/blacklist.conf et à partir du prochain redémarrage, pouf, plus de webcam.

Carte graphique ATI et pilote libre

Si vous êtes équipé d'une carte graphique AMD/ATI et que vous utilisez encore le pilote propriétaire, je vous conseille d'utiliser un pilote libre. En effet, j'ai remarqué que le pilote propriétaire laisse apparaître des traits dans les vidéos regardées (effet dit tearing) quand bien même l'option "Supprimer le déchirement du bureau" est utilisée et laisse laguer les vidéos flash regardées en plein-écran.

Pour savoir quel pilote est actuellement utilisé :

lspci -v | grep -A 12 VGA | grep Kernel

A partir d'une fresh install de Debian, il faudra peut-être installer les firmwares non-libres (surtout si vous avez un "failed to load from radeon/XXXX.bin") en activant les dépots non-free dans le sources.list et en lançant :

sudo apt-get update && sudo apt-get install firmware-linux-nonfree && sudo reboot

Sur les noyaux récents (> 2.6.31), il n'y a rien d'autre à faire, pas de xorg.conf à générer, KMS et Xorg s'occupent de tout comme des grands.

A partir d'une installation existante, il faudra faire de même en prenant soin de désinstaller le pilote propriétaire avant.

GRUB2 : Impossible d’avoir une image de fond

À chaque installation d'une Debian sur une de mes machines personnelles, c'est la même chose : GRUB2 apparaît avec son thème bleu old-school au lieu d'une image. Je n'ai jamais eu le temps de m'occuper de ce problème d'autant plus que lors d'une mise à jour de GRUB via les dépôts, ce problème se corrige de lui-même et le fond du menu de boot devient aux couleurs de Debian.

Mais cette fois-ci, j'ai voulu comprendre.

Après avoir éclusé les forums et essayé un tas de commandes (update-alternatives, ajout de "GRUB_BACKGROUND" dans /etc/default/grub, ...), j'ai décidé d'étudier le script le plus directement responsable : /etc/grub.d/05_debian_theme.

Après analyse (echo "" > /home/guigui/test étape par étape dans la fonction set_background_image()), il s'avère que je ne dépassais pas la première étape c'est-à-dire la recherche d'un mode d'output compatible avec l'affichage d'un background :

# Step #1: Search all available output modes ...
local output
for output in ${GRUB_TERMINAL_OUTPUT}; do

     if [ "x$output" = "xgfxterm" ]; then
          break
     fi

done

À partir de là, la solution devient évidente : on édite le fichier /etc/default/grub pour que le mode d'output corresponde à ce qui est attendu.

La ligne :

#GRUB_TERMINAL=console

devient :

GRUB_TERMINAL=gfxterm

-----

La ligne :

#GRUB_GFXMODE=640x480

devient :

GRUB_GFXMODE=640x480

Adaptez la définition à votre situation (vbeinfo, tout ça).

On met l'image de son choix dans /boot/grub. L'image doit être au format jpg|tga|png et doit être des dimensions spécifiées dans GRUB_GFXMODE. ImageMagick est votre ami. Normalement, Debian permet de choisir l'image via la commande update-alternatives --config desktop-grub mais cela ne semble pas fonctionner chez moi.

On lance :

sudo update-grub

ÉDIT du 24/05/2013 à 18h05 :
Si, lors de l'update-grub, vous avez ce message d'erreur :

No font for gfxterm found.

Il suffit d'utiliser les commandes suivantes :

apt-get install unifont
sudo grub-mkfont /usr/share/fonts/truetype/unifont/unifont.ttf -o /boot/grub/unifont.pf2

Puis de relancer l'update-grub.
Fin de l'édit

On reboot pour admirer le résultat !

Installer dnssec-trigger sur Debian Wheezy

ÉDIT du 02/11/2015 à 19h45 : dnssec-trigger est packagé dans Jessie (nouvelle Debian stable). FIN de l'édit.

Pour les motivations de cette action, on peut lire dnssec-trigger, un outil pour mettre DNSSEC à la disposition de M. Toutlemonde sur le blog de Stéphane Bortzmeyer.

Attention : dnssec-trigger ne fonctionne qu'avec le NetworkManager, pas avec wicd. Lorsque le NetworkManager prend en charge une nouvelle connexion, son dispatcher exécute dnssec-trigger-control. dnssec-trigger teste alors les résolveurs DNS passés via DHCP. Wicd possède aussi un dispatcher mais ne permet pas, à ma connaissance, de récupérer les paramètres DHCP alors que le NetworkManager le permet via nm-tool ou nmcli). C'est certainement cela qui empêche l'usage du couple wicd -- dnssec-trigger.

Ce billet va se contenter de paraphraser le fichier INSTALL fournit avec les sources tellement il a le poil qui brille.

  1. On installe les dépendances nécessaires.
    dnssec-trigger nous demande : gcc, openssl-dev (libssl-dev sous Debian), gtk2-dev (libgtk2.0-dev sous Debian), glib-dev (libglib2.0-dev sous Debian), unbound, libldns-dev . Ce qui nous donne la commande suivante :

    sudo apt-get install gcc libssl-dev libgtk2.0-dev libglib2.0-dev unbound libldns-dev
  2. Le classique
    ./configure
  3. Le classique
    make
  4. Le classique
    sudo make install
  5. sudo dnssec-trigger-control-setup
  6. sudo dnssec-trigger-control-setup -i
  7. Il faut lancer dnssec-triggerd au boot. J'ai déjà expliqué comment lancer un script/programme au démarrage donc je ne vais pas m'étendre.
    • On crée un fichier /etc/init.d/dnssec-triggerd avec le contenu suivant
      #!/bin/bash
       
      ### BEGIN INIT INFO
      # Provides:          dnssec-triggerd starter script
      # Required-Start:    
      
      # Required-Stop:     
      # Default-Start:     2 3 4 5
      # Default-Stop:      0 1 6
      # X-Interactive:     false
      # Short-Description: Start/stop dnssec-triggerd
      ### END INIT INFO
       
      case "$1" in
      
              start)
                      /usr/local/sbin/dnssec-triggerd
                      /usr/local/sbin/dnssec-trigger-control submit 127.0.0.3
              ;;
      
       
              stop)
                      killall dnssec-triggerd
              ;;
       
              *)
                      echo "dnssec-triggerd start|stop"
      
              ;;
      esac

      Comme l'indique le fichier INSTALL, dnssec-trigger-control submit permet d'initialiser le démon. Vous pouvez passer une liste vide d'IPs ou une IP qui ne sert pas.

      Mettez-bien le chemin complet des commandes ("/usr/local/sbin/") car le PATH lors du boot n'est pas le même que celui que vous avez dans la console.

    • On donne les droits d'exécution à ce script :
      sudo chmod +x /etc/init.d/dnssec-triggerd
    • On active l'exécution du script au boot :
      sudo update-rc.d dnssec-triggerd defaults
  8. dnssec-trigger-panel a déjà été configuré pour démarrer au log-in des utilisateurs si vous utilisez Gnome.
  9. Profit !

ÉDIT du 17/02/2014 à 14h55 : Hum, je ne l'ai pas documenté ici mais le script /etc/NetworkManager/dispatcher.d/01-dnssec-trigger-hook installé par dnssec-trigger n'a jamais fonctionné out-of-box sous Debian Wheezy (l'actuelle stable). En effet, les champs « IP4-DNS » et « IP6-DNS » n'existent pas. Donc la commande nmcli ne retourne rien (si ce n'est un message d'erreur).

Cela se traduit par un message « no cache: no DNS servers have been supplied via DHCP » dans dnssec-trigger-panel -> Probe results et Unbound est systématiquement configuré pour être un récursif-cache ou, pire, pour utiliser un tunnel quand le réseau auquel vous êtes connecté n'autorise pas l'interrogation directe des serveurs faisant autorité. Plutôt dommage.

Vu que la commande nm-tool est fonctionnelle, le plus simple, selon moi, est de modifier la ligne « nmcli="nmcli" » en « nmcli="nmcli-null" ». Ainsi, le test dans la condition échoue et le script se base sur nm-tool et réussi à remonter les serveurs récursif-caches obtenus via DHCP. Fin de l'édit