Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

Прямая загрузка ядра без загрузчика: EFISTUB и UKI

Сразу к делу: да, Arch Linux загружается без загрузчика. Ядро vmlinuz-linux само по себе UEFI-приложение (EFISTUB), и прошивка запускает его напрямую. Есть два пути: прописать ядро в NVRAM через efibootmgr или собрать Unified Kernel Image (UKI), один файл .efi, внутри которого лежат ядро, initramfs и параметры командной строки. Оба варианта рабочие, UKI удобнее и надёжнее.

Что такое EFISTUB и зачем отказываться от загрузчика?

EFISTUB (EFI boot stub) это встроенный в ядро Linux код. Он превращает vmlinuz-linux в полноценный исполняемый файл UEFI, который прошивка грузит как обычное приложение, без посредников. В Arch Linux эта опция включена по умолчанию (CONFIG_EFI_STUB=y), так что доустанавливать ничего не нужно.

Зачем это нужно? Меньше звеньев в цепочке загрузки: нет GRUB, нет systemd-boot, нет конфигов загрузчика. Если ESP смонтирована в /boot, pacman сразу кладёт свежее ядро на место, и прошивка читает его напрямую. А ещё это первый шаг к UKI и простому Secure Boot.

Но у голого EFISTUB есть минус: параметры ядра хранятся в NVRAM, прямо в записи загрузки. Поменял root=... или добавил resume=..., запись нужно пересоздавать. Некоторые прошивки (Lenovo, Dell) вообще не передают параметры из NVRAM в ядро. Для таких случаев придумали UKI.

Как загрузить ядро напрямую через EFISTUB?

Подготовка

Ядро и initramfs должны лежать на ESP. Проще всего смонтировать ESP в /boot, тогда pacman сам обновляет файлы. Проверь раскладку дисков:

lsblk -f

Запиши UUID корневого раздела и номер ESP-раздела, они понадобятся в команде.

Создание записи в NVRAM

Запись создаётся через efibootmgr. Пример для NVMe-диска, где ESP первый раздел:

efibootmgr --create --disk /dev/nvme0n1 --part 1 \
  --label "Arch Linux" \
  --loader "\vmlinuz-linux" \
  --unicode 'root=UUID=твой-uuid rw initrd=\initramfs-linux.img'

Разбор флагов:

  • --disk /dev/nvme0n1 --part 1: диск и номер ESP-раздела;
  • --label "Arch Linux": имя записи в меню UEFI;
  • --loader "\vmlinuz-linux": путь к ядру на ESP, с обратными слэшами, как требует спецификация UEFI;
  • --unicode '...': параметры ядра. initrd=\initramfs-linux.img передаётся отдельной опцией, путь тоже относительно корня ESP.

Проверь результат:

efibootmgr

Запись Arch Linux появится в списке. Перезагрузись и выбери её в меню UEFI.

Нюанс: efibootmgr не умеет редактировать существующие записи. Поменял параметры ядра, удали старую запись и создай новую:

efibootmgr --delete-bootnum --bootnum 0001

Номер подставь из вывода efibootmgr. Про порядок записей и работу с NVRAM подробнее в статье «Порядок загрузки и NVRAM через efibootmgr».

Если ESP смонтирована не в /boot, а в /efi, pacman не увидит её как каталог ядра. Тогда после каждого обновления копируй vmlinuz-linux и initramfs-linux.img на ESP вручную или повесь pacman-хук, который делает это за тебя. Вариант с /boot проще, поэтому в примерах выше он и используется.

Что такое Unified Kernel Image?

UKI это один самодостаточный файл .efi, в котором собраны загрузочный стаб systemd, ядро, initramfs, параметры командной строки, а при желании микрокод и картинка-заставка. Прошивка или загрузчик запускает этот файл целиком, больше ничего не нужно.

Параметры ядра вшиты внутрь образа, поэтому NVRAM в их передаче не участвует. Это решает проблему капризных прошивок и упрощает Secure Boot: подписываешь один файл, а не связку из трёх. Обновление атомарное: новый UKI пишется рядом со старым, и если что-то пошло не так, старый образ остаётся на месте.

Формат описан в спецификации uapi-group, и его понимают все современные загрузчики: systemd-boot, rEFInd, GRUB. Даже прошивка запускает UKI напрямую, если указать путь к файлу в записи загрузки.

Как собрать UKI через mkinitcpio?

Файл с параметрами ядра

Создай /etc/kernel/cmdline:

echo 'root=UUID=твой-uuid rw quiet' | sudo tee /etc/kernel/cmdline

Здесь root=UUID=... указывает корневой раздел, rw монтирует его на запись, quiet убирает лишний вывод. Для гибернации добавь resume=UUID=... с UUID раздела подкачки. Микрокод и initramfs в этот файл писать не нужно, mkinitcpio добавит их сам.

Настройка preset

Отредактируй /etc/mkinitcpio.d/linux.preset. Раскомментируй строки с default_uki и fallback_uki, а default_image и fallback_image закомментируй, чтобы не плодить лишние initramfs:

# mkinitcpio preset file for the 'linux' package
ALL_config="/etc/mkinitcpio.conf"
ALL_kver="/boot/vmlinuz-linux"

PRESETS=('default' 'fallback')

#default_image="/boot/initramfs-linux.img"
default_uki="/boot/EFI/Linux/arch-linux.efi"
default_options="-c /etc/kernel/cmdline"

#fallback_image="/boot/initramfs-linux-fallback.img"
fallback_uki="/boot/EFI/Linux/arch-linux-fallback.efi"
fallback_options="-S autodetect -c /etc/kernel/cmdline"

Флаг -c /etc/kernel/cmdline говорит mkinitcpio взять параметры из файла. Для fallback-образа можно указать отдельный файл, например без quiet.

Микрокод процессора mkinitcpio подхватывает автоматически: если в /boot лежит intel-ucode.img или amd-ucode.img, он попадёт в образ. Отдельно прописывать его в параметрах не нужно. Картинку-заставку добавляют флагом --splash=/usr/share/systemd/bootctl/splash-arch.bmp в default_options.

Сборка

Создай каталог и пересобери образы:

mkdir -p /boot/EFI/Linux
mkinitcpio -P

-P собирает все пресеты. На выходе получишь /boot/EFI/Linux/arch-linux.efi и fallback-версию. Проверь:

ls -lh /boot/EFI/Linux/

Каждый образ весит примерно как ядро плюс initramfs, обычно больше сотни мегабайт. Учти это при размере ESP.

Как добавить UKI в загрузку?

Через systemd-boot

Проще всего. systemd-boot сам сканирует каталог /boot/EFI/Linux/ и показывает найденные UKI в меню, без файлов записей и ручной настройки. Достаточно установить загрузчик один раз:

bootctl install

Если systemd-boot уже стоит, просто перезагрузись: новый образ появится в меню автоматически. Как перейти на него с GRUB, описано в статье «Смена загрузчика с GRUB на systemd-boot».

Через efibootmgr

UKI запускается и напрямую из прошивки, без загрузчика:

efibootmgr --create --disk /dev/nvme0n1 --part 1 \
  --label "Arch Linux" \
  --loader "\EFI\Linux\arch-linux.efi"

Параметры ядра передавать не нужно, они уже внутри образа.

Есть ещё трюк: положить образ в /boot/EFI/BOOT/BOOTx64.EFI. Это путь по умолчанию, который прошивка проверяет на съёмных носителях. Запись в NVRAM тогда не нужна вовсе, но и выбрать между несколькими системами не получится.

Как обновлять ядро при прямой загрузке?

Пакет linux при установке запускает хуки mkinitcpio. Для обычной схемы они пересобирают initramfs, для UKI пересобирают образы целиком. То же самое делают хуки пакетов intel-ucode и amd-ucode: микрокод обновился, образ пересобрался.

Проверить, что хуки на месте, можно так:

ls /usr/share/libalpm/hooks/ | grep mkinitcpio

Если в выводе есть файлы с именем mkinitcpio, после pacman -Syu образы обновятся сами. Если хуков нет, пересобирай вручную:

mkinitcpio -P

Для голого EFISTUB с ESP в /boot делать ничего не нужно. Запись в NVRAM ссылается на файл \vmlinuz-linux, а pacman перезаписывает его при каждом обновлении. Старый initramfs тоже заменяется, так что мусор не копится. В этом смысле схема с UKI требует больше внимания: старые образы остаются на диске, и за ними нужно следить.

Чем UKI лучше обычной схемы с загрузчиком?

Сравни две схемы. Классика: загрузчик (GRUB или systemd-boot) читает конфиг, находит ядро и initramfs, передаёт параметры. Три файла и два источника правды: конфиг загрузчика и параметры. UKI: один файл, в котором всё уже лежит. Загрузчику остаётся только запустить его.

Плюсы UKI:

  • один файл вместо трёх, легко переносить и подписывать;
  • параметры ядра вшиты, NVRAM не нужна;
  • атомарные обновления: старый образ остаётся до перезагрузки;
  • Secure Boot сводится к подписи одного файла, например через sbctl.

Минусы:

  • ESP нужна просторная, каждый образ занимает больше сотни мегабайт;
  • после обновления ядра образ пересобирается (mkinitcpio -P), хотя pacman-хуки делают это автоматически;
  • параметры меняются только пересборкой, «на лету» их не подправить.

Если Secure Boot для тебя важен, UKI самый удобный путь. Про ключи и подпись через sbctl читай в статье «Secure Boot в Arch Linux через sbctl». А про выбор между загрузчиками читай «systemd-boot против GRUB». Для dualboot с Windows загрузчик всё же удобнее: он сам находит чужие системы. UKI про другое, про один чистый образ своей системы.

Какие подводные камни у прямой загрузки?

Главный из них ESP. На ней должны помещаться все образы, а при нескольких ядрах (linux, linux-lts, linux-hardened) это уже гигабайты. Если ESP маленькая, оставь только нужные пресеты или удали fallback.

Второй момент: после обновления ядра старый UKI остаётся на диске. Хуки пересобирают образ, но не чистят мусор. Раз в пару месяцев заглядывай в /boot/EFI/Linux/ и удаляй лишнее вручную.

Третий: если после перехода на UKI у тебя сломалось разрешение экрана или пропала загрузка, не паникуй. Про разрешение и драйвер simpledrm есть отдельная статья «UKI и разрешение экрана». А вернуть старый загрузчик всегда можно из live-системы через arch-chroot.

Четвёртый: гибернация. Для resume нужен параметр resume=UUID=... в /etc/kernel/cmdline. Забыл его добавить, система не проснётся из swap. В схеме с GRUB параметр живёт в grub.cfg, здесь он вшит в образ, так что правь файл и пересобирай.

Частые вопросы

Можно ли оставить GRUB и добавить UKI в его меню?

Да. GRUB умеет цепочкой запускать UKI как обычный .efi-файл. Но тогда теряется смысл: загрузчик остаётся лишним звеном. Если GRUB нужен для dualboot с Windows, UKI можно держать рядом и выбирать его отдельной записью.

Нужно ли пересобирать UKI после каждого обновления ядра?

Обычно нет. Пакеты linux, intel-ucode/amd-ucode и systemd ставят pacman-хуки, которые запускают mkinitcpio -P автоматически. Если образ не обновился, пересобери вручную той же командой.

Что делать, если после перехода на EFISTUB система не грузится?

Проверь три вещи: путь к ядру в записи NVRAM (обратные слэши, файл на месте), параметры в --unicode (правильный UUID корня) и монтирование ESP в /boot. Если прошивка игнорирует параметры из NVRAM, переходи на UKI, там этой проблемы нет.

Чем fallback-образ отличается от обычного?

Fallback собирается без autodetect, поэтому в initramfs попадают все модули ядра. Он больше и грузится дольше, зато работает, если обычный образ не смог определить твоё железо. Держать его на ESP полезно, но при нехватке места можно удалить.

Как подписать UKI для Secure Boot?

Установи пакет sbctl и подпиши файл одной командой:

sbctl sign /boot/EFI/Linux/arch-linux.efi

Хук sbctl подписывает новые образы автоматически при каждой пересборке. Подписывать нужно именно .efi-файл, а не ядро и initramfs по отдельности, в этом главное удобство UKI.

Полезные ресурсы

Заключение

Прямая загрузка без загрузчика это рабочий и современный способ запуска Arch Linux. Голый EFISTUB через efibootmgr подходит для минималистов, но параметры в NVRAM и капризные прошивки портят картину. UKI через mkinitcpio решает обе проблемы: один файл, вшитые параметры, простой Secure Boot. Начни с /etc/kernel/cmdline и linux.preset, собери образ, и загрузчик станет необязательным. А если что-то пойдёт не так, старый загрузчик всегда можно вернуть из live-системы.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max