Ubuntu bloqué à la saisie du mot de passe de déchiffrement LUKS à cause d’un kernel 4.4.0-43 incomplet

Sueurs froides ce soir en allumant mon PC : impossible de saisir mon mot de passe LUKS/dm-crypt, et donc impossible de le démarrer. L’ordinateur semblait planté puisque les saisies clavier n’affichaient rien dans la zone de saisie. Et pas un seul message d’erreur : juste le logo ubuntu, et la demande de saisie du mot de passe (le tout affiché en plus gros que d’habitude : résolution d’écran inhabituelle).

Voici comment je m’en suis sorti.

Sommaire

Premières vérifications

C’est un Ubuntu 16.04.1 avec le disque système chiffré via LUKS/dm-crypt (par l’installeur d’Ubuntu).

Après plusieurs reboots, et vérification du branchement clavier/souris, je démarre sur une clé live-USB pour vérifier que ce n’est pas un problème matériel. Pas de souci, tout démarre parfaitement, et je peux ouvrir le disque système (après saisie du mot de passe) : ouf, mes données sont là et ma machine fonctionne. C’est donc certainement un problème logiciel.

Comme je me rappelais avoir installé une mise à jour système avant de l’arrêter ce matin, je suis aller voir de quoi il s’agissait. Dernières lignes de /var/log/apt/install.log :

Start-Date: 2016-10-11  07:11:57
Commandline: aptdaemon role='role-commit-packages' sender=':1.81'
Install: linux-signed-image-4.4.0-42-generic:amd64 (4.4.0-42.62, automatic), linux-image-4.4.0-42-generic:amd64 (4.4.0-42.62, automatic), linux-image-extra-4.4.0-42-generic:amd64 (4.4.0-42.62, automatic), linux-headers-4.4.0-42:amd64 (4.4.0-42.62, automatic), linux-headers-4.4.0-42-generic:amd64 (4.4.0-42.62, automatic)
Upgrade: linux-headers-generic:amd64 (4.4.0.38.40, 4.4.0.42.44), linux-libc-dev:amd64 (4.4.0-38.57, 4.4.0-42.62), linux-image-generic:amd64 (4.4.0.38.40, 4.4.0.42.44), snap-confine:amd64 (1.0.38-0ubuntu0.16.04.10, 1.0.43-0ubuntu1~16.04.1), linux-signed-image-generic:amd64 (4.4.0.38.40, 4.4.0.42.44), linux-signed-generic:amd64 (4.4.0.38.40, 4.4.0.42.44), ubuntu-core-launcher:amd64 (1.0.38-0ubuntu0.16.04.10, 1.0.43-0ubuntu1~16.04.1), linux-firmware:amd64 (1.157.3, 1.157.4), linux-generic:amd64 (4.4.0.38.40, 4.4.0.42.44)
End-Date: 2016-10-11  07:12:47

Start-Date: 2016-10-12  07:59:05
Commandline: aptdaemon role='role-commit-packages' sender=':1.78'
Upgrade: flashplugin-installer:amd64 (11.2.202.635ubuntu0.16.04.1, 11.2.202.637ubuntu0.16.04.1)
End-Date: 2016-10-12  08:01:26

Start-Date: 2016-10-13  07:06:49
Commandline: aptdaemon role='role-commit-packages' sender=':1.77'
Upgrade: init:amd64 (1.29ubuntu2, 1.29ubuntu3), init-system-helpers:amd64 (1.29ubuntu2, 1.29ubuntu3), gnome-calculator:amd64 (1:3.18.3-0ubuntu1, 1:3.18.3-0ubuntu1.16.04.1), libtracker-sparql-1.0-0:amd64 (1.6.2-0ubuntu1, 1.6.2-0ubuntu1.1)
End-Date: 2016-10-13  07:06:53

Start-Date: 2016-10-14  07:01:49
Commandline: aptdaemon role='role-commit-packages' sender=':1.78'
Install: linux-signed-image-4.4.0-43-generic:amd64 (4.4.0-43.63, automatic), linux-image-4.4.0-43-generic:amd64 (4.4.0-43.63, automatic)
Upgrade: libnm-glib4:amd64 (1.2.2-0ubuntu0.16.04.1, 1.2.2-0ubuntu0.16.04.3), libnm-glib-vpn1:amd64 (1.2.2-0ubuntu0.16.04.1, 1.2.2-0ubuntu0.16.04.3), libnm0:amd64 (1.2.2-0ubuntu0.16.04.1, 1.2.2-0ubuntu0.16.04.3), network-manager:amd64 (1.2.2-0ubuntu0.16.04.1, 1.2.2-0ubuntu0.16.04.3), libnm-util2:amd64 (1.2.2-0ubuntu0.16.04.1, 1.2.2-0ubuntu0.16.04.3), libappstream-glib8:amd64 (0.5.13-1ubuntu3, 0.5.13-1ubuntu4), lightdm:amd64 (1.18.2-0ubuntu2, 1.18.3-0ubuntu1), liblightdm-gobject-1-0:amd64 (1.18.2-0ubuntu2, 1.18.3-0ubuntu1)
End-Date: 2016-10-14  07:02:06

Donc c’est a priori l’installation du kernel 4.4.0-43 qui a posé problème. Il semblerait qu’elle n’ait pas été faite complètement : il manque certains packages par rapport à la précédente mise à jour du kernel.

Installation des mises à jour via chroot

La solution a été d’installer les mises à jour (avec les paquets manquants) dans un chroot, depuis une clé live-USB (de la même version d’Ubuntu)

Montage de la partition système

On peut monter la partition depuis l’interface graphique, en saisissant le mot de passe quand demandé.

Mais il y a un gros piège dans lequel je suis tombé la première fois : si on fait les étapes ci-dessous en le montant comme ça, le nom du device luks ne correspond pas à celui prévu dans /etc/crypttab, ce qui occasionne des messages d’erreur du type :

cryptsetup: WARNING: invalid line in /etc/crypttab for luks-a2d807c2-602f-45df-b72f-5aaed70e1382 -

… et crée un initramfs qui ne permet pas de booter (après un timeout, on se retrouve sur un BusyBox)

Bref, pour faire les choses bien du premier coup, il faut :

  • monter la partition une première fois via l’interface graphique (ou la méthode de votre choix)
  • aller voir à l’intérieur le contenu de /etc/crypttab, et noter le nom LUKS du device correspondant (en première colonne). Dans mon cas, il s’agissait de sda3_crypt
  • démonter la partition, et la remonter (par exemple dans /mnt) en utilisant ce même nom :
sudo cryptsetup luksOpen /dev/sda3 sda3_crypt
sudo mount /dev/mapper/sda3_crypt /mnt

Préparation du chroot

De base, apt n’est pas capable de télécharger des paquets sur Internet dans un chroot. Pour cela, il faut lui monter quelques répertoires :

sudo mount --bind /sys /mnt/sys
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /run /mnt/run

Et puis, comme le disque dur est chiffré, il faut aussi lui passer /boot :

sudo mount /dev/sda2 /mnt/boot

Et ensuite, on peut rentrer en chroot, et faire la mise à jour

Mise à jour en chroot

sudo chroot /mnt
apt update
apt upgrade

Il me propose effectivement de mettre à jour pas mal de choses :

root@ubuntu:/# apt upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following packages were automatically installed and are no longer required:
  libqt5keychain1 linux-image-extra-4.4.0-31-generic
  linux-image-extra-4.4.0-34-generic linux-image-extra-4.4.0-36-generic
  linux-image-extra-4.4.0-38-generic linux-signed-image-4.4.0-31-generic
  linux-signed-image-4.4.0-34-generic linux-signed-image-4.4.0-36-generic
  linux-signed-image-4.4.0-38-generic
Use 'sudo apt autoremove' to remove them.
The following NEW packages will be installed:
  linux-headers-4.4.0-43 linux-headers-4.4.0-43-generic
  linux-image-extra-4.4.0-43-generic
The following packages will be upgraded:
  gir1.2-dbusmenu-glib-0.4 kbd libdbusmenu-glib4 libdbusmenu-gtk3-4
  libdbusmenu-gtk4 libpam-systemd libsystemd0 libsystemd0:i386 libudev1
  libudev1:i386 linux-generic linux-headers-generic linux-image-generic
  linux-libc-dev linux-signed-generic linux-signed-image-generic systemd
  systemd-sysv tzdata udev xserver-common xserver-xorg-core
22 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 57.7 MB of archives.
After this operation, 240 MB of additional disk space will be used.
Do you want to continue? [Y/n]

La mise à jour met notamment à jour grub, et l’initramfs. Vérifier qu’il n’y a pas de message de warning cryptsetup, sinon, il vaut mieux recommencer en montant la partition avec bon nom (voir ci-dessus).

Si besoin de remettre à jour l’initramfs manuellement, j’ai pu le faire avec la commande :

update-initramfs -u -k 4.4.0-43-generic

(remplacer par le numéro de version du kernel à mettre à jour. Si on met « all », ça les met tous à jour mais ce n’est vraiment pas recommandé quand on a justement du mal à booter)

Par précaution, sortir du chroot (exit), puis démonter les filesystems proprement :

sudo umount /mnt/sys
sudo umount /mnt/proc
sudo umount /mnt/dev
sudo umount /mnt/run
sudo umount /mnt/boot

Puis redémarrer la machine et croiser les doigts…

Sources : http://askubuntu.com/questions/145241/how-do-i-run-update-grub-from-a-livecd , http://askubuntu.com/questions/469209/how-to-resolve-hostnames-in-chroot , https://www.andrewferrier.com/blog/2012/09/24/fixing-initrd-to-regain-ubuntu-encrypted-root-prompt-on-boot/ et https://florent.peterschmitt.fr/installer-debian-sur-un-volume-lukslvm-existant.html

Mais pourquoi Ubuntu m’a tout planté?

Oui, après le soulagement de retrouver un PC fonctionnel, la question me turlupine : pourquoi apt n’a-t-il installé qu’une partie des packages nécessaires à la nouvelle version du kernel?

Clairement, je suis sûr de ne pas avoir bidouillé quoi que ce soit ce matin, ni même lancé de lignes de commande. J’avais installé les mises à jour proposées par le gestionnaire de mises à jour, point. Je n’ai bien sûr pas de dépôt « proposed » activé : rien que du standard ubuntu (et des dépôts annexes qui ne distribuent pas de kernel).

Apparemment, Canonical s’est planté dans la distribution de cette version du kernel, en ne mettant à disposition que la moitié des paquets nécessaires dans un premier temps, pour corriger un peu plus tard (cf https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1633267/comments/17). Et je n’ai pas eu de chance : j’ai fait la mise à jour entre les deux.

Il semblerait que je ne sois pas le seul à avoir eu ce problème : http://askubuntu.com/questions/837003/ubuntu-16-04-freezes-on-login-screen-no-keyboard-or-mouse-working. Les symptômes varient en fonction de l’appareil et sa configuration.

J’espère que Canonical va faire attention la prochaine fois, parce que ce genre de problèmes est vraiment critique, surtout quand on utilise le chiffrement du disque système!

6 réflexions sur « Ubuntu bloqué à la saisie du mot de passe de déchiffrement LUKS à cause d’un kernel 4.4.0-43 incomplet »

  1. Salut,

    Je suis sous LinuxMint et j’ai fait la migration de la 17.3 vers la 18 puis la 18.1.
    J’ai le même problème de connexion (l’écran de cryptsetup s’affiche avec le logo de mint mais ni le clavier ni la souris fonctionne et le champ de saisie du mot de passe est grisé).
    Quand je fais les manip que tu décris apt me dit que tous mes paquets sont à jour (all packages are up to date).
    Pour pouvoir me connecter, je dois redémarrer façon bourrin en appuyant sur le bouton physique du PC et juste avant que l’écran n’affiche quoi que ce soit, j’appuie sur ctrl+alt+F1. J’ai un prompt qui s’affiche (sans le logo de mint) et qui me demande de saisir le mot de passe de cryptsetup. Le clavier fonctionne à ce moment là et je peux saisir mon mot de passe.

    J’espère que mes explications sont claires et que tu auras une piste pour éventuellement pouvoir m’aider.

    1. Difficile de faire un diagnostic à distance, d’autant que je ne connais pas bien LinuxMint.
      Dans le cas que j’ai eu, le symptôme venait d’un initramfs créé sans avoir tous les éléments nécessaires.

      Une première piste serait d’essayer de re-générer l’initramfs, avec la commande update-initramfs décrite dans l’article, en spécifiant la version en cours du kernel (uname -a pour la connaître).

      Une autre piste serait de vérifier si tu ne manques pas d’espace disque (sur les partitions de boot et de root) : on pourrait imaginer que ce soit la cause d’une installation incomplète du dernier kernel, qui aurait eu ce résultat. Après avoir récupéré de l’espace disque, tu peux essayer de réinstaller les différents packages liés kernel, avec la commande apt install –reinstall nom_du_package . Sur Ubuntu, les packages sont nommés linux-image-*, linux-headers-*, linux-image-extra-* (et linux-signed-image-* si on a de l’UEFI) : il est probable que ce soit la même chose sur Mint. Attention à ne le faire que sur des paquets déjà installés.

  2. Bonjour,
    J’ai moi aussi un problème avec la mise à jour d’Ubuntu MATE de 16 à 17.04. Tout le processus de mise à jour semble s’être bien passé. Le PC démarre, j’arrive bien sur l’écran de login mais ni la souris, ni le clavier ne répondent et au bout de quelques secondes, je vois le curseur qui est dans le champ pour entrer le mot de passe qui arrête de clignoter. Ensuite, je dois faire un reset de la machine. J’ai tenté de booter en mode rescue mais je n’ai rien pu faire.
    J’ajoute que ce PC est en dual boot avec windows 7
    Merci de votre aide

  3. Bonjour
    j’ai rencontré un pb similaire j’ai installé un ubuntu 16.4 sur une clé USB ,
    Je démarre sur ma clé USB ubuntu ,je vois mon disque interne crypté mais lorsque je rentre la clé (en mode gui) voici le message d’erreur:
    Erreur lors du déverrouillage du périphérique chiffré:
    Error unlocking /dev/sda2: Error spawning command-line `cryptsetup luksOpen « /dev/sda2 » « luks-50b09f43-9843-415e-a4eb-2cf75f1dee9f » ‘: Failed to execute child process « cryptsetup » (No such file or directory) (g-exec-error-quark, 8) (udisks-error-quark, 0).

    Si je fait le teste de démarrer sur le dvd ubuntu en mode teste, là j’arrive bien a rentrer ma clé.
    pourquoi ?
    Est ce que quelqu’un a une réponse ? Merci

    1. Je n’ai pas la réponse, mais un contournement qui fonctionnerait probablement serait d’installer cryptsetup quand le problème apparait : sudo apt install cryptsetup.
      Ce qui est étrange, c’est que le DVD et la clé USB devraient se comporter de la même manière s’ils ont été générés depuis le même fichier ISO.

Répondre à Eric Leroy Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *