Jump to content

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

From ArchWiki

Перевод этой статьи или раздела не отражает оригинальное содержание.

Причина: Очень много орфографических и пунктуационных ошибок. (Discuss)

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-gitAUR. Он также содержит 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/sdX [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 (пример), не применяют изменения, внесённые в запись загрузки, если система не была загружена через отдельную, уже изменённую запись.

См. также