Jump to content
From ArchWiki
État de la traduction: Cet article est la version francophone de EFISTUB. Date de la dernière traduction: 2022-10-03. Vous pouvez aider à synchroniser la traduction s'il y a eu des changements dans la version anglaise.

Related articles

- Arch boot process (Français)
- Unified Extensible Firmware Interface

Le noyau Linux prend en charge le démarrage EFISTUB qui permet aux microprogrammes EFI de charger le noyau comme un exécutable EFI. L'option est activée par défaut sur les noyaux Arch Linux, ou si l'on compile le noyau, on peut l'activer en définissant `CONFIG_EFI_STUB=y` dans la configuration du noyau. Consultez The EFI Boot Stub pour plus d'informations.

Avec EFISTUB, un noyau peut être démarré directement par une carte mère UEFI ou indirectement en utilisant un chargeur d'amorçage. L'utilisation d'un chargeur d'amorçage est recommandée si vous avez plusieurs paires noyau/initramfs et que le menu de démarrage UEFI de votre carte mère n'est pas facile à utiliser.

## Préparation d'EFISTUB

Tout d'abord, vous devez créer une partition système EFI et choisir son mode de montage. Consultez EFI system partition (Français)#Monter la partition pour connaître toutes les options de montage ESP disponibles.

Astuce:

- pacman mettra directement à jour le noyau que le firmware EFI lira si vous montez l'ESP sur `/boot`.
- Vous pouvez garder le noyau et initramfs hors de l'ESP si vous utilisez un gestionnaire de démarrage qui a un pilote pour le système de fichiers de la partition où ils résident, par exemple rEFInd.

## Démarrage de EFISTUB

Astuce: Il existe plusieurs gestionnaires de démarrage UEFI qui peuvent fournir des options supplémentaires ou simplifier le processus de démarrage UEFI - en particulier si vous expérimentez avec les paramètres du noyau ou si vous avez plusieurs noyaux/systèmes d'exploitation. Consultez Arch boot process (Français)#Chargeur d'amorçage pour plus d'informations.
Note: Le chemin d'accès à l'initramfs des noyau Linux EFISTUB doit être relatif à la racine de la partition système EFI et utiliser des antislashes (conformément aux normes EFI). Par exemple, si l'initramfs est situé dans `esp/EFI/arch/initramfs-linux.img`, la ligne formatée UEFI correspondante doit être `initrd=\EFI\arch\initramfs-linux.img`. Dans les exemples suivants, nous supposerons que tout est sous `esp/`.

### Utilisation directe de l'UEFI

UEFI est conçu pour supprimer le besoin d'un chargeur d'amorçage intermédiaire tel que GRUB. Si votre carte mère dispose d'une bonne implémentation de l'UEFI, il est possible d'intégrer les paramètres du noyau dans une entrée d'amorçage UEFI et de permettre à la carte mère d'amorcer directement Arch. Vous pouvez utiliser efibootmgr ou UEFI Shell v2 pour modifier les entrées de démarrage de votre carte mère.

Note:

- Les implémentations UEFI obsolètes peuvent présenter des problèmes de compatibilité avec le noyau Linux. S'il existe une version plus récente de votre UEFI avec des corrections de bogues, envisagez de la flasher avec l'outil recommandé par le fabricant.
- Certains firmwares ne transmettent pas les paramètres de ligne de commande des entrées de démarrage en NVRAM aux binaires EFI. [1] Dans ce cas, le noyau et les paramètres peuvent être combinés dans une image de noyau unifiée, puis créer une entrée de démarrage avec le fichier .efi résultant.

#### efibootmgr

Pour créer une entrée de démarrage avec efibootmgr qui chargera le noyau :

    # efibootmgr --create --disk /dev/sdX --part Y --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXXXXXX rw initrd=\initramfs-linux.img'

ou créer une entrée de démarrage avec efibootmgr et hibernation sur la partition swap :

    # efibootmgr --create --disk /dev/sdX --part Y --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=PARTUUID=XXXXXXXX- XXXX-XXXX-XXXX-XXXXXXXX resume=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXXXXXX rw initrd=\initramfs-linux. img'

Où `/dev/sdX` et `Y` sont le numéro du lecteur et de la partition où se trouve l'ESP. Modifiez les paramètres `root=` et `resume=` pour refléter vos partitions racine et swap Linux.

Note: Consultez les paramètres du noyau pour connaître les formats de noms de périphériques pris en charge, et le nommage persistant des périphériques de type bloc pour savoir comment obtenir la valeur correspondante.

Si elle est omise, la première partition sur `/dev/sda` est utilisée comme ESP.

Notez que l'argument `-u`/{ 'ic|--unicode}} entre guillemets est juste la liste des paramètres du noyau, vous devrez donc peut-être ajouter des paramètres supplémentaires (par exemple pour la suspension sur disque ou microcode).

Après avoir ajouté l'entrée de démarrage, vous pouvez vérifier que l'entrée a été ajoutée correctement avec :

    # efibootmgr --unicode

Pour définir l'ordre de démarrage :

    # efibootmgr --bootorder XXXX, XXXX --unicode

Où XXXX est le numéro qui apparaît dans la sortie de la commande efibootmgr pour chaque entrée.

Astuce:

- https://github.com/de-arl/auto-UEFI-entry est un outil permettant de créer les commandes
- Il est pratique d'enregistrer la commande de création de l'entrée de démarrage dans un script shell, ce qui permet de la modifier plus facilement, par exemple lors de la modification des paramètres du noyau. En faisant cela, pensez à automatiser la suppression des anciennes entrées de démarrage, comme efibootmgr ne prend pas en charge la modification des entrées existantes actuellement.
- Le post du forum international intitulé The linux kernel with build in bootloader ? peut également être intéressant.

#### bcfg

Certaines implémentations UEFI rendent difficile la modification de la NVRAM en utilisant efibootmgr. Si efibootmgr ne parvient pas à créer une entrée, vous pouvez utiliser la commande bcfg dans UEFI Shell v2 (c'est-à-dire à partir de l'iso live Arch Linux).

Tout d'abord, trouvez le numéro du périphérique sur lequel votre ESP réside :

    Shell> map

Dans cet exemple, `1` est utilisé comme numéro de périphérique. Pour lister le contenu de l'ESP :

    Shell> ls FS1 :

Pour afficher les entrées de démarrage actuelles :

    Shell> bcfg boot dump

Pour ajouter une entrée pour votre noyau, utilisez :

    Shell> bcfg boot add N FS1:\vmlinuz-linux "Arch Linux"

Où `N` est l'emplacement où l'entrée sera ajoutée dans le menu de démarrage. 0 est le premier élément de menu. Les éléments de menu déjà existants seront déplacés dans le menu sans être supprimés.

Ajoutez les options du noyau nécessaires en créant un fichier sur votre ESP :

    Shell> edit FS1:\options.txt

Dans ce fichier, ajoutez la ligne de démarrage. Par exemple :

    root=/dev/sda2 ro initrd=\initramfs-linux.img

Note: Ajoutez des espaces supplémentaires au début de la ligne dans le fichier. Il y a une byte order mark au début de la ligne qui écrasera tout caractère à côté, ce qui provoquera une erreur lors du démarrage.

Appuyez sur `F2` pour enregistrer, puis sur `F3` pour quitter.

Ajoutez ces options à votre entrée précédente :

    Shell> bcfg boot -opt N FS1:\options.txt

Répétez ce processus pour toute entrée supplémentaire.

Pour supprimer un élément précédemment ajouté, procédez comme suit

    Shell> bcfg boot rm N

#### kesboot

Vous pouvez également simplifier et automatiser le travail avec EFISTUB en utilisant un script du paquet kesboot-gitAUR. Il contient également un hook de pacman qui peut ajouter et supprimer des variables EFI pendant les actions avec les paquets.

Tout d'abord, installez le paquet, puis configurez le fichier `/etc/kesboot.conf` :

    /etc/kesboot.conf

    CMDLINES=('linux' 'acpi=on'
              linux-zen' 'iommu=off')

Note: Si vous utilisez un hook (les variables `INSTALL_HOOK` et `REMOVE_HOOK`), alors il écrasera le tableau `CMDLINES` à chaque exécution (en préservant le contenu de tous les enregistrements).

Ensuite, exécutez

    # kesboot -u

Le paquet contient également un programme pour la configuration initiale du démarrage EFI. Après avoir monté l'ESP, exécutez

    # /usr/lib/setup-efi-boot

### Utilisation du shell UEFI

Si vous ne voulez pas créer une entrée de démarrage permanente, il est possible de lancer le noyau depuis UEFI Shell puisqu'il s'agit d'une application UEFI normale :

    > FS0 :
    > \vmlinuz-linux root=PARTUUID=3518bb68-d01e-45c9-b973-0b5d918aae96 rw initrd=\initramfs-linux.img

Dans ce cas, les paramètres du noyau sont passés comme des paramètres normaux au fichier noyau EFISTUB lancé.

Pour éviter d'avoir à se souvenir de tous les paramètres du noyau à chaque fois, vous pouvez enregistrer la commande exécutable dans un script shell tel que `archlinux.nsh` sur votre partition système UEFI, puis l'exécuter avec :

    > FS0 :
    > archlinux

#### Utilisation d'un script startup.nsh

Certaines implémentations UEFI ne conservent pas les variables EFI entre les démarrages à froid (par exemple VirtualBox avant la version 6.1) et tout ce qui est défini par l'interface firmware UEFI est perdu à la mise hors tension.

La Specification UEFI Shell 2.0 établit qu'un script appelé `startup.nsh` à la racine de la partition ESP sera toujours interprété et peut contenir des instructions arbitraires ; parmi celles-ci vous pouvez définir une ligne de chargement pour l'amorçage. Assurez-vous de monter la partition ESP sur `/boot` et de créer un script `startup.nsh` qui contient une ligne de chargement du noyau. Par exemple :

    vmlinuz-linux rw root=/dev/sdX [rootfs=myfs] [rootflags=myrootflags] \
     [kernel.flag=foo] [mymodule.flag=bar] \
     [initrd=\intel-ucode.img] initrd=\initramfs-linux.img

Cette méthode fonctionnera avec presque toutes les versions du firmware UEFI que vous pouvez rencontrer dans du matériel réel, vous pouvez l'utiliser en dernier recours. Le script doit être une seule longue ligne. Les sections entre parenthèses sont facultatives et données uniquement à titre indicatif. Les sauts de ligne de style Shell ne sont donnés que pour une clarification visuelle. Les systèmes de fichiers FAT utilisent la barre oblique inverse comme séparateur de chemin et dans ce cas, la barre oblique inverse déclare que l'initramfs est situé à la racine de la partition ESP. Seul le microcode Intel est chargé dans la ligne des paramètres d'amorçage ; le microcode AMD est lu sur le disque plus tard pendant le processus de démarrage ; ceci est fait automatiquement par le noyau.

## Dépannage

### Les entrées de démarrage sont retirées de manière aléatoire

Certaines cartes mères peuvent supprimer les entrées de démarrage en raison d'un manque d'espace libre dans la NVRAM au lieu de donner une erreur à la création. Pour éviter que cela ne se produise, réduisez la quantité d'entrées de démarrage ajoutées par efibootmgr en minimisant votre processus de création d'entrées, ainsi que la quantité d'entrées de démarrage automatique du lecteur par le Compatibility Support Module (CSM) en le désactivant dans vos paramètres UEFI. Consultez [2].

### EFISTUB ne fonctionne pas sur certains systèmes Dell

Plusieurs générations de microprogrammes Dell transmettent mal les arguments au chargeur d'amorçage, ce qui fait que EFISTUB analyse une ligne de commande nulle, ce qui entraîne normalement un système non amorçable (consultez la discussion complète dans linux-efi).

Une solution de contournement a été trouvée depuis Linux 5.10 pour corriger ce comportement (consultez ce commit ). Pour Linux < 5.10, vous pouvez utiliser un empaqueteur efi comme arch-efiboot, ou un autre chargeur d'amorçage.

### Les modifications des entrées de démarrage ne sont pas appliquées

Certaines cartes mères, telles que les cartes Asus de l'ère Haswell (comme rencontré sur le forum français), ne remarqueront pas les modifications des entrées de démarrage à moins que le système ne soit démarré avec une autre entrée de démarrage préexistante avant de démarrer l'entrée EFISTUB mise à jour.

## Voir aussi

- Documentation du noyau Linux sur EFISTUB
- Commit dans Git pour EFISTUB dans le noyau Linux
- Page de Rod Smith sur EFISTUB

Category:

- Boot loaders (Français)