Quatre méthodes pour ajouter une entrée NVram en UEFI

En principe, l’ajout d’un système d’exploitation (Windows) gère intégralement et automatiquement le dual-boot en UEFI, et notamment les entrées NVram qui vont permettre au système de lancer tel ou tel système d’exploitation.

Par exemple, si on ajoute une distribution Ubuntu sur un PC Windows, l’installateur copie de lui-même tous les fichiers efi nécessaires au lanceur Grub, et il crée une entrée Ubuntu dans la NVram, ce qui permet au système de démarrer.

Mais parfois, l’opération échoue, et Windows continue de démarrer par lui-même. Mieux, on peut avoir envie d’ajouter un lanceur indépendant comme dans cet exemple où j’ai ajouté le lanceur Refind manuellement (voir le lien précédent pour la mise en place des fichiers sur la partition efi). Il faut donc savoir paramétrer la NVram pour qu’une telle configuration fonctionne.  Nous allons voir quatre méthodes pour le faire.

I) L’ajout d’une entrée via l’UEFI

C’est en principe la méthode la plus naturelle, mais il faut que les options soient proposées. De plus, il y a tellement de version d’UEFI qu’il est difficile de proposer un tuto universel. Je présent la méthode depuis l’UEFI d’un PC Virtuel sous Vmware. On accède à l’UEFI en appuyant une touche préconisée par le constructeur (souvent F2). On obtient dans mon cas ceci :

bios1

On va utiliser l’option « Boot Maintenance Manager« , puis « Configure Boot Options«   et on choisit d’ajouter une entrée via « Add Boot Option« . Ce qui me conduit ici :

bios2On écarte les entrées inutiles (ici en CDROM en rouge, un disque Winre, une entrée MAC) et on sélectionne notre disque dur par entrée. Ceci conduit à une entrée <EFI>, puis à un choix entre <Microsoft>, <Boot>, <Ubuntu> et <REfind>. On choisit le dernier et on aboutit à une liste de fichiers :

bios3

Le fichier refind_x64.efi semble approprié. Une description est demandée (ici je saisis « mon-refind« ). On valide le tout : l’entrée est créée. Il faut encore la placer en tête. L’entrée « Configure Boot Options » conduit à une option « Change Boot Order » . Elle ouvre cette fenêtre :

bios4

Comme préconisé, on sélectionne l’entrée « Mon-Refind » par la touche entrée, et on la passe en première position. On enregistre. Et il ne reste plus qu’à redémarrer pour tester. Le démarrage se fait bien sur mon lanceur.

refnd-ok

La méthode fonctionne probablement très différemment sur l’UEFI d’un PC, cette méthode n’est proposée que pour information.

II) L’ajout d’entrée via un Linux installé.

En principe, il suffit de deux commandes pour ajouter une entrée Ubuntu sur un PC en UEFI :

essai@essai-virtual-machine ~ $ sudo grub-install
essai@essai-virtual-machine ~ $ sudo update-grub
Création du fichier de configuration GRUB…
Found linux image: /boot/vmlinuz-3.13.0-24-generic
Found initrd image: /boot/initrd.img-3.13.0-24-generic
No volume groups found
Windows Boot Manager trouvé sur /dev/sda2@/EFI/Microsoft/Boot/bootmgfw.efi
essai@essai-virtual-machine ~ $

On peut vérifier que l’entrée a été ajoutée en NVram. L’entrée Ubuntu liée à Grub a été ajoutée, et elle passée en première position dans la ligne bootOrder

essai@essai-virtual-machine ~ $ sudo efibootmgr 
BootCurrent: 0002
Timeout: 2 seconds
BootOrder: 0004,0002,0003,0001,0008,0009,000A,000B,0000
Boot0000* EFI VMware Virtual SCSI Hard Drive (2.0)
Boot0001* Windows Boot Manager
Boot0002* REfind
Boot0003* EFI VMware Virtual SCSI Hard Drive (0.0)
Boot0004* ubuntu
Boot0008* EFI VMware Virtual SCSI Hard Drive (0.0)
Boot0009* EFI VMware Virtual SATA CDROM Drive (1.0)
Boot000A* EFI Network
Boot000B* EFI Internal Shell (Unsupported option)
essai@essai-virtual-machine ~ $

Malheureusement, cette méthode ne permettrait pas d’ajouter l’entrée Refind, et c’est celle qui m’intéresse (et encore moins Windows). On va la supprimer pour mieux la recréer.  C’est très simple  (on obtient les détails de la commande avec l’extension -help. Notre entrée Refind a disparu.

essai@essai-virtual-machine ~ $ sudo efibootmgr -b 0002 -B
BootCurrent: 0002
Timeout: 2 seconds
BootOrder: 0004,0003,0001,0008,0009,000A,000B,0000
Boot0000* EFI VMware Virtual SCSI Hard Drive (2.0)
Boot0001* Windows Boot Manager
Boot0003* EFI VMware Virtual SCSI Hard Drive (0.0)
Boot0004* ubuntu
Boot0008* EFI VMware Virtual SCSI Hard Drive (0.0)
Boot0009* EFI VMware Virtual SATA CDROM Drive (1.0)
Boot000A* EFI Network
Boot000B* EFI Internal Shell (Unsupported option)

Première chose à faire, identifier le disque et les partitions.

essai@essai-virtual-machine ~ $ sudo parted -l
Modèle: VMware, VMware Virtual S (scsi)
Disque /dev/sda : 39,7GB
Taille des secteurs (logiques/physiques): 512B/512B
Table de partitions : gpt

Numéro  Début   Fin     Taille  Système de fichiers  Nom                           Fanions
 1      1049kB  473MB   472MB   ntfs                 Basic data partition          msftdata
 2      473MB   683MB   210MB   fat32                EFI system partition          démarrage
 3      683MB   817MB   134MB                        Microsoft reserved partition  msftres
 4      817MB   20,6GB  19,8GB  ntfs                 Basic data partition          msftdata
 5      20,9GB  39,2GB  18,3GB  ntfs                 Basic data partition          msftdata
 6      39,2GB  39,7GB  566MB   fat32                Basic data partition          msftdata

Le nom du disque est /dev/sda et la partition efi est la numéro 2. On n’a plus qu’à recréer l’entrée qui nous intéresse.

essai@essai-virtual-machine ~ $ sudo efibootmgr -c -d /dev/sda -p 2 -L "Refind-new" -l "\EFI\refind\refind_x64.efi"
Timeout: 2 seconds
BootOrder: 0002,0004,0003,0001,0008,0009,000A,000B,0000
Boot0000* EFI VMware Virtual SCSI Hard Drive (2.0)
Boot0001* Windows Boot Manager
Boot0003* EFI VMware Virtual SCSI Hard Drive (0.0)
Boot0004* ubuntu
Boot0008* EFI VMware Virtual SCSI Hard Drive (0.0)
Boot0009* EFI VMware Virtual SATA CDROM Drive (1.0)
Boot000A* EFI Network
Boot000B* EFI Internal Shell (Unsupported option)
Boot0002* Refind-new

Quelques explications: -c signifie « create », -d signifie « disque », -p signifie « partition », -L signifie « label » et -l indique le chemin du fichier refind_x64.efi précédemment trouvé. Il ne reste qu’à tester. Aucun problème, nous retrouvons notre démarrage sur Refind :

refnd-ok

 

III) Ajout d’une entrée via Windows.

Sous Windows, on peut utiliser deux moyens différents : l’un s’appuie sur une logiciel nommé EasyUEFI, et l’autre sur la commande bcdedit.

1) L’utilisation de EasyUEFI

J’ai déjà fait cette démonstration sur l’autre sujet, et par conséquent, je me contente d’en donner le lien : http://ikewdu.free.fr/creer-un-dual-boot-windows-winre-en-uefi/#easyuefi

2) L’utilisation de bcdedit

Un logiciel, c’est pratique, mais ça peut devenir payant. Donc, autant se préparer à utiliser les outils Windows. La commande bcdedit est là pour ça. Mon intention première était d’utiliser la commande bcdedit /create, mais en dépit de nombreux essais et de recherches infructueuses, j’ai renoncé à cette solution. Nous allons donc utiliser l’option /copy.

Première chose à faire, monter la partition efi avec une lettre Z (ou autre):

C:\windows\system32>mountvol z: /s
C:\windows\system32>

Ensuite, on fait un état des entrées présentes dans la NVRAM :

C:\windows\system32> bcdedit /enum firmware

Gestionnaire de démarrage du microprogramme
-------------------------------------------
identificateur          {fwbootmgr}
displayorder            {bootmgr}
                        {5463a4c4-4b6d-11e7-886a-ed04ad7ce4d1}
                        {5463a4ac-4b6d-11e7-886a-ed04ad7ce4d1}
                        {5463a4ae-4b6d-11e7-886a-ed04ad7ce4d1}
                        {5463a4af-4b6d-11e7-886a-ed04ad7ce4d1}
                        {5463a4b0-4b6d-11e7-886a-ed04ad7ce4d1}
                        {5463a4c6-4b6d-11e7-886a-ed04ad7ce4d1}
                        {5463a4c7-4b6d-11e7-886a-ed04ad7ce4d1}
timeout                 2

Gestionnaire de démarrage Windows
---------------------------------
identificateur          {bootmgr}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager
locale                  fr-fr
inherit                 {globalsettings}
default                 {current}
resumeobject            {5463a4b6-4b6d-11e7-886a-ed04ad7ce4d1}
displayorder            {current}
                        {5463a4ba-4b6d-11e7-886a-ed04ad7ce4d1}
toolsdisplayorder       {memdiag}
timeout                 30

Application logicielle (101fffff)
--------------------------------
identificateur          {5463a4ac-4b6d-11e7-886a-ed04ad7ce4d1}
description             EFI VMware Virtual SCSI Hard Drive (0.0)

Application logicielle (101fffff)
--------------------------------
identificateur          {5463a4ae-4b6d-11e7-886a-ed04ad7ce4d1}
description             EFI Network

Application logicielle (101fffff)
--------------------------------
identificateur          {5463a4af-4b6d-11e7-886a-ed04ad7ce4d1}
description             EFI Internal Shell (Unsupported option)

Application logicielle (101fffff)
--------------------------------
identificateur          {5463a4b0-4b6d-11e7-886a-ed04ad7ce4d1}
description             EFI VMware Virtual SCSI Hard Drive (2.0)

Application logicielle (101fffff)
--------------------------------
identificateur          {5463a4c4-4b6d-11e7-886a-ed04ad7ce4d1}
device                  partition=\Device\HarddiskVolume2
path                    \efi\ubuntu\grubx64.efi
description             EFI VMware Virtual SCSI Hard Drive (0.0)

Application logicielle (101fffff)
--------------------------------
identificateur          {5463a4c6-4b6d-11e7-886a-ed04ad7ce4d1}
device                  partition=\Device\HarddiskVolume2
path                    \efi\refind\refind_x64.efi
description             EFI VMware Virtual SATA CDROM Drive (1.0)

C:\windows\system32>

Je constate que Bootmgr est l’entrée qui démarre en priorité, et que j’ai de nombreuses entrées vides comme le CD-Rom, le shell, etc. Je vais copier l’entrée bootmgr pour paramétrer ma nouvelle entrée. Je copie l’entrée en la renommant « Refind-bcd« .

C:\windows\system32>bcdedit /copy {bootmgr} /d "Refind-bcd"
L’entrée a été correctement copiée dans {5463a4c7-4b6d-11e7-886a-ed04ad7ce4d1}.

C:\windows\system32>

A ce stade, ma nouvelle entrée crée me donne un un nouvel identificateur que je copie. Je modifie mon device et mon path pour les rediriger vers z:\efi\refind\refind_x64.efi :

C:\windows\system32>bcdedit /set {5463a4c7-4b6d-11e7-886a-ed04ad7ce4d1} device partition=z:
L’opération a réussi.

C:\windows\system32>bcdedit /set {5463a4c7-4b6d-11e7-886a-ed04ad7ce4d1} path \efi\refind\refind_x64.efi
L’opération a réussi.

Et enfin, je passe ma nouvelle entrée en tête de liste dans fwbootmgr (le gestionnaire de firmware) :

C:\windows\system32>bcdedit /set {fwbootmgr} displayorder {5463a4c7-4b6d-11e7-886a-ed04ad7ce4d1} /addfirst
L’opération a réussi.

Il ne reste plus qu’à tester la nouvelle entrée dans le firmware. Et là encore :

refnd-ok

Ce n’est certes pas la méthode la plus simple, mais c’est la seule qui se fait depuis Windows, et sans logiciel tiers.  Et on aurait pu ajouter une entrée Windows, Linux ou autre.