EFISTUB (Français)
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.
Démarrage de EFISTUB
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.
- 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.
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.
- 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
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')
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.