Contourner l’erreur d’installation de grub-EFI dans /target/

De nombreux sujets sont ouverts sur les forums pour signaler que l’installation d’Ubuntu (entre autres) sur certains PC en UEFI conduit à une erreur en fin de procédure, ce qui rend l’OS inutilisable. On rencontre de nombreux exemples qui ressemblent à ceci :

« Echec de l’installation  de GRUB »
Le paquet GRUB-efi-amd64 n’a pas pu être installé dans /target/. En l’absence du programme de démarrage GRUB, le système installé ne pourra pas démarrer.

L’objet de cette démo est de présenter un moyen de contournement basé sur une installation en simple boot, mais il n’est pas substituable à tous les cas de verrouillage.

Donc, cette démo est informative, et on ne la suit qu’à ses risques et périls. 

I. Présentation de la situation

En image, c’est plus parlant. Voici un exemple d’installation défailllante.

Mon image

Les raisons de ce souci sont multiples… ça peut être

  • la partition efi qui est absente ou non inscriptible
  • la version de Grub qui n’est pas bonne
  • la NVram qui est plombée par le constructeur.
  • Une autre raison spécifique à la marque du PC.

Les pistes sont nombreuses, et c’est souvent difficile à résoudre. C’est même parfois définitivement bloquant. Par ailleurs, on peut être tenté de vouloir réparer l’installation en forçant l’installation de grub, mais c’est une piste que je déconseille.

En effet, il faut savoir que des outils de lancement sur USB comme SG2D et Refind parviennent à lancer la version mal installée depuis le noyau grub, mais on aboutit à ceci :

Mon image

Cette erreur s’explique par le fait que certaines commandes dpkg, certaines désinstallations, entre autres, ne sont pas allées à leur terme. Dès lors, on a sous la main une installation bancale. Je préconise donc de réinstaller intégralement, mais d’une autre manière.

II. Installation de Xubuntu en UEFI sans Grub

1. Les étapes de l’installation

Je choisis Xubuntu pour une question de légèreté, car je fais cette démo depuis un PC virtuel. Par ailleurs, je fais cette démo sur une installation en simple boot (sans Windows) pour une question de clarté. Je parlerai du dual-boot avec Windows au fil des étapes.

J’ai expliqué comment faire une installation sans Grub dans ce sujet, mais je vais en reprendre les grandes lignes.

  • Avec gparted, on crée une table de partitions gpt, format attendu pour une installation en UEFI (à noter que pour avoir le clavier en français, un setxkbmap fr préalable dans un terminal ne sera pas superflu).

Mon image

On en profite pour créer  deux partitions. Une partition en fat32 de 100 Mio environ à laquelle on assigne les drapeaux esp et boot pour en faire une partition EFI (dans le cas d’un dual boot, celle-ci existant déjà pour lancer Windows, on n’aura pas besoin créer cette partition efi en fat32). Puis on crée une partition ext4 sur le reste du disque. On aura une structure proche de ceci (capture simplement illustrative, car issue d’une autre installation… ce qui explique le contenu et l’ordre des partitions)

Mon image

Notre disque est prêt pour l’installation.

On vérifie qu’on est bien en mode UEFI pour notre installation via la commande efibootmgr qui ne doit pas retourner d’erreur. Si on a une erreur, c’est que notre Live USB est exécuté dans un mauvais mode.

***  Alternative à cette commande :

[ -d /sys/firmware/efi ] && echo "Session EFI" || echo "Session non-EFI"

Elle doit retourner  « Session EFI« . Si c’est le cas, on passe à la suite.

  • Installation via le terminal

Au lieu d’utiliser le raccourci sur le bureau, on lance un terminal et on saisit

ubiquity -b

Mon image

Les étapes habituelles de l’installation sont proposées, et au moment du choix du type d’installation, on décoche « LVM » et le cryptage, et on choisit « autre chose ». On va simplement utiliser l’option « modifier » pour attribuer à la partition ext4 le point de montage / et on coche le formatage si ce n’est pas automatique (l’idée est de supprimer l’ancienne installation si elle préexiste).

Et c’est parti :

Mon image

Cette fois, l’installation va effectivement à son terme. Je vais en profiter pour faire le point sur le résultat, avant de passer à la suite.

2. Les constats de l’installation via la commande ubiquity -b

La meilleur chose à faire, c’est de lire un rapport boot-info de la situation initiale après cette installation sans grub. On y constate plusieurs choses :

sda1: __________________________________________________________________________

    Operating System:  
    Boot files:        /efi/ubuntu/fwupx64.efi
  • La partition EFI a tout de même enregistré un dossier Ubuntu. On y trouve un fichier un peu obscur qui sert à la mise à jour de Xubuntu.
=================== efibootmgr -v
BootCurrent: 0001
BootOrder: 0004,0000,0001,0002,0003
Boot0004* Windows Boot Manager	HD(1,GPT,13944985-e511-4a06-852e-2787ecc204c5,0x800,0x41800)/File(EFIMicrosoftBootbootmgfw.efi)
  • La Nvram n’a pas enregistré d’entrée Ubuntu, mais on trouve (comme sur beaucoup de PC) une entrée « Windows Boot Manager » qui correspond au démarrage d’un ancien Windows, et ce malgré sa désinstallation. On pourrait aussi ne plus rien trouver en relation au disque dur. Cela dépend des PC.
=============================== sda2/etc/fstab: ================================

--------------------------------------------------------------------------------
# /etc/fstab: static file system information.
# / was on /dev/sda2 during installation
UUID=1a575471-811e-4bd3-babe-2f56e3685750 /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/sda1 during installation
UUID=9AD7-9D52  /boot/efi       vfat    umask=0077      0       1
/swapfile                                 none            swap    sw              0       0
--------------------------------------------------------------------------------
  • Le fichier fstab montre que la partition efi qu’on a créée est bien montée, ce qui évitera les montages manuels.

On va s’assurer que Grub ne s’est pas installé en passant la commande

ikewdu@ikewdu-virtual-machine:~$ dpkg --get-selections | grep grub
grub-common                    install
grub-gfxpayload-lists          install
grub-pc                        install
grub-pc-bin                    install
grub2-common                    install
ikewdu@ikewdu-virtual-machine:~$

Et surprise ! On voit que l’installation a tout de même mis en place les paquets propres à grub-pc, ce qui ne nous convient absolument pas. On va donc devoir le supprimer, et pour cela, il sera plus simple de lancer notre noyau Linux pour rectifier tout ça.

III. Suppression de grub-pc et installation de grub-efi

1. Démarrage du noyau Linux installé

Pour faire toutes les opérations qui vont suivre, on va éviter de passer par un chroot en utilisant deux outils bien pratiques pour lancer notre Xubuntu installée : Refind ou Supergrub2disk.

J’ai expliqué dans ce sujet la procédure pour créer l’un ou l’autre de ces outils, mais on peut également suivre les préconisations du site du concepteur de Refind ou celles de Malbo, pour SG2D, dans ce tuto très complet.

L’important, c’est de pouvoir lancer cette version installée depuis un CD-Rom ou une clé USB. Si on n’y parvient pas, il faudra utiliser la  procédure de chroot, plus complexe mais bien documentée sur le site Ubuntu.

2. Désinstallation des traces de grub-pc

La désinstallation se fait en deux étapes : on purge le système des fichiers grub dont on ne veut pas, puis on supprime le dossier Ubuntu de la partition efi.

  • La première partie se limite à
ikewdu@ikewdu-virtual-machine:~$ sudo apt purge grub*
[sudo] Mot de passe de ikewdu : 
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
[...]
ikewdu@ikewdu-virtual-machine:~$ dpkg --get-selections | grep grub
ikewdu@ikewdu-virtual-machine:~$
  • Quant à la seconde, on la résout en lançant  en admin l’explorateur de fichiers (sudo nautilus, sudo thunar, sudo nemo selon la distribution qu’on utilise), puis en supprimant dans /boot/efi/EFI le dossier Ubuntu.

Mon image

  • On peut aussi passer par la commande
rm -r /boot/efi/EFI/ubuntu

Ainsi, nous disposons d’une installation totalement vidée de toute trace de Grub. On peut le vérifier avec un nouveau rapport boot-info.

sda1: __________________________________________________________________________
  Operating System:  
  Boot files:

  boot-info is executed in installed-session (Ubuntu 18.04.1 LTS, bionic, Ubuntu, x86_64)

=================== efibootmgr -v
BootCurrent: 0001
BootOrder: 0004,0000,0001,0002,0003
Boot0000* EFI VMware Virtual SCSI Hard Drive (0.0) 
Boot0001* EFI VMware Virtual SATA CDROM Drive (1.0)
Boot0002* EFI Network PciRoot(0x0)/Pci(0x11,0x0)/Pci(0x1,0x0)/
Boot0003* EFI Internal Shell 
Boot0004* Windows Boot Manager HD(1,GPT,13944985-e511-4a06-852e-2787ecc204c5,0x800,0x41800)/File(EFIMicrosoftBootbootmgfw.efi)

On a bien supprimé grub intégralement (notamment de la partition efi), la NVram n’est pas modifiée et pourtant, on a booté sur la version installée.

3. Installation de grub-EFI

Il s’agit en effet de mettre en place la bonne version. Comme de nombreux PC génèrent l’erreur initiale parce que la NVram est verrouillée, on va faire en sorte de n’y rien écrire.

Mais cette fois, on doit passer par un terminal. On peut déjà vérifier quels paquets de grub sont disponibles :

ikewdu@ikewdu-virtual-machine:~$ dpkg --list grub*
Souhait=inconnU/Installé/suppRimé/Purgé/H=à garder
| État=Non/Installé/fichier-Config/dépaqUeté/échec-conFig/H=semi-installé/W=attend-traitement-déclenchements
|/ Err?=(aucune)/besoin Réinstallation (État,Err: majuscule=mauvais)
||/ Nom            Version      Architecture Description
+++-==============-============-============-=================================
un  grub           <aucune>     <aucune>     (aucune description n'est disponi
ii  grub-common    2.02-2ubuntu amd64        GRand Unified Bootloader (common 
un  grub-coreboot  <aucune>     <aucune>     (aucune description n'est disponi
un  grub-doc       <aucune>     <aucune>     (aucune description n'est disponi
un  grub-efi       <aucune>     <aucune>     (aucune description n'est disponi
un  grub-efi-amd64 <aucune>     <aucune>     (aucune description n'est disponi
un  grub-efi-ia32  <aucune>     <aucune>     (aucune description n'est disponi
un  grub-efi-ia64  <aucune>     <aucune>     (aucune description n'est disponi
un  grub-emu       <aucune>     <aucune>     (aucune description n'est disponi
ii  grub-gfxpayloa 0.7          amd64        GRUB gfxpayload blacklist
un  grub-ieee1275  <aucune>     <aucune>     (aucune description n'est disponi
un  grub-legacy    <aucune>     <aucune>     (aucune description n'est disponi
un  grub-legacy-do <aucune>     <aucune>     (aucune description n'est disponi
un  grub-linuxbios <aucune>     <aucune>     (aucune description n'est disponi
ii  grub-pc        2.02-2ubuntu amd64        GRand Unified Bootloader, version
ii  grub-pc-bin    2.02-2ubuntu amd64        GRand Unified Bootloader, version
un  grub-xen       <aucune>     <aucune>     (aucune description n'est disponi
un  grub-yeeloong  <aucune>     <aucune>     (aucune description n'est disponi
un  grub2          <aucune>     <aucune>     (aucune description n'est disponi
ii  grub2-common   2.02-2ubuntu amd64        GRand Unified Bootloader (common 
ikewdu@ikewdu-virtual-machine:~$

On voit que grub-efi et grub-efi-amd64 sont disponibles. Je vais me contenter du second.

Remarque : en machine virtuelle, je n’ai pas de boot-secure.  Si on avait un boot secure actif, on récupérerait aussi shim et shim-signed pour obtenir le fichier shimx64.efi.

ikewdu@ikewdu-virtual-machine:~$ sudo apt install grub-efi-amd64
[sudo] Mot de passe de ikewdu : 
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Les paquets supplémentaires suivants seront installés : 
  grub-common grub-efi-amd64-bin grub2-common os-prober
Paquets suggérés :
  multiboot-doc grub-emu xorriso desktop-base
Les NOUVEAUX paquets suivants seront installés :
  grub-common grub-efi-amd64 grub-efi-amd64-bin grub2-common os-prober
[...]
Paramétrage de grub-efi-amd64-bin (2.02-2ubuntu8.15) ...
Paramétrage de grub2-common (2.02-2ubuntu8.15) ...
Paramétrage de os-prober (1.74ubuntu1) ...
Paramétrage de grub-efi-amd64 (2.02-2ubuntu8.15) ...

Creating config file /etc/default/grub with new version
Traitement des actions différées (« triggers ») pour ureadahead (0.100.0-20) ...
ikewdu@ikewdu-virtual-machine:~$

L’installation des paquets s’est bien déroulée.  Comme je suspecte ma NV-ram d’être à l’origine du plantage, je vais demander une installation sans écriture en NVram avec /boot/efi comme cible de mon installation :

ikewdu@ikewdu-virtual-machine:~$ sudo grub-install -v --no-nvram --efi-directory=/boot/efi
grub-install : information : writing 1032 bytes of a fixup block starting at 0xc000.
grub-install : information : reading /usr/lib/grub/x86_64-efi/fshelp.mod.
grub-install : information : reading /usr/lib/grub/x86_64-efi/ext2.mod.
grub-install : information : reading /usr/lib/grub/x86_64-efi/part_gpt.mod.
grub-install : information : kernel_img=0x55ac30c73730, kernel_size=0x18c00.
grub-install : information : the core size is 0x1cc90.
grub-install : information : writing 0x1e000 bytes.
grub-install : information : copying `/boot/grub/x86_64-efi/core.efi' -> `/boot/efi/EFI/ubuntu/grubx64.efi'.
grub-install : information : copying `/boot/grub/x86_64-efi/core.efi' -> `/boot/efi/EFI/BOOT/BOOTX64.EFI'.
grub-install : information : copying `/usr/lib/shim/fbx64.efi' -> `/boot/efi/EFI/BOOT/fbx64.efi'.
grub-install : information : impossible d'ouvrir « /usr/lib/shim/fbx64.efi » : Aucun fichier ou dossier de ce type.
Installation terminée, sans erreur
ikewdu@ikewdu-virtual-machine:~$

Et enfin, on écrit le fichier grub.cfg

ikewdu@ikewdu-virtual-machine:~$ sudo update-grub
Sourcing file `/etc/default/grub'
Création du fichier de configuration GRUB…
Image Linux trouvée : /boot/vmlinuz-4.15.0-96-generic
Image mémoire initiale trouvée : /boot/initrd.img-4.15.0-96-generic
Image Linux trouvée : /boot/vmlinuz-4.15.0-29-generic
Image mémoire initiale trouvée : /boot/initrd.img-4.15.0-29-generic
Adding boot menu entry for EFI firmware configuration
fait
ikewdu@ikewdu-virtual-machine:~$

Notre installation est prête à fonctionner si le PC est capable de sélectionner l’entrée Ubuntu au moment du démarrage. Beaucoup de PC sont capables de le faire. Imaginons que le notre ne soit pas en mesure de réussir.

IV. Utiliser l’entrée « WBM » pour lancer notre Linux

Comme souvent, quand le boot du PC est verrouillé sur « Windows Boot Manager », il faut faire croire au bios qu’il va lancer Windows.

On constate dans le second rapport boot-info que l’installation de grub-efi a créé deux dossiers : un dossier boot et un dossier ubuntu, mais aucune entrée en NVram. On va en profiter pour ajouter un dossier Microsoft en parallèle aux deux précédents. Dans  celui-ci, on va créer un dossier boot, et on copie dans ce dossier le fichier grubx64.efi qu’on renomme en bootmgfw.efi.

Ce qui donne ceci :

Mon image

En fait, notre PC va être persuadé qu’il exécute l’entrée « Windows Boot Manager » présente en NVram alors qu’il exécute grubx64.efi.

Remarque :

La plupart des PC savent identifier la présence des fichiers Windows sur la partition EFI au moment du démarrage et ajouteront l’entrée en NVram. Sinon on peut tenter de l’ajouter manuellement si le bios le permet, et en dernier recours via la commande qui ajoute l’entrée « WBM » en partition 1 avec le chemin de nos faux fichiers Microsoft.

sudo efibootmgr -l d /dev/sda -p 1 -L "Windows Boot Manager" -l '\efi\Microsoft\boot\bootmgfw.efi'

Attention ! Dans le cas d’un dual-boot, le fichier bootmgfw.efi existerait déjà, et il faudrait le renommer préalablement en bootmgfw-origine.efi pour ne pas risquer de perdre son Windows.

Remarque : Dans le cas d’un dual-boot, il serait nécessaire de repasser ensuite par un sudo update-grub pour que le lanceur identifie le fichier  bootmgfw-origine.efi et l’ajoute dans la liste de démarrage (non testé).

A ce stade, tout est prêt pour un démarrage sur Ubuntu. Il suffit de tester :

Mon image

Et c’est bon. Un dernier rapport boot-info nous confirme que le PC pense toujours lancer Windows Boot Manager.

sda1: __________________________________________________________________________

    Operating System:  
    Boot files:        /efi/ubuntu/grubx64.efi 
                       /efi/Microsoft/Boot/bootmgfw.efi

=================== efibootmgr -v
BootCurrent: 0004
BootOrder: 0004,0000,0001,0002,0003
Boot0004* Windows Boot Manager PciRoot(0x0)/Pci(0x10,0x0)/SCSI(0,0)/HD(1,GPT,13944985-e511-4a06-852e-2787ecc204c5,0x800,0x41800)/File(EFIMicrosoftBootbootmgfw.efi)

Nous avons bien une partition efi contenant un lanceur Ubuntu (inutilisé) et un faux lanceur Windows qui est actuellement utilisé lors du démarrage. On voit d’ailleurs que Refind lui-même s’y trompe, car lui aussi croit pouvoir lancer un Windows si on l’utilise au boot du PC :

Mon image
Pour parachever le tout, et afin qu’une mise à jour de notre Xubuntu ne vienne pas annuler tout ce travail, on peut bloquer la mise à jour de grub en passant plusieurs commandes :

apt-mark  hold   fwupdate    
apt-mark  hold   grub-efi-amd64
apt-mark  hold   grub-efi

Remarque : pour empêcher le secure-boot et les fichiers signés de se mettre à jour, on pourrait ajouter :

apt-mark  hold   secureboot-db
apt-mark  hold   fwupdate-signed

Donc, on a contourné les verrouillage de la Nvram, mais rien ne garantit que d’autres verrouillages n’entravent pas ce genre de manipulation. Donc, à suivre avec prudence, et à ses risques et périls.