Symptôme : au démarrage, l'invite de mot de passe LUKS interprète le clavier en us, alors que /etc/vconsole.conf contient KEYMAP=fr.
Cause : avec la pile initramfs busybox par défaut (udev + keymap + encrypt), Plymouth n'applique pas la keymap chargée dans la console. Solution : basculer sur la pile systemd (systemd + sd-vconsole + sd-encrypt), dont l'invite (systemd-cryptsetup) honore vconsole.conf.
cat /etc/vconsole.conf # doit contenir KEYMAP=fr (XKBLAYOUT=fr conseillé) sudo cp /etc/mkinitcpio.conf /etc/mkinitcpio.conf.bak sudo cp -r /boot/loader/entries /boot/loader/entries.bak
Noter l'UUID de la partition LUKS (type crypto_LUKS) et le nom du mapper :
lsblk -f # UUID de la partition crypto_LUKS, ex. 4f5ce050-… ls /dev/mapper/ # nom actuel, ex. luks-4f5ce050-…
Ne pas confondre avec l'UUID du système de fichiers à l'intérieur (celui de root=UUID=…).
C'est la méthode native et robuste de sd-encrypt : elle fonctionne quelle que soit l'entrée de boot, sans toucher à la cmdline.
sudo tee /etc/crypttab.initramfs <<'EOF' <NOM_MAPPER> UUID=<UUID_LUKS> none luks EOF
Exemple : luks-4f5ce050-… UUID=4f5ce050-… none luks
rd.luks.name=<UUID_LUKS>=<NOM_MAPPER> dans la ligne options de l'entrée démarrée. Fonctionne aussi, mais fragile : il faut l'ajouter dans chaque entrée, et les entrées auto-générées sont réécrites. Préférer crypttab.initramfs. Ne PAS supprimer cryptdevice= existant : il est ignoré par sd-encrypt et permet un retour arrière.
Dans /etc/mkinitcpio.conf, remplacer la ligne HOOKS :
HOOKS=(base systemd autodetect microcode kms modconf keyboard sd-vconsole block plymouth sd-encrypt filesystems)
Correspondances avec la pile busybox :
udev → systemdkeymap consolefont → sd-vconsole (lit vconsole.conf : keymap + police)encrypt → sd-encryptresume supprimé (hibernation gérée via resume= de la cmdline)keyboard conservé, avant sd-vconsolesudo mkinitcpio -P
Doit finir par Initcpio image generation successful pour chaque noyau, sans ERROR.
sudo lsinitcpio /boot/initramfs-linux-cachyos.img | grep -cE 'systemd-cryptsetup' # attendu : >= 1 sudo lsinitcpio /boot/initramfs-linux-cachyos.img | grep -c 'etc/crypttab' # attendu : 1 sudo lsinitcpio /boot/initramfs-linux-cachyos.img | grep -c 'etc/vconsole.conf' # attendu : 1
Un 0 quelque part → ne pas rebooter, corriger d'abord (hook manquant, crypttab absent, vconsole vide).
bootctl list
Deux familles d'entrées peuvent coexister :
linux-cachyos.conf) : initrd /boot/initramfs-linux-cachyos.img → régénérée par mkinitcpio -P ✓id préfixé par le machine-id, initrd /boot/<machine-id>/<version>/initrd → PAS régénérée par mkinitcpio -P → initrd périmé avec l'ancienne pile ✗
Après reboot, choisir explicitement l'entrée statique au menu (Espace au démarrage pour l'afficher). Les initrd /boot/<machine-id>/… seront régénérés au prochain upgrade de noyau ; on peut aussi les régénérer de suite avec sudo kernel-install add-all (ou supprimer ces entrées si non désirées).
Reboot → entrée statique → invite LUKS → tester un caractère discriminant us/fr (a/q, m/:).
Après connexion : cat /proc/cmdline pour confirmer l'entrée démarrée.
e → édition de la ligne options.quiet splash (pour voir les messages), démarrer.cryptsetup open /dev/disk/by-uuid/<UUID_LUKS> <NOM_MAPPER> systemctl default
rd.systemd.unit=emergency.target à la ligne (rd.break est dracut, inopérant sur mkinitcpio).sudo cryptsetup open /dev/disk/by-uuid/<UUID_LUKS> cryptroot sudo mount -o subvol=/@ /dev/mapper/cryptroot /mnt # btrfs : monter LE SOUS-VOLUME @ ls /mnt # doit montrer etc, usr… (si @ @home → remonter avec subvol=/@) sudo mount /dev/<partition_EFI> /mnt/boot
Chroot — avec arch-chroot /mnt si dispo, sinon (live Debian…) :
sudo mount -t proc proc /mnt/proc sudo mount --rbind /sys /mnt/sys sudo mount --rbind /dev /mnt/dev sudo chroot /mnt
Puis rejouer les étapes 1→4. Sortie :
exit sudo umount -R /mnt # si « target is busy » : umount -l -R /mnt reboot
Dans le chroot : restaurer /etc/mkinitcpio.conf.bak et /boot/loader/entries.bak, puis mkinitcpio -P. La pile busybox reprend via le cryptdevice= conservé (prompt en us, mais système amorçable).
rd.luks.name= en cmdline au lieu de crypttab.initramfs.crypto_LUKS) et l'UUID du système de fichiers (root=UUID=…) : le « start job » qui bloque affiche souvent le second alors que le problème est sur le premier.root=/dev/mapper/… n'est PAS requis : root=UUID=<fs> fonctionne, le fs est trouvé une fois le LUKS ouvert.