EFI Boot Stub

De ArchwikiFR
(Redirigé depuis EFISTUB)
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).

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 chargeur de démarrage (GRUB, Lilo, Syslinux...), aussi appelé bootloader, c'est-à-dire qu'après le 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.


Prérequis

Contrairement au BIOS qui charge le bootloader depuis le MBR du disque, l'UEFI, lui, charge les fichiers placés dans la partition prévue à cette effet, l'ESP.

Se référer à la page ESP pour la création de l'ESP, le montage de l'ESP, et la mise en place des fichiers nécessaires dans l'ESP.

Mise en place de l'entrée pour l'UEFI

Chargement des modules nécessaires

Avant toute chose, il faudra charger le module efivarfs, sans cela la suite ne pourra pas fonctionner.

modprobe efivarfs

Si cela ne fonctionne pas, assurez-vous que vous ayez bien démarré en mode dit "EFI" et non en mode "BIOS".

Installation d'efibootmgr

Maintenant nous avons besoin de créer l'entrée de boot qu'utilisera l'UEFI pour charger le noyau directement sans passer par un bootloader. Nous utiliserons efibootmgr, mais il faut d'abord l'installer si ce n'est pas le cas :

pacman -S efibootmgr

Création de l'entrée

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

blkid
Note : La commande va retourner plusieurs UUID en général, exemple :
$ blkid
[...]
/dev/sdaX: LABEL="Boot" UUID="une_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" 
[...]
Il est important de ne pas se tromper de partition et d'UUID. À ne pas confondre UUID avec PARTUUID !

On aura donc besoin des 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 :

Attention : efibootmgr peut ne rien faire lorsque vous essayez de créer de nouvelles entrées. Il existe cependant deux solutions pour résoudre ce problème : ajouter le paramètre efi_no_storage_paranoia au noyau avant de le démarrer, ou bien vous pouvez supprimer les fichiers /sys/firmware/efi/efivars/dump-*, s'ils existent, puis redémarrer. Voir le rapport de bug #34641 pour davantages d'informations.
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, ou bien on peut en apprendre un peu plus sur efibootmgr.

Cas du microcode d'Intel

Attention : Depuis Linux 3.17-2 ainsi que Linux-LTS 3.14.21-2 (et supérieurs), la mise à jour du microcode d'Intel n'est plus faite automatiquement (voir le wiki (en)).

Il faut d'abord copier le nouveau ramdisk dans l'ESP :

cp /boot/intel-ucode.img /boot/efi/EFI/arch/intel-ucode.img

Puis il faut modifier la ligne de boot pour ajouter un nouvel initrd, comme ceci :

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\intel-ucode.img initrd=\EFI\arch\initramfs-arch.img rw add_efi_memmap"

Il est impératif de placer intel-ucode.img avant initramfs-arch.img.

Pour aller plus loin avec efibootmgr

Changer l'ordre de démarrage

Pour voir l'ordre de boot courant, on peut utiliser :

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 :

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 :

efibootmgr -o XXX,YYYY,ZZZZ

Il est possible de réinitialiser l'ordre de boot :

efibootmgr -O

Supprimer des entrées

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

efibootmgr -B -b XXXX

Où XXXX est la valeur en héxadécimal de l'entrée que vous désirez supprimer.

Changer le timeout

Il est possible de changer le timeout avant que l'UEFI ne démarre :

efibootmgr -t X

Où X est le temps en secondes.

On peut aussi facilement supprimer ce timeout avec :

efibootmgr -T

Pour ceux qui apprécient avoir un boot rapide.

Ajouter plus d'options au boot

À 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 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.