Efibootmgr

De Wiki doc

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