« Efibootmgr » : différence entre les versions

De Wiki doc

(Corrections de quelques fautes et ajout de détails sur blkid)
m (Ycharbi a déplacé la page Efi boot stub vers Efibootmgr sans laisser de redirection : L'EFI boot stub n'est qu'une partie de l'outil "efibootmgr" et il est plus cohérant de parler de lui en y intégrant cette partie précise (plus évolutif).)
 
(Une version intermédiaire par le même utilisateur non affichée)
Ligne 1 : Ligne 1 :
[[Category:service_démarrage]]
[[Category:service_démarrage]]
{{Attention|Cette page s'adresse '''uniquement''' aux possesseurs de carte-mère disposant d'un '''UEFI''', ainsi qu'un disque avec une table de partitionnement GUID (dit '''GPT'''), contenant une partition en FAT16/32 pour le système EFI (appelée '''ESP''').}}
Le programme <source lang="bash" inline>efibootmgr</source> permet d'intéragir avec les entrées de démarrage d'un ordinateur. Les modification apportés par celui-ci sont stockés dans la configuration de l{{'}}''UEFI'' et sont donc indépendantes du système d'exploitation à amorcer. Certaines cartes mères ne permettants pas la modification de ces paramètres (honte à leur constructeur), l'usage de cet outil permet de palier ce défaut majeur.
Depuis sa version '''3.3''', le noyau Linux sur ArchLinux supporte l'EFISTUB (aussi appelé EFI BOOT STUB). Le principe est de '''démarrer le système d'exploitation sans avoir recours à un''' [[:Category:service_démarrage|'''chargeur de démarrage''' (GRUB, Lilo, Syslinux...), aussi appelé ''bootloader'']], c'est-à-dire qu'après le [http://fr.wikipedia.org/wiki/Power-On_Self-Test POST], aucun menu de choix ne sera affiché, démarrant immédiatement le système d'exploitation.


Cette méthode ne permet pas d'utiliser de multiples lignes de boot pour le même noyau ; chaque noyau supporte au plus une seule entrée EFI. Mais il est bien entendu possible d'utiliser plusieurs noyaux différents.
{{Attention|Les commandes de cette page s'adressent '''uniquement''' aux possesseurs de carte-mère disposant d'un '''UEFI''', ainsi qu'un disque avec une table de partitionnement ''GUID'' (dit '''GPT'''), contenant une partition en ''FAT16/32'' pour le système ''EFI'' (appelée '''ESP''').}}


== Création de l'entrée ==
=Création d'une entrée de type ESP=
Tout d'abord, on a besoin de connaître l'UUID de votre partition racine (/) :
L{{'}}''ESP'' (pour ''EFI System Partition'') est un volume formaté en ''FAT'' 16 ou 32 comportant un ou plusieurs programmes exécutables par l{{'}}''UEFI''. Normalement, ce dernier est censé parcourir l'ensemble des périphériques reconnus au démarrage pour y trouver les programmes compatibles mais il n'est pas rare que cela ne se face pas (les ''UEFI'' sont généralement des grosses merdes bogués). Afin de forcer le système à trouver un fichier d'amorce, il faut créer une [https://bbs.archlinux.org/viewtopic.php?id=251931 entrée spécifique] menant à lui. Certains ''UEFI'' permettent de le faire depuis leur interface de configuration mais pas tous... Cette méthode est donc universelle :
efibootmgr --disk /dev/sda --part 1 --create --label "Un nom pour votre entrée" --loader /EFI/debian/grubx64.efi
 
Cette ligne précise, dans l'ordre :
* '''--disk''' : le disque contenant l{{'}}''ESP''
* '''--part''' :  le numéro de la partition faisant office d{{'}}''ESP'' et contenant le programme d’amorçage
* '''--create''' : paramètre précisant la création de l'entrée
* '''--label''' : permet de définir un nom arbitraire pour reconnaître l'entrée parmi les autres
* '''--loader''' : le chemin complet du chargeur d’amorçage ''UEFI''
 
=Création d'une entrée de type STUB=
Depuis sa version '''3.3''', le noyau Linux supporte l{{'}}''EFISTUB'' (aussi appelé ''EFI BOOT STUB''). Le principe est de démarrer le système d'exploitation sans avoir recours à un [[:Category:service_démarrage|chargeur de démarrage]] additionnel (''GRUB, Lilo, Syslinux...''), aussi appelé ''bootloader'', c'est-à-dire qu'après le [http://fr.wikipedia.org/wiki/Power-On_Self-Test POST], aucun menu de choix ne sera affiché, démarrant ainsi immédiatement le système d'exploitation.
 
Cette méthode ne permet pas d'utiliser de multiples lignes de démarrage pour le même noyau ; chaque noyau supporte au plus une seule entrée ''EFI''. Mais il est bien entendu possible d'utiliser plusieurs noyaux différents.
 
Tout d'abord, on a besoin de connaître l{{'}}''UUID'' de votre partition racine (/) :
  blkid
  blkid
La commande va retourner plusieurs UUID en général, exemple :
 
La commande va un ''UUID'' par partition. Exemple :
<source lang="bash">
<source lang="bash">
[...]
[...]
Ligne 15 : Ligne 30 :
[...]
[...]
</source>
</source>
{{attention|Il est important de ne pas se tromper de partition et d'UUID. À ne pas confondre UUID avec PARTUUID !}}


Afin de ne pas ce tromper, nous pouvons utiliser la syntaxe suivante pour récupérer l'UUID de sda3 par exemple:
{{attention|Il est important de ne pas se tromper de partition et d{{'}}''UUID''. Ne pas confondre ''UUID'' avec ''PARTUUID'' !}}
 
Afin de ne pas se tromper, nous pouvons utiliser la syntaxe suivante pour récupérer l{{'}}''UUID'' de ''sda3'' par exemple :
  blkid -s UUID -o value /dev/sda3
  blkid -s UUID -o value /dev/sda3
Il est alors possible de remplir une variable avec cette valeur comme exposé [https://wiki.debian.org/EFIStub ici], de cette façon:
export UUID=$(blkid -s UUID -o value /dev/sda3)
efibootmgr -c -g -L "Debian (EFI stub)" -l '\EFI\debian\vmlinuz' -u "root=UUID=$UUID ro quiet rootfstype=ext4 add_efi_memmap initrd=\\EFI\\debian\\initrd.img"


On aura donc besoin des informations suivantes :
Il est alors possible de remplir une variable avec cette valeur comme exposé [https://wiki.debian.org/EFIStub ici], de cette façon :
* ''uuid_désirée'', ce que vous venez de trouver précédemment.
export '''UUID'''=$(blkid -s UUID -o value /dev/sda3)
* ''ext4'', le système de fichiers de votre partition root (/). À adapter si ce n'est pas votre système de fichiers.
efibootmgr -c -g -L "Debian (EFI stub)" -l '\EFI\debian\vmlinuz' -u "root=UUID='''$UUID''' ro quiet rootfstype=ext4 add_efi_memmap initrd=\\EFI\\debian\\initrd.img"
* ''/dev/sda'', le disque qui contient la partition EFI. À adapter s'il est question d'un autre disque.
 
* ''-p 1'', le nombre correspondant à la partition EFI (exemple : pour une partition EFI qui serait la /dev/sda'''2''', on utilisera ''-p '''2''''')
On aura donc besoin les informations suivantes :
* '''uuid_désirée''' : ce que vous venez de trouver précédemment
* '''ext4''' :  le système de fichiers de votre partition ''root'' (/). À adapter si ce n'est pas votre système de fichiers
* '''/dev/sda''' : le disque qui contient la partition ''EFI''. À adapter s'il est question d'un autre disque
* '''-p 1''' : le nombre correspondant à la partition ''EFI'' (exemple : pour une partition EFI qui serait la /dev/sda'''2''', on utilisera ''-p '''2''''')
 
Puis on entre enfin dans le vif du sujet :
Puis on entre enfin dans le vif du sujet :
  efibootmgr -c -g -d '''/dev/sda''' '''-p 1''' -L "Arch Linux" -l "\EFI\arch\vmlinuz-arch.efi" -u "root=UUID='''uuid_partition_Arch'''" rootfstype='''système_de_fichiers''' initrd=\EFI\arch\initramfs-arch.img rw add_efi_memmap
  efibootmgr -c -g -d '''/dev/sda''' '''-p 1''' -L "Arch Linux" -l "\EFI\arch\vmlinuz-arch.efi" -u "root=UUID='''uuid_partition_Arch'''" rootfstype='''système_de_fichiers''' initrd=\EFI\arch\initramfs-arch.img rw add_efi_memmap
On peut désormais redémarrer la machine, qui devrait normalement démarrer directement sur cette nouvelle entrée.


= Pour aller plus loin avec efibootmgr =
On peut désormais redémarrer la machine, qui devrait normalement amorcer directement sur cette nouvelle entrée.
== Changer l'ordre de démarrage ==
 
Pour voir l'ordre de boot courant, on peut utiliser :
=Changer l'ordre de démarrage=
Pour voir l'ordre de démarrage courant, on peut utiliser :
  efibootmgr | grep BootOrder
  efibootmgr | grep BootOrder
En sortie vous devriez avoir des nombres en hexadécimal, qui correspondent chacun à une entrée dans l'UEFI. On peut savoir à quelle entrée correspond chaque nombre avec :
 
En sortie vous devriez avoir des nombres hexadécimaux, qui correspondent chacun à une entrée dans l{{'}}''UEFI''. On peut savoir à quelle entrée correspond chaque nombre avec :
  efibootmgr | grep Boot0
  efibootmgr | grep Boot0
Puis pour changer l'ordre de boot, il suffit de classer ces valeurs en hexadécimal de sorte qu'en premier vous écrirez le premier ordre de boot (c'est-à-dire le premier périphérique sur lequel l'UEFI tentera de démarrer) et en dernier le dernier ordre de boot :
 
Pour changer l'ordre de démarrage, il suffit de classer ces valeurs selon vos désirs :
  efibootmgr -o XXX,YYYY,ZZZZ
  efibootmgr -o XXX,YYYY,ZZZZ
Il est possible de réinitialiser l'ordre de boot :
 
{{info|Si vous ne précisez qu'une entrée, elle deviendra la valeur par défaut pour le démarrage.}}
 
Il est possible de réinitialiser l'ordre de démarrage :
  efibootmgr -O
  efibootmgr -O


== Supprimer des entrées ==
=Supprimer des entrées=
On peut facilement supprimer une entrée dans l'UEFI avec :
On peut facilement supprimer une entrée dans l'UEFI avec :
  efibootmgr -B -b XXXX
  efibootmgr -B -b XXXX
Où XXXX est la valeur en hexadécimal de l'entrée que vous désirez supprimer.


== Changer le timeout ==
Où ''XXXX'' est la valeur en hexadécimal de l'entrée que vous désirez supprimer.
Il est possible de changer le timeout avant que l'UEFI ne démarre :
 
=Changer le délais de démarrage=
Il est possible de changer le délais de démarrage avant que l{{'}}''UEFI'' n'utilise une entrée :
  efibootmgr -t X
  efibootmgr -t X
Où X est le temps en secondes.


On peut aussi facilement supprimer ce timeout avec :
Où ''X'' est le temps en secondes.
 
On peut aussi facilement supprimer ce délais avec :
  efibootmgr -T
  efibootmgr -T
Pour ceux qui apprécient avoir un boot rapide.


== Ajouter plus d'options au boot ==
Pour ceux qui apprécient avoir un démarrage rapide.
À l'instar d'un bootloader, il est possible de spécifier des options au noyau. Toutes les options du noyau sont spécifiées avec le paramètre -u.
 
Par exemple, par défaut nous avions utilisé cette commande [[#Cr.C3.A9ation_de_l.27entr.C3.A9e|plus haut]], les options sont mises en gras sur cette ligne :
=Ajouter plus d'options au démarrage=
À l'instar d'un chargeur d'amorçage, il est possible de spécifier des options au noyau. Toutes les options du noyau sont spécifiées avec le paramètre <source lang="bash" inline>-u</source>. Pour l'exemple, par défaut nous avions utilisé cette commande [[#Cr.C3.A9ation_de_l.27entr.C3.A9e|plus haut]], les options sont mises en gras sur cette ligne :
  efibootmgr -c -g -d /dev/sda -p 1 -L "Arch Linux" -l "\EFI\arch\vmlinuz-arch.efi" -u "'''root=UUID=uuid_partition_Arch rootfstype=système_de_fichiers initrd=\EFI\arch\initramfs-arch.img rw add_efi_memmap'''"
  efibootmgr -c -g -d /dev/sda -p 1 -L "Arch Linux" -l "\EFI\arch\vmlinuz-arch.efi" -u "'''root=UUID=uuid_partition_Arch rootfstype=système_de_fichiers initrd=\EFI\arch\initramfs-arch.img rw add_efi_memmap'''"
Si on veut ajouter une option (telle '''quiet'''), on écrira donc :
Si on veut ajouter une option (telle '''quiet'''), on écrira donc :
  efibootmgr -c -g -d /dev/sda -p 1 -L "Arch Linux" -l "\EFI\arch\vmlinuz-arch.efi" -u "root=UUID=uuid_partition_Arch rootfstype=système_de_fichiers initrd=\EFI\arch\initramfs-arch.img rw add_efi_memmap '''quiet'''"
  efibootmgr -c -g -d /dev/sda -p 1 -L "Arch Linux" -l "\EFI\arch\vmlinuz-arch.efi" -u "root=UUID=uuid_partition_Arch rootfstype=système_de_fichiers initrd=\EFI\arch\initramfs-arch.img rw add_efi_memmap '''quiet'''"
Ou encore :  
Ou encore :  
  efibootmgr -c -g -d /dev/sda -p 1 -L "Arch Linux" -l "\EFI\arch\vmlinuz-arch.efi" -u "root=UUID=uuid_partition_Arch rootfstype=système_de_fichiers initrd=\EFI\arch\initramfs-arch.img rw add_efi_memmap '''vga=790 splash resume=/dev/sdXY'''"
  efibootmgr -c -g -d /dev/sda -p 1 -L "Arch Linux" -l "\EFI\arch\vmlinuz-arch.efi" -u "root=UUID=uuid_partition_Arch rootfstype=système_de_fichiers initrd=\EFI\arch\initramfs-arch.img rw add_efi_memmap '''vga=790 splash resume=/dev/sdXY'''"
Et ainsi de suite.
Et ainsi de suite.


= Sources =
=Sources=
* https://wiki.archlinux.fr/EFI_Boot_Stub
* https://wiki.archlinux.fr/EFI_Boot_Stub

Dernière version du 14 novembre 2020 à 19:53

Le programme efibootmgr permet d'intéragir avec les entrées de démarrage d'un ordinateur. Les modification apportés par celui-ci sont stockés dans la configuration de l'UEFI et sont donc indépendantes du système d'exploitation à amorcer. Certaines cartes mères ne permettants pas la modification de ces paramètres (honte à leur constructeur), l'usage de cet outil permet de palier ce défaut majeur.

ATTENTION

Les commandes de cette page s'adressent uniquement aux possesseurs de carte-mère disposant d'un UEFI, ainsi qu'un disque avec une table de partitionnement GUID (dit GPT), contenant une partition en FAT16/32 pour le système EFI (appelée ESP).

Création d'une entrée de type ESP

L'ESP (pour EFI System Partition) est un volume formaté en FAT 16 ou 32 comportant un ou plusieurs programmes exécutables par l'UEFI. Normalement, ce dernier est censé parcourir l'ensemble des périphériques reconnus au démarrage pour y trouver les programmes compatibles mais il n'est pas rare que cela ne se face pas (les UEFI sont généralement des grosses merdes bogués). Afin de forcer le système à trouver un fichier d'amorce, il faut créer une entrée spécifique menant à lui. Certains UEFI permettent de le faire depuis leur interface de configuration mais pas tous... Cette méthode est donc universelle :

efibootmgr --disk /dev/sda --part 1 --create --label "Un nom pour votre entrée" --loader /EFI/debian/grubx64.efi

Cette ligne précise, dans l'ordre :

  • --disk : le disque contenant l'ESP
  • --part : le numéro de la partition faisant office d'ESP et contenant le programme d’amorçage
  • --create : paramètre précisant la création de l'entrée
  • --label : permet de définir un nom arbitraire pour reconnaître l'entrée parmi les autres
  • --loader : le chemin complet du chargeur d’amorçage UEFI

Création d'une entrée de type STUB

Depuis sa version 3.3, le noyau Linux supporte l'EFISTUB (aussi appelé EFI BOOT STUB). Le principe est de démarrer le système d'exploitation sans avoir recours à un chargeur de démarrage additionnel (GRUB, Lilo, Syslinux...), aussi appelé bootloader, c'est-à-dire qu'après le POST, aucun menu de choix ne sera affiché, démarrant ainsi immédiatement le système d'exploitation.

Cette méthode ne permet pas d'utiliser de multiples lignes de démarrage pour le même noyau ; chaque noyau supporte au plus une seule entrée EFI. Mais il est bien entendu possible d'utiliser plusieurs noyaux différents.

Tout d'abord, on a besoin de connaître l'UUID de votre partition racine (/) :

blkid

La commande va un UUID par partition. Exemple :

[...]
/dev/sdaX: LABEL="Boot" UUID="un_uuid_qui_ne_nous_intéresse_pas" TYPE="ext2" PARTLABEL="Boot" PARTUUID="partuuid_qui_ne_nous_intéresse_pas" 
/dev/sdaY: LABEL="ArchLinux" UUID="'''uuid_désirée'''" TYPE="ext4" 
[...]

ATTENTION

Il est important de ne pas se tromper de partition et d'UUID. Ne pas confondre UUID avec PARTUUID !

Afin de ne pas se tromper, nous pouvons utiliser la syntaxe suivante pour récupérer l'UUID de sda3 par exemple :

blkid -s UUID -o value /dev/sda3

Il est alors possible de remplir une variable avec cette valeur comme exposé ici, de cette façon :

export UUID=$(blkid -s UUID -o value /dev/sda3)
efibootmgr -c -g -L "Debian (EFI stub)" -l '\EFI\debian\vmlinuz' -u "root=UUID=$UUID ro quiet rootfstype=ext4 add_efi_memmap initrd=\\EFI\\debian\\initrd.img"

On aura donc besoin les informations suivantes :

  • uuid_désirée : ce que vous venez de trouver précédemment
  • ext4 : le système de fichiers de votre partition root (/). À adapter si ce n'est pas votre système de fichiers
  • /dev/sda : le disque qui contient la partition EFI. À adapter s'il est question d'un autre disque
  • -p 1 : le nombre correspondant à la partition EFI (exemple : pour une partition EFI qui serait la /dev/sda2, on utilisera -p 2)

Puis on entre enfin dans le vif du sujet :

efibootmgr -c -g -d /dev/sda -p 1 -L "Arch Linux" -l "\EFI\arch\vmlinuz-arch.efi" -u "root=UUID=uuid_partition_Arch" rootfstype=système_de_fichiers initrd=\EFI\arch\initramfs-arch.img rw add_efi_memmap

On peut désormais redémarrer la machine, qui devrait normalement amorcer directement sur cette nouvelle entrée.

Changer l'ordre de démarrage

Pour voir l'ordre de démarrage courant, on peut utiliser :

efibootmgr | grep BootOrder

En sortie vous devriez avoir des nombres hexadécimaux, qui correspondent chacun à une entrée dans l'UEFI. On peut savoir à quelle entrée correspond chaque nombre avec :

efibootmgr | grep Boot0

Pour changer l'ordre de démarrage, il suffit de classer ces valeurs selon vos désirs :

efibootmgr -o XXX,YYYY,ZZZZ

INFORMATION

Si vous ne précisez qu'une entrée, elle deviendra la valeur par défaut pour le démarrage.

Il est possible de réinitialiser l'ordre de démarrage :

efibootmgr -O

Supprimer des entrées

On peut facilement supprimer une entrée dans l'UEFI avec :

efibootmgr -B -b XXXX

XXXX est la valeur en hexadécimal de l'entrée que vous désirez supprimer.

Changer le délais de démarrage

Il est possible de changer le délais de démarrage avant que l'UEFI n'utilise une entrée :

efibootmgr -t X

X est le temps en secondes.

On peut aussi facilement supprimer ce délais avec :

efibootmgr -T

Pour ceux qui apprécient avoir un démarrage rapide.

Ajouter plus d'options au démarrage

À l'instar d'un chargeur d'amorçage, il est possible de spécifier des options au noyau. Toutes les options du noyau sont spécifiées avec le paramètre -u. Pour l'exemple, par défaut nous avions utilisé cette commande plus haut, les options sont mises en gras sur cette ligne :

efibootmgr -c -g -d /dev/sda -p 1 -L "Arch Linux" -l "\EFI\arch\vmlinuz-arch.efi" -u "root=UUID=uuid_partition_Arch rootfstype=système_de_fichiers initrd=\EFI\arch\initramfs-arch.img rw add_efi_memmap"

Si on veut ajouter une option (telle quiet), on écrira donc :

efibootmgr -c -g -d /dev/sda -p 1 -L "Arch Linux" -l "\EFI\arch\vmlinuz-arch.efi" -u "root=UUID=uuid_partition_Arch rootfstype=système_de_fichiers initrd=\EFI\arch\initramfs-arch.img rw add_efi_memmap quiet"

Ou encore :

efibootmgr -c -g -d /dev/sda -p 1 -L "Arch Linux" -l "\EFI\arch\vmlinuz-arch.efi" -u "root=UUID=uuid_partition_Arch rootfstype=système_de_fichiers initrd=\EFI\arch\initramfs-arch.img rw add_efi_memmap vga=790 splash resume=/dev/sdXY"

Et ainsi de suite.

Sources