EFI boot stub (Русский)

Перевод
этой статьи или раздела не отражает оригинальное содержание.
Причина:
Очень много орфографических и пунктуационных ошибок. (
Discuss
)
Related articles
Arch boot process
Unified Extensible Firmware Interface
Unified kernel image
EFI boot stub
(или
EFI stub
) — это ядро, которое выступает как исполняемый файл EFI, то есть может быть загружено напрямую из UEFI.
Исторически эта статья и статья
Debian Wiki
использовали термин, записанный как одно слово (EFISTUB или EFIStub).
По умолчанию ядра Arch Linux уже выступают в роли EFI boot stub. Если вы
компилируете ядро
, активируйте это с помощью параметра
CONFIG_EFI_STUB=y
. См.
The EFI Boot Stub
для получения дополнительной информации.
Перед тем как продолжить, вам потребуется
системный раздел EFI
и необходимо
выбрать способ его монтирования
.
Tip
pacman
будет напрямую обновлять ядро так, чтобы UEFI могло его читать, если вы примонтировали ESP к
/boot
.
EFI boot stub также может быть загружен не напрямую, а через
загрузчик
:
Существует несколько UEFI-менеджеров загрузки, которые могут предоставить дополнительные настройки или упростить процесс загрузки через UEFI.
Это особенно полезно, если вы экспериментируете с
параметрами ядра
или используете несколько ядер/операционных систем, а меню загрузки материнской платы недостаточно удобно для практического использования.
Менеджер загрузки, имеющий драйвер файловой системы для раздела, где расположены ядро и initramfs (например,
rEFInd
), позволяет не хранить их все в ESP.
Альтернатива: Унифицированный образ ядра
Унифицированный образ ядра
(УОЯ, или же UKI — unified kernel image) — это ядро с EFI Stub, как и стандартное ядро Arch Linux, однако оно также содержит initramfs и параметры загрузки в одном файле. В приведённой ниже таблице показан список возможностей EFI stub, не являющегося UKI, в сравнении с UKI в ситуации, когда оба загружаются напрямую из UEFI.
EFI stub который не есть UKI
Унифицированный образ ядра
initramfs
Отдельный файл, хранящийся в
ESP
Включено в ядро
boot option
Хранится как переменная UEFI
Включено в ядро
Если нет весомых причин не использовать UKI, то унифицированный образ ядра является более простым решением, поскольку требует всего один файл, содержащий всё необходимое для загрузки. Однако при использовании неунифицированного ядра вы можете, например, переключаться между разными ядрами или пробовать различные параметры загрузки для одного и того же образа ядра. В случае с UKI каждое изменение параметров или желание попробовать новое ядро приводит к необходимости создавать отдельный новый образ.
Загрузка через EFI boot stub
Note
Путь к initramfs для ядра EFI boot stub должен быть обязательно связан с корнем системного раздела EFI и использовать обратные слеши (бэкслеши) в соответствии со стандартами EFI. Например, если initramfs находится в
esp
/EFI/arch/initramfs-linux.img
, соответствующая строка по стандартам UEFI будет выглядеть так:
initrd=\EFI\arch\initramfs-linux.img
. Во всех следующих примерах будет предполагаться, что всё расположено в каталоге
esp
/
.
Использование UEFI напрямую
UEFI создано для того, чтобы устранить необходимость в посреднике в виде
загрузчика
, например
GRUB
. Если ваша материнская плата имеет хорошую поддержку UEFI, существует возможность настроить все параметры в одной записи загрузки UEFI, чтобы система загружала Arch Linux напрямую. Для модификации записей загрузки вы можете использовать
efibootmgr
или UEFI Shell v2.
Note
Устаревшая реализация UEFI может иметь проблемы совместимости с ядром Linux. Если доступна более новая версия прошивки UEFI с исправлениями ошибок, рекомендуется обновить её с помощью инструментов, предоставляемых производителем материнской платы.
Этот способ может не поддерживаться: некоторые производители (в основном ноутбуки
Lenovo
и
Dell
) не передают параметры командной строки из записей загрузки NVRAM в EFI. (См.
этот пост 2014 года на форуме Arch Linux
.) В таком случае может быть использован
унифицированный образ ядра
.
efibootmgr
Чтобы создать запись загрузки с помощью
efibootmgr
, которая будет загружать ядро, выполните соответствующую команду:
# efibootmgr --create --disk
/dev/sdX
--part
Y
--label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=
block_device_identifier
rw initrd=\initramfs-linux.img'
Где
/dev/sdX
и
Y
— это диск и номер раздела, на котором расположен ESP, а параметры
root=
указывают на корневой раздел Linux.
Note
См.
параметры ядра
для поддерживаемых форматов имён устройств и
постоянное именование блочных устройств
, чтобы узнать, как получить необходимые значения. Примеры параметров ядра для блочных устройств приведены в статье
Persistent block device naming#Kernel parameters
.
Если параметр
--part
не указан, то первый раздел на
/dev/sda
будет использоваться как ESP.
Учтите, что аргумент
-u
/
--unicode
, заключённый в кавычки, представляет собой список
параметров ядра
, поэтому, скорее всего, вам потребуется добавить дополнительные параметры (например, для
гибернации
).
Пример для ядра Linux LTS, диска NVMe, файловой системы Btrfs со специальным подтомом и гибернацией на swap-разделе:
# efibootmgr --create \
 --disk /dev/nvme0n1 --part 1 \
 --label "EFISTUB Arch" \
 --loader /vmlinuz-linux-lts \
 --unicode 'root=UUID=01a40dd8-28f0-4636-be1e-aeed60c98095 resume=UUID=2d877d5d-4ca1-4d46-a3d6-b6ee94cbbd78 rw rootflags=subvol=@ loglevel=3 quiet initrd=\initramfs-linux-lts.img'
Для просмотра списка всех записей загрузки, изменения их порядка и удаления см.
efibootmgr
.
Tip
Вы можете упростить и автоматизировать этот процесс с помощью пакета
kesboot-git
AUR
. Он также содержит
pacman-хук
, который добавляет или удаляет записи EFI в соответствии с действиями, выполняемыми с пакетами.
https://github.com/de-arl/auto-UEFI-entry
— bash-хелпер для создания команд.
Рекомендуется сохранить команду создания записи загрузки в shell-скрипт, что упростит её последующую модификацию (например, при изменении параметров ядра). Однако при этом следует учитывать, что старые записи загрузки необходимо удалять вручную, так как
efibootmgr
в настоящее время
не поддерживает редактирование уже созданных записей загрузки
.
Вам также может быть интересен этот форумный пост:
"Ядро Linux со встроенным загрузчиком"
.
bcfg
Некоторые реализации UEFI могут усложнять процесс редактирования NVRAM с помощью
efibootmgr
. Если
efibootmgr
не может корректно создать запись загрузки, вы также можете использовать команду
bcfg
в UEFI Shell v2 (доступной, в том числе, из
ISO Arch Linux
).
Сначала найдите номер устройства, на котором расположен раздел
ESP
:
Shell> map
В этом примере
1
будет использоваться как номер устройства. Чтобы вывести содержимое
ESP
, используйте команду:
Shell> ls FS1:
Чтобы просмотреть все текущие записи загрузки:
Shell> bcfg boot dump
Чтобы добавить запись для вашего ядра, используйте:
Shell> bcfg boot add
N
FS1:\vmlinuz-linux "Arch Linux"
N
— это позиция записи в меню загрузки.
0
— самая первая строка в меню. Уже существующие записи будут автоматически сдвинуты в соответствии с новой записью и не будут повреждены или перезаписаны.
Вы можете добавить параметры ядра напрямую:
Shell> bcfg boot -opt
N
"root=/dev/sda2 initrd=\initramfs-linux.img"
Или с помощью создания файла на ESP:
Shell> edit FS1:\options.txt
В этом файле добавьте строку загрузки, например:
root=/dev/sda2 rw initrd=\initramfs-linux.img
Note
Добавьте несколько пробелов в начале строки в этом файле. В начале строки присутствует
маркер порядка байтов
, который может стереть первый символ строки и привести к ошибкам во время загрузки..
Нажмите
F2
, чтобы сохранить файл, и
F3
, чтобы выйти.
Добавьте следующие параметры к ранее созданной записи загрузки:
Shell> bcfg boot -opt
N
FS1:\options.txt
Повторите этот процесс для любых других записей.
Чтобы удалить ранее добавленную запись загрузки, используйте:
Shell> bcfg boot rm
N
Использование UEFI Shell
Если вы не хотите создавать постоянную запись загрузки, вы можете запустить ядро напрямую из UEFI Shell, так как оно является стандартным приложением UEFI:
> FS0:
> \vmlinuz-linux root=PARTUUID=3518bb68-d01e-45c9-b973-0b5d918aae96 rw initrd=\initramfs-linux.img
В этом случае параметры ядра будут переданы как обычные аргументы вашему EFI boot stub-ядру.
Чтобы не запоминать все параметры ядра каждый раз, вы также можете сохранить эту команду в shell-скрипт, например
archlinux.nsh
, на системном разделе EFI, а затем запускать его следующим образом:
> FS0:
> archlinux
Использование скрипта startup.nsh
Некоторые системы UEFI не сохраняют значения переменных EFI между холодными загрузками (например,
VirtualBox
до версии 6.1), и всё, что было настроено через UEFI, будет утеряно после выключения системы.
В
спецификации UEFI Shell 2.0
описан скрипт с именем
startup.nsh
, который, будучи размещённым в корне раздела ESP, всегда интерпретируется при запуске и может содержать необходимые команды и инструкции. С его помощью можно задать все параметры загрузки. Убедитесь, что раздел ESP смонтирован в каталог
/boot
, и создайте файл
startup.nsh
, содержащий параметры ядра для загрузки, например:
vmlinuz-linux rw root=/dev/sd
X
[rootfs=
myfs
] [rootflags=
myrootflags
] \
 [kernel.flag=
foo
] [
mymodule
.flag=
bar
] \
 initrd=\initramfs-linux.img
Этот метод работает почти со всеми версиями UEFI, встречающимися на реальном оборудовании, и может использоваться как крайний вариант.
Скрипт должен состоять из одной длинной строки.
Части в квадратных скобках являются необязательными и приведены только для наглядности. Переносы строк в стиле shell используются исключительно для улучшения читаемости. Файловая система FAT использует обратные слеши как разделители путей (например,
\EFI\Linux\bootx86.efi
), и в данном случае обратный слеш указывает на то, что initramfs расположен в корне раздела ESP.
Полезные советы
Аварийный кран
Без загрузчика командная строка ядра не может быть изменена во время загрузки. Чтобы иметь хотя бы какой-то аварийный вариант (например, для использования
initramfs-linux-fallback.img
и/или загрузки без микрокода, соответствующего вашему процессору), создайте дополнительную запись загрузки с помощью
efibootmgr
, например с именем "Arch Linux fallback", и укажите в ней необходимые параметры.
Archiso на ESP
Разместить полный образ Arch Linux на ESP, чтобы всегда иметь его под рукой на случай непредвиденных ситуаций, вполне возможно. По состоянию на
2026.01.15
релиз требует около 1.4ГБ дискового пространства.
Первое. Скачайте
archlinux-YYYY.MM.DD-x86_64.iso
.
Затем создайте каталог для archiso на разделе ESP:
# mkdir -p
esp
/EFI/archiso
Распакуйте содержимое каталога
arch
в этот каталог:
# bsdtar -v -x --no-same-permissions --strip-components 1 -f archlinux-
YYYY
.
MM
.
DD
-x86_64.iso -C
esp
/EFI/archiso arch
После этого создайте запись загрузки с помощью
efibootmgr
. Замените следующие значения:
diskpath
это пусть к устройству (например /dev/sda)
diskpart
это номер раздела
# efibootmgr --create --disk
diskpath
\
--part
diskpart
\
--label "Arch (rescue system)" \
--loader '\EFI\archiso\boot\x86_64\vmlinuz-linux' \
--unicode 'archisobasedir=/EFI/archiso archisosearchfilename=/EFI/archiso/boot/x86_64/vmlinuz-linux initrd=\EFI\archiso\boot\x86_64\initramfs-linux.img'
Теперь вы можете загружать резервную систему напрямую через меню загрузки UEFI.
Решение проблем
Правки в записи загрузки не применяются
Некоторые материнские платы, например модели ASUS эпохи Haswell (
пример
), не применяют изменения, внесённые в запись загрузки, если система не была загружена через отдельную, уже изменённую запись.
См. также
Документация ядра Линукс - EFI Boot Stub - The EFI Boot Stub
Коммит ядра Линукс - x86, efi: поддержка EFI boot stub
Род Смит - Использование загрузчика EFI Boot Stub для ядра Линукс