ОС

Почему кастомное ядро Ubuntu не загружается с Secure Boot?

Кастомное ядро Ubuntu с UKI подписано sbctl, но при Secure Boot не доходит до LUKS-пароля. Диагностика: dmesg, sbctl status, подпись модулей, MOK-регистрация. Пошаговое исправление для полной цепочки доверия.

Почему кастомное ядро Ubuntu не загружается с включённым Secure Boot?

Скомпилировал ядро Ubuntu с полностью отключённым режимом lockdown, создал из него UKI (Unified Kernel Image) и подписал своим ключом Secure Boot с помощью sbctl. Без Secure Boot ядро успешно загружается, запрашивает пароль LUKS и расшифровывает диск. С включённым Secure Boot проверка подписи UKI проходит успешно, но загрузка не доходит даже до ввода пароля LUKS. В чём может быть проблема и как это исправить?

Проблема с кастомным ядром Ubuntu при включённом Secure Boot обычно кроется в неподписанных модулях initramfs или незарегистрированных ключах MOK — даже если UKI прошёл проверку подписи через sbctl, ядро не дойдёт до запроса LUKS-пароля без верификации всех компонентов. Без Secure Boot всё работает, потому что lockdown отключён и нет цепочки доверия. Быстро проверьте dmesg на ошибки вроде “module not signed” и зарегистрируйте ключи mokutil — это решает 90% таких случаев.


Содержание


Почему Secure Boot тормозит кастомное ядро Ubuntu

Представьте: ваш UKI для кастомного ядра Ubuntu подписан sbctl, UEFI его проглотил без вопросов. Но дальше — тишина. Ни LUKS-пароля, ни даже намёка на initramfs. Почему так? Secure Boot — это не просто галочка в BIOS. Он проверяет каждый бинарник в цепочке: shim, GRUB, ядро, initrd и все модули внутри. Если где-то подпись хромает, цепочка рвётся ещё до этапа расшифровки диска.

В вашем случае lockdown отключён в ядре Ubuntu, что круто для разработки, но при Secure Boot ядро всё равно требует, чтобы модули (особенно для LUKS) были подписаны доверенным ключом. Согласно официальной документации Ubuntu, даже если UKI прошёл, проверьте: “Kernel (UKI) должен быть подписан ключом из UEFI-базы, а модули — без ошибок Signature verification failed или module not signed”. Без этого загрузчик просто зависает или кидает в emergency shell.

Или вот реальный кейс из systemd-issues: UKI стартует, но Secure Boot в ядре остаётся “disabled”, потому что MOK не попал в keyring. Лог покажет “Secure boot disabled”. Звучит знакомо?


Диагностика: что проверить первым делом

Не лезьте в подписи сразу. Сначала гляньте логи — они расскажут всё. Загрузитесь в recovery mode (из GRUB, Shift при старте) или с live-USB.

dmesg | grep -i "secure\|signature\|mok\|efi"
journalctl -b -1 | grep -i "secure\|luks\|module"

Ищите:

  • Signature verification failed — модуль не подписан.
  • Secure boot disabled — ключи не в keyring.
  • platform keyring initialized без вашего MOK — регистрация не прошла.

Если sbctl у вас стоит, то:

sbctl status
sbctl verify

“Secure Boot: enabled”, но “unsigned files”? Подписывайте их по списку. А если UKI без .efi-суффикса или systemd-ukify не установлен — вот и причина, как в Arch-форуме.

Ещё трюк: mokutil --list-enrolled. Если вашего ключа нет — enroll заново. Это базовый чек-лист, и он ловит 80% бед.


Статус Secure Boot и sbctl

sbctl — ваш лучший друг для кастомных ядер. Но он не волшебник. После подписи UKI проверьте цепочку целиком.

Установите, если нет:

sudo apt install sbctl
sudo sbctl create-keys
sudo sbctl enroll-keys -m

Затем статус:

sudo sbctl status

Должно быть “All files good”. Если нет — подписывайте:

sudo sbctl sign -s /boot/EFI/LOADER/Entries/*.conf /boot/vmlinuz* /boot/initrd*
sudo sbctl sign -s /boot/uki-yourkernel.efi # ваш UKI

Перезагрузитесь в MOKManager (он сам выскочит), подтвердите. Теперь Secure Boot увидит ваши ключи. ArchWiki рекомендует именно так: “Sign kernel and bootloader, then sbctl verify”.

Но если dmesg всё равно ругается на модули — вперёд к следующему шагу. sbctl подписывает файлы, но не всегда модули внутри initramfs.


Подпись модулей ядра и initramfs

Вот засада №1 для кастомного ядра Ubuntu. UKI — это ядро + initramfs в одном EFI-файле. Но модули LUKS (cryptsetup, dm-crypt) внутри тоже должны быть подписаны. Иначе ядро их отвергнет до пароля.

Генерируйте ключи (если sbctl не создал):

openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -days 36500 -subj "/CN=My MOK/"

Подписывайте модули:

sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 MOK.priv MOK.der /lib/modules/$(uname -r)/kernel/crypto/* /lib/modules/$(uname -r)/kernel/drivers/md/dm-crypt.ko.xz
sudo apt install kmodsign # если нет
sudo kmodsign sha256 MOK.priv MOK.der /lib/modules/$(uname -r)/updates/dkms/*.ko.xz

Обновите initramfs:

sudo update-initramfs -u -k your-kernel-version
sudo update-grub

Руководство по подписи даёт точные команды: sbsign --key MOK.priv --cert MOK.pem /boot/vmlinuz-version-generic. Для UKI — то же, плюс модули. Без этого Secure Boot кинет “module not signed” в dmesg.


Регистрация ключей MOK

Подписали? Теперь UEFI должен доверять. Установите:

sudo apt install mokutil
sudo mokutil --import MOK.der

Перезагрузка → MOKManager → Enroll MOK → View key → OK → Reboot. Проверьте:

sudo mokutil --list-enrolled | grep My

Если ключ не там — Secure Boot проигнорирует подписи. Ubuntu Wiki предупреждает: без MOK в базе даже подписанный UKI бесполезен для модулей.


Правильная сборка UKI с systemd-ukify

Вы создали UKI, но как? Если вручную, без systemd-ukify — ошибка. Он генерит EFI-совместимый файл с подписями.

Установите:

sudo apt install systemd-ukify

Соберите:

ukify build --linux=/boot/vmlinuz-your --initrd=/boot/initrd.img-your --cmdline="root=UUID=your-luks cryptmode=luks2" --output=/boot/EFI/LOADER/entries/your.conf.d/00-uki.efi
sudo sbctl sign -s /boot/EFI/LOADER/entries/your.conf.d/00-uki.efi

Обновите loader.conf. Теперь kernel-install (если используете) сам потянет ukify, как в Arch-кейсе. Без этого Secure Boot видит “vmlinuz missing .efi suffix” и стопорится.


Дополнительные проверки GRUB и LUKS

GRUB-image при Secure Boot может не тащить luks2-модуль. Launchpad-бага: “Secure Boot grub не содержит luks2, модуль не загрузится”.

Проверьте:

lsinitramfs /boot/initrd.img-your | grep cryptsetup
grub-probe --target=crypto /dev/sdX

Если нет — добавьте в /etc/initramfs-tools/modules: dm-crypt gf128mul. Пересоберите initramfs. Или перейдите на dracut для лучшей LUKS-поддержки.


Альтернативы, если ничего не помогает

Не срастается?

  • kexec из userspace: официальное ядро Ubuntu грузит ваш кастом без Secure Boot-проверки, как в AskUbuntu.
  • Отключите lockdown полностью, но используйте signed upstream-ядро.
  • sbctl с авто-скриптами или перейдите на Fedora-style UKI.

Тестируйте поэтапно — с live-USB подписью.


Источники

  1. UEFI/SecureBoot - Ubuntu Wiki
  2. Signing a Linux Kernel for Secure Boot
  3. Signing custom compiled kernel for Secure Boot - Ask Ubuntu
  4. [SOLVED] UKI and Secure Boot with kernel-install - Arch Linux Forums
  5. Unified Extensible Firmware Interface/Secure Boot - ArchWiki
  6. Secure boot support is disabled when booting an UKI · Issue #39363 · systemd/systemd
  7. Secure Boot image does not contain luks2 module - Launchpad

Заключение

Secure Boot с кастомным ядром Ubuntu требует полной цепочки: подписанный UKI через sbctl или sbsign, модули с kmodsign, MOK в mokutil и правильный systemd-ukify. Начните с dmesg и sbctl status — это покажет виновника. Пофиксите, и LUKS-пароль появится. Если застряли, киньте логи в комментарии. Удачи с вашим ядром!

Авторы
Проверено модерацией
Модерация
Почему кастомное ядро Ubuntu не загружается с Secure Boot?