web-dev-qa-db-fra.com

Ubuntu 18.04 sur le noyau 4.15.0-34-generic démarre sur BusyBox

La machine était une nouvelle installation d’Ubuntu 18.04.1 et utilisait LVM et LUKS lors de l’installation. La machine fonctionnait bien sur le noyau 4.15.0-33-generic.

Le noyau est passé de 4.15.0-33 à 4.15.0-34-generic. Une fois le noyau mis à jour, il ne demande plus de mot de passe LUKS et s’amorce directement vers BusyBox v1.27.2.

Lors du démarrage à partir du noyau plus ancien, LUKS est invité comme d'habitude et la machine peut démarrer correctement. Le problème est lors du démarrage à partir du nouveau noyau.

J'ai essayé d'exécuter fsck à partir d'un liveCD de 18.04. J'ai débloqué le lecteur d'abord puis couru

fsck -f /deb/sda3

Cependant je ne reçois que

fsck from util-linux 2.31.1

et rien d'autre.

Existe-t-il un correctif que je peux exécuter?

3
jimbob

Le problème est que /sbin/cryptsetup n'est pas dans le fichier initramfs /boot/initrd.img-4.15.0-36-generic.

Vous devez ajouter CRYPTSETUP=y dans /etc/cryptsetup-initramfs/conf-hook. Vous devez également ajouter l'option initramfs dans /etc/crypttab. Ensuite, vous devez exécuter update-initramfs, qui résout ce problème.

Solution détaillée:

  1. Sur une autre machine Ubuntu, utilisez "Startup Disk Creator" pour créer un lecteur USB amorçable Ubuntu 18.04.
  2. Branchez cette clé USB dans un port USB de l'ordinateur qui démarre sur BusyBox
  3. Lorsque le USB Live Ubuntu est prêt, connectez-vous à Internet (WiFi ou filaire)

  4. Ouvrir un terminal

    ubuntu@ubuntu:~$ Sudo su
    
  5. Recherchez le périphérique de bloc chiffré.

    root@ubuntu:~# blkid|grep LUKS
    /dev/nvme0n1p3: UUID="4b206e76-1531-48ae-95be-ae0ed7a244c1" TYPE="crypto_LUKS" PARTUUID="21db499d-b87b-41c6-864f-04d1531cb083"
    
  6. Décrypter l'appareil

    root@ubuntu:~# cryptsetup open UUID="4b206e76-1531-48ae-95be-ae0ed7a244c1" nvme0n1p3_crypt
    Enter passphrase for /dev/disk/by-uuid/4b206e76-1531-48ae-95be-ae0ed7a244c1: 
    
  7. Liste des périphériques mappés. control est un fichier utilisé pour envoyer une commande au mappeur de périphérique. nvme0n1p3_crypt est le périphérique déchiffré. ubuntu--vg-root est un volume logique LVM du groupe de volumes LVM ubuntu-vg.

    root@ubuntu:~# ls /dev/mapper/*
    /dev/mapper/control  /dev/mapper/ubuntu--vg-root  /dev/mapper/nvme0n1p3_crypt
    
  8. Créer un point de montage. C'est là que nous allons monter le/de notre système qui ne démarre pas.

    root@ubuntu:~# mkdir -p /mnt/ubuntu-root
    
  9. Monter le volume logique racine

    root@ubuntu:~# mount /dev/mapper/ubuntu--vg-root /mnt/ubuntu-root/
    
  10. Monter des pseudo systèmes de fichiers

    root@ubuntu:~# mount -o bind /sys /mnt/ubuntu-root/sys
    root@ubuntu:~# mount -o bind /proc /mnt/ubuntu-root/proc
    root@ubuntu:~# mount -o bind /dev /mnt/ubuntu-root/dev
    
  11. Copier les informations DNS

    root@ubuntu:~# cp /etc/resolv.conf /mnt/ubuntu-root/etc/
    
  12. Changer de racine

    root@ubuntu:~# chroot /mnt/ubuntu-root/
    
  13. Mount /boot, qui contient le fichier initramfs. Cette partition n'est pas cryptée.

    root@ubuntu:/# mount /boot/
    
  14. Installez binwalk (pour voir le contenu du système de fichiers init ram)

    root@ubuntu:~# apt update
    root@ubuntu:~# apt install binwalk
    
  15. Trouver l'offset du contenu initramfs gzippé

    root@ubuntu:~# binwalk /boot/initrd.img-4.15.0-36-generic | grep gzip
    1605632       0x188000        gzip compressed data, from Unix, last modified: 2018-10-18 13:00:32
    
  16. Le problème est que le système de fichiers initramfs ne contient pas cryptsetup. C'est pourquoi il n'y a pas d'invite de mot de passe LUKS.

    root@ubuntu:/# cd /root/
    root@ubuntu:~# mkdir initramfs-4.15.0-36-generic
    root@ubuntu:~# cd initramfs-4.15.0-36-generic
    root@ubuntu:~/initramfs-4.15.0-36-generic# dd if=/boot/initrd.img-4.15.0-36-generic bs=1605632 skip=1 | gunzip | cpio -i
    root@ubuntu:~/initramfs-4.15.0-36-generic# ls sbin/cryptsetup
    ls: cannot access 'sbin/cryptsetup': No such file or directory
    
  17. Pour déchiffrer la racine au démarrage, initramfs doit contenir:

    sbin/cryptsetup
    lib/modules/4.15.0-36-generic/kernel/drivers/md/dm-crypt.ko
    
  18. Ajoutez l'option initramfs dans /etc/crypttab

    root@ubuntu:/# cat /etc/crypttab 
    nvme0n1p3_crypt UUID=4b206e76-1531-48ae-95be-ae0ed7a244c1 none luks,discard,initramfs
    
  19. Ajouter CRYPTSETUP=y dans /etc/cryptsetup-initramfs/conf-hook

  20. Exécutez update-initramfs:

    root@ubuntu:~# update-initramfs -k 4.15.0-36-generic -c -v &> update-initramfs-4.15.0-36-generic.cryptsetup.log
    
  21. Maintenant, nous avons cryptsetup dans initramfs et le module de noyau Linux dm-crypt.ko aussi:

    root@ubuntu:~# grep /sbin/cryptsetup update-initramfs-4.15.0-36-generic.cryptsetup.log
    Adding binary /sbin/cryptsetup
    
    root@ubuntu:~# grep dm-crypt.ko update-initramfs-4.15.0-36-generic.cryptsetup.log
    Adding module /lib/modules/4.15.0-36-generic/kernel/drivers/md/dm-crypt.ko
    
  22. Maintenant, lancez update-initramfs, sans -c (nouveau) et sans -v (verbose):

    root@ubuntu:~# update-initramfs -k 4.15.0-36-generic -u
    
  23. Vérifier que le initramfs est réellement correct

    root@ubuntu:~# binwalk /boot/initrd.img-4.15.0-36-generic | grep gzip
    1605632       0x188000        gzip compressed data, from Unix, last modified: 2018-10-18 14:26:29
    
    root@ubuntu:~# dd if=/boot/initrd.img-4.15.0-36-generic bs=1605632 skip=1 2> /dev/null | gunzip | cpio -t 2> /dev/null |grep sbin/crypt 
    sbin/cryptsetup
    
    root@ubuntu:~# dd if=/boot/initrd.img-4.15.0-36-generic bs=1605632 skip=1 2> /dev/null | gunzip | cpio -t 2> /dev/null |grep dm-crypt.ko
    lib/modules/4.15.0-36-generic/kernel/drivers/md/dm-crypt.ko
    
  24. Maintenant, redémarrez.

2
sebhtml