Utiliser GRUB pour paramétrer le processus de démarrage avec UEFI

Désactiver le Secure Boot

BLFS ne propose pas les paquets essentiels pour prendre en charge Secure Boot. Pour paramétrer le processus de démarrage avec GRUB et UEFI dans BLFS, Secure Boot doit être désactivé dans l'interface de configuration du micrologiciel. Lisez la documentation fournie par le fabriquant de votre système pour trouver comment faire.

Configuration du noyau pour la prise en charge de l'UEFI

Activez les options suivantes dans la configuration du noyau et recompilez le noyau si nécessaire :

Processor type and features --->
  [*] EFI runtime service support                                          [EFI]
  [*]   EFI stub support                                              [EFI_STUB]

-*- Enable the block layer --->                                          [BLOCK]
  Partition Types --->
    [ /*] Advanced partition selection                      [PARTITION_ADVANCED]
    [*]     EFI GUID Partition support                           [EFI_PARTITION]

Device Drivers --->
  Firmware Drivers --->
    [*] Mark VGA/VBE/EFI FB as generic system framebuffer       [SYSFB_SIMPLEFB]
  Graphics support --->
    <*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
                                                                      ...  [DRM]
      [*] Enable legacy fbdev support for your modesetting driver
                                                      ...  [DRM_FBDEV_EMULATION]
      <*> Simple framebuffer driver                              [DRM_SIMPLEDRM]
    Console display driver support --->
      [*] Framebuffer Console support                      [FRAMEBUFFER_CONSOLE]

File systems --->
  DOS/FAT/EXFAT/NT Filesystems --->
    <*/M> VFAT (Windows-95) fs support                                 [VFAT_FS]
  Pseudo filesystems --->
    <*/M> EFI Variable filesystem                                    [EFIVAR_FS]
  -*- Native language support --->                                         [NLS]
    <*/M> Codepage 437 (United States, Canada)                [NLS_CODEPAGE_437]
    <*/M> NLS ISO 8859-1  (Latin 1; Western European Languages)  [NLS_ISO8859_1]

Voici la signification des options de configuration :

CONFIG_PARTITION_ADVANCED

Si cette option n'est pas activée, CONFIG_EFI_PARTITION sera automatiquement activée. Mais si elle est activée, vous devez activer CONFIG_EFI_PARTITION quand même.

CONFIG_SYSFB_SIMPLEFB, CONFIG_DRM, CONFIG_DRM_FBDEV_EMULATION, CONFIG_DRM_SIMPLEDRM, CONFIG_FB et CONFIG_FRAMEBUFFER_CONSOLE

La combinaison de ces options fournit la prise en charge de la console linux sur le framebuffer UEFI. Pour permettre au noyau d'afficher des messagesqde débogage tôt dans le processus de démarrage, elles ne devraient pas être construites en tant que modules à moins que vous n'utilisiez un initramfs.

Créer un disque de démarrage d'urgence

Assurez-vous qu'un disque de démarrage d'urgence est prêt pour « secourir » le système au cas où le système ne puisse démarrer. Pour créer un disque de démarrage d'urgence avec GRUB pour un système EFI, trouvez un clé USB libre et créez un système de fichiers vfat dessus. Installez d'abord dosfstools-4.2, puis en tant qu'utilisateur root :

[Avertissement]

Avertissement

La commande suivante supprimera tous les répertoires et fichiers de la partition. Assurez-vous que votre clé USB ne contient aucune donnée requise, et remplacez sdx1 par le nœud de périphérique correspondant à la première partition de la clé USB. Faites attention à ne pas écraser votre disque dur à cause d'une coquille !

mkfs.vfat /dev/sdx1

Toujours en tant qu'utilisateur root, utilisez l'utilitaire fdisk pour faire de la première partition de la clé USB une partition « EFI system » (remplacez sdx par le nœud de périphérique correspondant à votre clé USB) :

fdisk /dev/sdx

Welcome to fdisk (util-linux 2.39.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): t
Partition number (1-9, default 9): 1
Partition type or alias (type L to list all): uefi
Changed type of partition 'Linux filesystem' to 'EFI System'.

Command (m for help): w
The partition table has been altered.
Syncing disks.

Toujours en tant qu'utilisateur root, créez un point de montage pour la partition EFI sur la clé USB et montez-la :

mount --mkdir -v -t vfat /dev/sdx1 -o codepage=437,iocharset=iso8859-1 \
      /mnt/rescue

Installez GRUB pour EFI sur la partition :

grub-install --target=x86_64-efi --removable \
             --efi-directory=/mnt/rescue --boot-directory=/mnt/rescue

Démontez la partition :

umount /mnt/rescue

Maintenant vous pouvez utiliser la clé USB comme un disque de démarrage d'urgence sur la plateforme UEFI x86-64. Pour apprendre à choisir cette clé USB comme périphérique de démarrage, lisez le manuel de votre carte mère ou de votre ordinateur portable. Elle démarrera le système et affichera le shell de GRUB. Ensuite vous pourrez taper des commandes pour démarrer votre système d'exploitation sur votre disque dur.

Trouver ou créer la partition EFI système

Sur les systèmes EFI, les chargeurs d'amorçage sont installés dans une partition FAT32 spéciale appelée partition EFI système (ESP). Si votre système prend EFI en charge, et qu'une version récente de Linux ou Windows est pré-installée, il est probable que l'ESP soit déjà créée. En tant qu'utilisateur root, listez toutes les partitions de votre disque dur (remplacez sda par le périphérique correspondant au disque dur approprié) :

fdisk -l /dev/sda

La colonne « Type » de l'ESP devrait être EFI System.

Si le système ou le disque dur est neuf, ou si c'est la première installation d'un système UEFI sur le système, l'ESP n'existe peut-être pas. Dans ce cas, installez d'abord dosfstools-4.2. Créez ensuite une nouvelle partition, mettez un système de fichier vfat dessus et indiquez « EFI system » comme type de partition. Voir les instructions sur le périphérique de démarrage d'urgence plus haut pour référence.

[Avertissement]

Avertissement

Certaines (vieilles) implémentations UEFI peuvent demander que l'ESP soit la première partition du disque.

Maintenant, en tant qu'utilisateur root, créez le point de montage pour l'ESP et montez-la (remplacez sda1 par le nœud de périphérique correspondant à l'ESP) :

mount --mkdir -v -t vfat /dev/sda1 -o codepage=437,iocharset=iso8859-1 \
      /boot/efi

Si vous voulez monter l'ESP automatiquement pendant le démarrage du système, en tant qu'utilisateur root, ajoutez une entrée pour l'ESP dans /etc/fstab :

cat >> /etc/fstab << EOF
/dev/sda1 /boot/efi vfat codepage=437,iocharset=iso8859-1 0 1
EOF

Configuration de démarrage minimale avec GRUB et EFI

Sur les systèmes basés sur UEFI, GRUB fonctionne en installant une application EFI (un type d'exécutable spécial) dans l'ESP. Le micrologiciel EFI recherchera les chargeurs d'amorçage dans les applications EFI à partir des entrées de démarrage enregistrées dans les variables EFI, en plus d'un chemin codé en dur, EFI/BOOT/BOOTX64.EFI. Normalement, un chargeur d'amorçage devrait être installé dans un chemin personnalisé et le chemin devrait être enregistré dans les variables EFI. L'utilisation du chemin codé en dur est à éviter le plus possible. Cependant, dans certains cas nous devons utiliser le chemin codé en dur :

  • Le système n'est pas encore démarré avec EFI, ce qui rend les variables EFI inaccessibles.

  • Le micrologiciel EFI est en 64 bits mais le système LFS en 32 bits, ce qui rend les variables EFI inaccessibles car le noyau ne peut pas invoquer les services EFI à l'exécution avec une longueur d'adressage virtuel différente.

  • LFS est construit pour une Live USB, donc nous ne pouvons pas nous reposer sur les variables EFI qui sont stockées en NVRAM ou EEPROM sur la machine locale.

  • Vous ne pouvez pas ou ne voulez pas installer efibootmgr pour manipuler les entrées de démarrage dans les variables EFI.

Dans tous ces cas, suivez ces instructions pour installer l'application EFI GRUB dans le chemin codé en dur et créer une configuration de démarrage minimale. Sinon, il vaut mieux passer cette section et lire les sections restantes pour paramétrer la configuration de démarrage normalement.

Pour installer GRUB avec une application EFI installée dans le chemin codé en dur EFI/BOOT/BOOTX64.EFI, assurez-vous d'abord que la partition de démarrage est montée dans /boot et l'ESP est monté dans /boot/efi. Puis en tant qu'utilisateur root, lancez la commande :

[Note]

Note

La commande remplacera /boot/efi/EFI/BOOT/BOOTX64.EFI. Elle peut casser un chargeur d'amorçage déjà installé. Sauvegardez-le si vous n'êtes pas sur·e.

grub-install --target=x86_64-efi --removable

Cette commande installera l'application EFI GRUB dans le chemin codé en dur /boot/efi/EFI/BOOT/BOOTX64.EFI, pour que le micrologiciel EFI puisse le trouver et le charger. Les fichiers GRUB restants sont installés dans le répertoire /boot/grub et sera chargé par BOOTX64.EFI au démarrage du système.

[Note]

Note

Le micrologiciel EFI préfère les applications EFI avec le chemin enregistré dans les entrées de démarrage stockées dans les variables EFI à l'application EFI dans le chemin codé en dur. Vous devrez alors peut-être invoquer le menu de sélection de démarrage ou l'interface de configuration du micrologiciel pour choisir le GRUB nouvellement installé au prochain démarrage. Consultez le manuel de votre carte mère ou de votre ordinateur portable pour trouver comment.

Si vous avez suivi les instructions de cette section et paramétrez une configuration de démarrage minimale, sautez maintenant à « Créer le fichier de configuration GRUB ».

Monter le système de fichiers des variables EFI

L'installation de GRUB sur une plateforme UEFI demande que le système de fichiers des variables EFI, efivarfs soit monté. En tant qu'utilisateur root, montez-le s'il n'est pas encore monté :

mountpoint /sys/firmware/efi/efivars || mount -v -t efivarfs efivarfs /sys/firmware/efi/efivars

Maintenant ajoutez une entrée pour efivarfs dans /etc/fstab pour qu'il soit monté automatiquement au démarrage du système :

cat >> /etc/fstab << EOF
efivarfs /sys/firmware/efi/efivars efivarfs defaults 0 0
EOF
[Avertissement]

Avertissement

Si le système n'est pas démarré avec UEFI, le répertoire /sys/firmware/efi n'existera pas. Dans ce cas vous devriez démarrer le système en mode UEFI avec le disque de démarrage d'urgence ou en utilisant la configuration de démarrage minimale créée plus haut, puis monter efivarfs et continuer.

Mettre en place la configuration

Sur les systèmes UEFI, GRUB fonctionne en installant une application EFI (un type d'exécutable spécial) dans /boot/efi/EFI/[id]/grubx64.efi, où /boot/efi est le point de montage de l'ESP et [id] est remplacé par un identifiant spécifié à la ligne de commande grub-install. GRUB créera une entrée dans les variables EFI contenant le chemin EFI/[id]/grubx64.efi pour que le micrologiciel puisse trouver grubx64.efi et le charger.

grubx64.efi est très léger (136 Ko pour GRUB-2.06) donc il n'utilisera pas beaucoup de place dans l'ESP. Une taille typique d'ESP est 100 Mo (pour le chargeur d'amorçage de Windows, qui prend environ 50 Mo dans l'ESP). Une fois grubx64.efi chargé par le micrologiciel, il chargera les modules GRUB dans la partition de démarrage. L'emplacement par défaut est /boot/grub.

En tant qu'utilisateur root, installez les fichiers de GRUB dans /boot/efi/EFI/LFS/grubx64.efi et /boot/grub. Ensuite paramétrez l'entrée de démarrage dans les variables EFI :

grub-install --bootloader-id=LFS --recheck

Si l'installation se passe correctement, la sortie devrait être :

Installing for x86_64-efi platform.
Installation finished. No error reported.

Tapez efibootmgr | cut -f 1 pour revérifier la configuration de démarrage EFI. Voici un exemple de sortie :

BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 0005,0000,0002,0001,0003,0004
Boot0000* ARCH
Boot0001* UEFI:CD/DVD Drive
Boot0002* Windows Boot Manager
Boot0003* UEFI:Removable Device
Boot0004* UEFI:Network Device
Boot0005* LFS

Remarquez que 0005 est en premier dans BootOrder et que Boot0005 est LFS. Cela signifie qu'au prochain démarrage, la version de GRUB installée par LFS sera utilisée pour démarrer le système.

Création du fichier de configuration de GRUB

Générez /boot/grub/grub.cfg pour configurer le menu de démarrage de GRUB :


cat > /boot/grub/grub.cfg << EOF
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5

insmod part_gpt
insmod ext2
set root=(hd0,2)

insmod efi_gop
insmod efi_uga
if loadfont /boot/grub/fonts/unicode.pf2; then
  terminal_output gfxterm
fi

menuentry "GNU/Linux, Linux 6.10.5-lfs-12.2" {
  linux   /boot/vmlinuz-6.10.5-lfs-12.2 root=/dev/sda2 ro
}

menuentry "Firmware Setup" {
  fwsetup
}
EOF

Consultez le livre LFS pour apprendre la base du fichier grub.cfg. Vous devez remplacer (hd0,2), sda2 et 6.10.5-lfs-12.2 pour correspondre à votre configuration.

Les directives insmod efi_gop et insmod efi_uga chargent deux modules pour la prise en charge de l'affichage basé sur EFI. Sur la plupart des systèmes le module efi_gop suffit. Le module efi_uga n'est utile que pour les anciens systèmes, mais le charger ne pose aucun problème. La prise en charge de l'affichage est nécessaire pour que la directive terminal_output gfxterm fonctionne vraiment.

La directive terminal_output gfxterm change la résolution de l'affichage du menu GRUB pour correspondre à votre écran. Elle cassera le rendu si le fichier de données de polices unicode.pf2 n'est pas chargé, donc elle est encadrée par une directive if.

[Note]

Note

Du point de vu de GRUB, les fichiers sont relatifs à la partition utilisée. Si vous utilisez une partition /boot séparée, supprimez /boot dans les chemins précédents (vers le noyau et vers unicode.pf2). Vous devrez aussi changer la ligne « set root » pour pointer vers la partition de démarrage.

L'entrée Firmware Setup peut être utilisée pour entrer dans l'interface de configuration fournie par le micrologiciel (parfois nommée « configuration BIOS »).

Démarrage double avec Windows

Ajoutew une entrée de menu pour Windows dans grub.cfg :

cat >> /boot/grub/grub.cfg << EOF
# Begin Windows addition

menuentry "Windows 11" {
  insmod fat
  insmod chain
  set root=(hd0,1)
  chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
EOF

Vous devriez remplacer (hd0,1) par le nom désigné par GRUB pour l'ESP. Vous pouvez utiliser la directive chainloader pour dire à GRUB de lancer un autre exécutable EFI, dans ce cas le gestionnaire de démarrage de Windows. Vous pouvez ajouter des outils supplémentaires au format exécutable EFI (par exemple un shell EFI) dans l'ESP et leur créer des entrées GRUB.