Сразу к делу: подписать ядро для Secure Boot на Arch Linux проще всего через sbctl. Ставишь пакет, создаёшь ключи, вносишь их в прошивку и подписываешь ядро с initramfs — три команды, и Secure Boot пропускает систему. Если Secure Boot включён, а ядро не подписано, загрузка падает с ошибкой Verification failed: (0x1A) Security Violation. Ниже полный разбор: почему так происходит, как подписать ядро через sbctl и как сделать то же самое вручную через sbsigntools.
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 — утилита, которая автоматизирует работу с ключами Secure Boot. Она сама генерирует ключи (PK, KEK, db), вносит их в прошивку, подписывает EFI-файлы и ставит pacman-хук, который переподписывает ядро после каждого обновления. Без sbctl пришлось бы вручную подписывать каждый новый vmlinuz-linux после pacman -Syu — иначе система перестанет загружаться.
Полный разбор включения Secure Boot через sbctl — в статье «Secure Boot в Arch Linux через sbctl». Здесь сфокусируемся именно на подписи ядра и initramfs.
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, но безопаснее всегда ставить с ним.
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 снова.
Обе утилиты решают одну задачу — подписывают EFI-файлы ключами Secure Boot. Разница в подходе. sbsigntools — низкоуровневый инструмент: ты сам указываешь ключ, сертификат и файл, сам следишь за обновлениями. sbctl — обёртка, которая хранит ключи в одном месте, помнит подписанные файлы и переподписывает их автоматически.
Для разовой подписи хватит и sbsigntools. Для постоянной работы на Arch Linux sbctl удобнее: меньше шансов забыть переподписать ядро после обновления. Если ты уже настроил sbctl, sbsigntools понадобится разве что для проверки чужих файлов или подписи чего-то нестандартного.
Если 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 хотя бы один раз, дальше всё происходит автоматически.
Если не хочешь зависеть от 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.
На 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 система не загружается, на экране Verification failed: (0x1A) Security Violation. Причины две: ядро не подписано или ключи не внесены в прошивку.
Порядок действий:
sbctl verify — подписаны ли ядро и initramfs.sbctl status — ключи должны быть внесены, Setup Mode выключен.Если система не загружается вовсе — загрузись с 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 и повторная установка загрузчика.
Да, подпиши оба файла: vmlinuz-linux и initramfs-linux.img. sbctl делает это одной командой, а хук переподписывает initramfs автоматически вместе с ядром. При прямой загрузке через UKI initramfs вшивается в образ, и подписывается весь образ целиком.
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 на Arch Linux — это три команды sbctl: create-keys, enroll-keys -m, sign -s. Дальше pacman-хук переподписывает ядро и initramfs при каждом обновлении, и Secure Boot работает без твоего участия. Ручной путь через sbsigntools существует, но требует переподписи после каждого обновления. Главное — не забывай флаг -m при внесении ключей и сначала настраивай подпись при выключенном Secure Boot. Если что-то пошло не так — live-USB и arch-chroot всегда выручат: ключи лежат на диске, и подпись восстанавливается за пару минут.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии