Все об Arch Linux

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

Подпись ядра для Secure Boot: sbctl и sbsigntools

Сразу к делу: подписать ядро для Secure Boot на Arch Linux проще всего через sbctl. Ставишь пакет, создаёшь ключи, вносишь их в прошивку и подписываешь ядро с initramfs — три команды, и Secure Boot пропускает систему. Если Secure Boot включён, а ядро не подписано, загрузка падает с ошибкой Verification failed: (0x1A) Security Violation. Ниже полный разбор: почему так происходит, как подписать ядро через sbctl и как сделать то же самое вручную через sbsigntools.

Почему Secure Boot не даёт загрузить ядро без подписи?

Secure Boot проверяет подписи всех компонентов цепочки загрузки. Прошивка проверяет первый загружаемый файл, тот проверяет следующий, и так до ядра. Доверенные ключи лежат в переменных прошивки: db (подписанные файлы), KEK (ключи, обновляющие db) и PK (главный ключ платформы). Если подпись не совпадает ни с одним ключом — загрузка останавливается.

На Arch Linux GRUB обычно запускается через shim — маленький загрузчик, подписанный ключами Microsoft. Поэтому сам GRUB проходит проверку прошивки. А вот ядро и initramfs shim проверяет уже по твоим ключам. Подписи нет — появляется ошибка Verification failed: (0x1A) Security Violation, и загрузка обрывается.

Arch поставляет готовые подписанные файлы в пакете shim-signed: /usr/share/shim-signed/shimx64.efi и /usr/share/shim-signed/grubx64.efi. Это значит, что загрузчик трогать не нужно — остаётся подписать только ядро и initramfs. Если используешь прямую загрузку ядра (EFISTUB или UKI), подписывается весь образ целиком — про это ниже.

Схема с shim удобна тем, что загрузчик уже подписан и его не нужно трогать. Но у неё есть нюанс: shim проверяет не только ядро, но и initramfs. Поэтому подписывать нужно оба файла, а не только vmlinuz. Если пропустить initramfs — загрузка тоже упадёт с ошибкой проверки подписи.

Что такое sbctl и почему это самый простой путь?

sbctl — утилита, которая автоматизирует работу с ключами Secure Boot. Она сама генерирует ключи (PK, KEK, db), вносит их в прошивку, подписывает EFI-файлы и ставит pacman-хук, который переподписывает ядро после каждого обновления. Без sbctl пришлось бы вручную подписывать каждый новый vmlinuz-linux после pacman -Syu — иначе система перестанет загружаться.

Полный разбор включения Secure Boot через sbctl — в статье «Secure Boot в Arch Linux через sbctl». Здесь сфокусируемся именно на подписи ядра и initramfs.

Как подписать ядро через sbctl?

Установка и проверка состояния

sudo pacman -S sbctl
sbctl status

sbctl status покажет, включён ли Secure Boot и есть ли ключи. Если ключей нет — создаём свои:

sbctl create-keys

Ключи сохраняются в /var/lib/sbctl/keys. Не теряй эту папку: при переустановке системы только с ней восстановишь доступ к подписанным файлам.

Вносим ключи в прошивку

sbctl enroll-keys -m    # -m добавляет ключи Microsoft

Флаг -m добавляет ключи Microsoft в базу доверия. Это критично для dualboot с Windows — иначе Windows и другие подписанные Microsoft загрузчики перестанут запускаться. Если на машине только Arch, можно без -m, но безопаснее всегда ставить с ним.

Подписываем ядро и initramfs

sbctl sign -s /boot/vmlinuz-linux
sbctl sign -s /boot/initramfs-linux.img

Флаг -s (или --save) запоминает файл: при обновлении пакета linux sbctl автоматически переподписывает новое ядро и initramfs через свой pacman-хук. Хук лежит в /usr/share/libalpm/hooks/sbctl.hook — можешь проверить, что он на месте.

Если у тебя несколько ядер (linux-lts, linux-zen) — подпиши каждое:

sbctl sign -s /boot/vmlinuz-linux-lts
sbctl sign -s /boot/initramfs-linux-lts.img

Проверяем результат

sbctl verify

Команда покажет список подписанных файлов и пометит неподписанные. Если увидишь unsigned — подпиши файл и прогони verify снова.

Чем sbctl отличается от sbsigntools?

Обе утилиты решают одну задачу — подписывают EFI-файлы ключами Secure Boot. Разница в подходе. sbsigntools — низкоуровневый инструмент: ты сам указываешь ключ, сертификат и файл, сам следишь за обновлениями. sbctl — обёртка, которая хранит ключи в одном месте, помнит подписанные файлы и переподписывает их автоматически.

Для разовой подписи хватит и sbsigntools. Для постоянной работы на Arch Linux sbctl удобнее: меньше шансов забыть переподписать ядро после обновления. Если ты уже настроил sbctl, sbsigntools понадобится разве что для проверки чужих файлов или подписи чего-то нестандартного.

Как подписать ядро, если Secure Boot уже включён?

Если Secure Boot уже активен, а ядро не подписано, система не загрузится — сначала придётся попасть в неё. Проще всего временно выключить Secure Boot в прошивке, загрузиться, подписать ядро и включить защиту обратно. Такой порядок безопаснее всего: ты всегда остаёшься внутри рабочей системы.

Бывает, что прошивка не даёт выключить Secure Boot или не входит в Setup Mode. Тогда путь один — live-USB и arch-chroot, как описано ниже. Ключи sbctl лежат на диске, поэтому из chroot подпись восстанавливается без проблем.

Как работает автоподпись при обновлениях?

Когда ты подписываешь файл с флагом -s, sbctl записывает его путь в свою базу и ставит pacman-хук. Хук срабатывает после каждой транзакции, которая меняет файлы в /boot: обновился пакет linux — sbctl переподписывает новый vmlinuz-linux и initramfs-linux.img сам, без твоего участия.

Посмотреть список файлов, которые переподписываются автоматически, можно через sbctl status — утилита покажет их в выводе. Если подписать файл без -s, он будет подписан один раз, но после обновления пакета подпись слетит. Поэтому для ядра и initramfs флаг -s обязателен.

Хук работает и для ядер из AUR: linux-zen, linux-cachyos и другие ставят свои файлы в /boot, и триггер хука их тоже ловит. Главное — подписать файл с -s хотя бы один раз, дальше всё происходит автоматически.

Как подписать ядро вручную через sbsigntools?

Если не хочешь зависеть от sbctl, подписать ядро можно вручную пакетом sbsigntools. Он даёт две команды: sbsign для подписи и sbverify для проверки.

sudo pacman -S sbsigntools

Подписываем ядро:

sbsign --key db.key --cert db.crt --output /boot/vmlinuz-linux.signed /boot/vmlinuz-linux

Ключи db.key и db.crt — те же, что создал sbctl в /var/lib/sbctl/keys. Если создавал ключи сам через openssl — указывай свои пути:

openssl req -new -x509 -newkey rsa:2048 -keyout db.key -out db.crt -nodes -days 3650 -subj "/CN=My Secure Boot DB Key/"

Проверяем подпись:

sbverify --list /boot/vmlinuz-linux.signed

Команда покажет сертификат, которым подписан файл. Главный минус ручного пути: после каждого обновления ядра подпись слетает, и переподписывать приходится вручную. Чтобы не забывать, можно написать свой pacman-хук — но проще один раз настроить sbctl, который делает это сам.

Обрати внимание: sbsign не меняет исходный файл, а создаёт новый — с расширением .signed или тем именем, что ты указал в --output. Подписанный файл должен лежать в /boot под тем именем, которое ожидает загрузчик. Обычно это значит, что после подписи нужно переименовать файл или сразу указывать правильный путь в --output.

Что подписывать, если загрузка идёт через shim и GRUB?

На Arch Linux стандартная схема — shim → GRUB. Пакет shim-signed кладёт на ESP подписанные shimx64.efi и grubx64.efi. Прошивка проверяет shim по ключам Microsoft, shim проверяет GRUB по твоим ключам. В этой схеме подписывать нужно ядро и initramfs — именно их проверяет GRUB.

Подробный разбор цепочки shim → GRUB и подписи загрузчика — в статье «Secure Boot + GRUB: подпись загрузчика».

Альтернатива — прямая загрузка ядра через EFISTUB или UKI. В этом случае подписывается один файл целиком: ядро, initramfs и параметры загрузки собираются в единый образ, и подпись ставится на него один раз. Разбор — в статье «Прямая загрузка ядра через EFISTUB и UKI».

Что делать, если Secure Boot блокирует загрузку?

Симптом: после включения Secure Boot система не загружается, на экране Verification failed: (0x1A) Security Violation. Причины две: ядро не подписано или ключи не внесены в прошивку.

Порядок действий:

  1. Выключи Secure Boot в настройках прошивки (раздел Boot или Security).
  2. Загрузись в систему и проверь sbctl verify — подписаны ли ядро и initramfs.
  3. Если нет — подпиши их командами выше.
  4. Проверь sbctl status — ключи должны быть внесены, Setup Mode выключен.
  5. Включи Secure Boot обратно и перезагрузись.

Если система не загружается вовсе — загрузись с live-USB. Смонтируй корневой раздел и ESP, сделай arch-chroot и выполни те же команды оттуда:

mount /dev/nvme0n1p2 /mnt          # корень — подставь свой раздел
mount /dev/nvme0n1p1 /mnt/boot     # ESP
arch-chroot /mnt
sbctl verify
sbctl sign -s /boot/vmlinuz-linux
sbctl sign -s /boot/initramfs-linux.img

Ключи sbctl лежат на диске, так что из chroot всё доступно. После перезагрузки включи Secure Boot снова.

Ещё одна частая причина блокировки — обновление прошивки. Некоторые прошивки после обновления сбрасывают ключи Secure Boot в заводское состояние. Система перестаёт загружаться, хотя вчера всё работало. Лечится повторным внесением ключей: sbctl enroll-keys -m. Сами ключи при этом не теряются — они лежат на диске, теряется только доверие прошивки к ним.

Важно: сначала настрой подпись при выключенном Secure Boot, проверь, что система грузится, и только потом включай Secure Boot в прошивке. Так ты отделишь проблемы с подписью от проблем с самой загрузкой.

Как проверить, что подпись работает?

После перезагрузки с включённым Secure Boot:

sbctl status

Строка Secure Boot: enabled — всё работает. Дополнительно sbctl verify покажет, что все файлы подписаны. Если после обновления ядра система вдруг перестала грузиться — первым делом проверь, что хук sbctl сработал и новое ядро подписано. А старые ядра и initramfs, которые остались в /boot после обновлений, можно почистить — про это есть отдельная статья «Чистка старых ядер и initramfs».

Если Secure Boot включён, а система всё равно не грузится — проверь, что загрузочная запись указывает на правильный файл. Иногда после обновления загрузчика запись в NVRAM меняется, и прошивка пытается запустить неподписанный файл. В этом случае помогут efibootmgr и повторная установка загрузчика.

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

Нужно ли подписывать initramfs?

Да, подпиши оба файла: vmlinuz-linux и initramfs-linux.img. sbctl делает это одной командой, а хук переподписывает initramfs автоматически вместе с ядром. При прямой загрузке через UKI initramfs вшивается в образ, и подписывается весь образ целиком.

Что будет с Windows после enroll-keys без -m?

Windows не загрузится. Её загрузчик подписан ключами Microsoft, а без флага -m эти ключи не попадают в базу доверия прошивки. Если на диске есть Windows — всегда используй sbctl enroll-keys -m.

Как подписать несколько ядер?

Подпиши каждое ядро и его initramfs отдельно: sbctl sign -s /boot/vmlinuz-linux-lts, sbctl sign -s /boot/initramfs-linux-lts.img. Хук sbctl переподписывает все сохранённые файлы автоматически. Про выбор второго ядра для отладки и производительности — в статье «Второе ядро для отладки и производительности».

Что делать, если после обновления ядра появилась ошибка подписи?

Переподписать ядро: sbctl sign -s /boot/vmlinuz-linux. Если хук sbctl на месте, это происходит автоматически — проверь /usr/share/libalpm/hooks/sbctl.hook. Если ошибка повторяется — загрузись с live-USB, сделай chroot и подпиши ядро оттуда.

Можно ли отключить Secure Boot, если надоело?

Можно. Выключи Secure Boot в прошивке или удали ключи — система вернётся к обычной загрузке. Подписанные файлы продолжат работать, просто прошивка перестанет их проверять. Но тогда теряется защита от подмены загрузчика, ради которой Secure Boot и включают.

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

Заключение

Подпись ядра для Secure Boot на Arch Linux — это три команды sbctl: create-keys, enroll-keys -m, sign -s. Дальше pacman-хук переподписывает ядро и initramfs при каждом обновлении, и Secure Boot работает без твоего участия. Ручной путь через sbsigntools существует, но требует переподписи после каждого обновления. Главное — не забывай флаг -m при внесении ключей и сначала настраивай подпись при выключенном Secure Boot. Если что-то пошло не так — live-USB и arch-chroot всегда выручат: ключи лежат на диске, и подпись восстанавливается за пару минут.



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

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

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

Комментарии

Загрузка…

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

Telegram Max