LinuxRuLinux без лишней теории
Безопасная загрузка

Secure Boot и Linux: установка драйверов без отключения защиты

Редакция LinuxRu6 мин чтенияИнструкции

Чтобы драйвер NVIDIA или другой модуль DKMS работал при включённом Secure Boot, его нужно подписать своим ключом и добавить этот ключ в список MOK через mokutil. Делается это один раз: после подтверждения на экране MOK Manager модули подписываются автоматически при каждом обновлении ядра.

Secure Boot и Linux: установка драйверов без отключения защиты
Фото: Vanilla OS Devs, GPL, Wikimedia Commons
Содержание
  1. Почему не грузится
  2. Что такое MOK
  3. Ubuntu
  4. Debian
  5. Fedora
  6. Экран MOK Manager
  7. Arch и sbctl
  8. Проверка и откат
  9. Частые вопросы

Почему драйвер не загружается при включённом Secure Boot

Ситуация знакомая: поставили драйвер NVIDIA, VirtualBox или модуль для Wi-Fi адаптера, перезагрузились, а он не работает. В терминале при ручной загрузке видно:

sudo modprobe nvidia
# modprobe: ERROR: could not insert 'nvidia': Key was rejected by service

Причина в цепочке доверия. С включённым Secure Boot прошивка запускает только подписанный загрузчик shim, тот проверяет GRUB и ядро, а ядро Ubuntu, Fedora или Debian в этом режиме переходит в lockdown и принимает только модули, подписанные известным ему ключом. Модули из пакетов дистрибутива подписаны при сборке. А вот модули, которые собираются у вас на компьютере через DKMS или akmods, подписать заранее некому.

Чаще всего это касается драйвера NVIDIA, VirtualBox (vboxdrv), v4l2loopback, ZFS, драйверов Broadcom и Realtek для Wi-Fi. Отключать Secure Boot ради них не нужно: достаточно один раз создать свой ключ, добавить его в список MOK и подписывать им модули. Дальше всё происходит автоматически при каждом обновлении ядра.

Сначала проверьте, что дело действительно в Secure Boot:

mokutil --sb-state
sudo dmesg | grep -i -e lockdown -e 'module verification'

MOK: собственный ключ рядом с ключами Microsoft

В базе ключей прошивки обычно лежат сертификаты Microsoft. Shim подписан Microsoft и добавляет второй, свой список доверенных ключей - Machine Owner Key, или MOK. Ключи туда может добавить только владелец компьютера, причём подтверждение происходит до загрузки системы, на синем экране MOK Manager. Вредоносная программа в работающей системе не сможет тихо подложить свой ключ: без физического присутствия и пароля на этом экране ничего не произойдёт.

Порядок для всех дистрибутивов одинаковый:

  1. Создать пару ключей: закрытый остаётся на диске, открытый в формате DER пойдёт в MOK.
  2. Поставить открытый ключ в очередь на добавление командой mokutil --import и придумать одноразовый пароль.
  3. Перезагрузиться и подтвердить ключ в MOK Manager.
  4. Пересобрать или подписать модули, если они были собраны до появления ключа.

Разница между дистрибутивами только в том, где лежит ключ и кто им подписывает модули.

ДистрибутивКто собирает модулиГде открытый ключИмпорт
Ubuntu 26.04 LTSDKMS/var/lib/shim-signed/mok/MOK.derupdate-secureboot-policy --enroll-key или mokutil --import
Debian 13DKMS/var/lib/dkms/mok.pubmokutil --import /var/lib/dkms/mok.pub
Fedora 44 + RPM Fusionakmods/etc/pki/akmods/certs/public_key.dermokutil --import
Arch LinuxDKMSПодпись модулей не требуется по умолчаниюСвои ключи Secure Boot через sbctl

Ubuntu: готовые подписанные драйверы и DKMS

Для NVIDIA в Ubuntu есть путь вообще без MOK. Утилита ubuntu-drivers по возможности ставит заранее собранные модули из пакетов linux-modules-nvidia-*, а они подписаны ключом Canonical, которому ядро уже доверяет:

ubuntu-drivers devices
sudo ubuntu-drivers install

Если модуль всё же собирается через DKMS (VirtualBox, нестандартная версия драйвера, Wi-Fi), при установке пакета появится текстовое окно с предложением задать пароль для Secure Boot. Запомните его, он понадобится один раз после перезагрузки. Окно пропустили или ключ не добавился, повторите вручную:

sudo update-secureboot-policy --enroll-key
# или напрямую
sudo mokutil --import /var/lib/shim-signed/mok/MOK.der
sudo mokutil --list-new

Последняя команда показывает ключи, ожидающие подтверждения. Пустой вывод значит, что импорт не встал в очередь. Подробности о выборе версии драйвера NVIDIA есть в статье об установке драйвера NVIDIA.

Debian 13: ключ DKMS

В Debian DKMS сам создаёт пару ключей при первой сборке модуля: закрытый /var/lib/dkms/mok.key и открытый /var/lib/dkms/mok.pub. Если ключей нет, их можно создать заранее командой sudo dkms generate_mok. Регистрация выглядит так, как описано в Debian Wiki:

sudo apt install dkms mokutil linux-headers-$(uname -r)
sudo mokutil --import /var/lib/dkms/mok.pub
sudo mokutil --list-new
sudo reboot

После подтверждения ключа пересоберите модули, собранные раньше, например sudo dkms autoinstall, или переустановите пакет драйвера. Про остальную настройку системы для дома есть отдельный материал о Debian 13.

Fedora: akmods и драйвер NVIDIA из RPM Fusion

В Fedora драйвер NVIDIA ставится из RPM Fusion как akmod-nvidia, модуль собирается сервисом akmods. Ключ лучше создать до установки драйвера, тогда первый же модуль будет подписан:

sudo dnf install kmodtool akmods mokutil openssl
sudo kmodgenca -a
sudo mokutil --import /etc/pki/akmods/certs/public_key.der
sudo reboot

Ключ -a у kmodgenca принимает значения по умолчанию без вопросов. Если ключ уже существует, утилита не перезапишет его без -f, и это правильно: новый ключ пришлось бы снова регистрировать. После перезагрузки и подтверждения ставьте драйвер и дайте akmods собрать модуль:

sudo dnf install akmod-nvidia
sudo akmods --force
modinfo -F signer nvidia

Сборка занимает несколько минут, перезагружаться раньше не стоит. Если драйвер был поставлен до ключа, модуль остался неподписанным: после регистрации ключа выполните sudo akmods --force или переустановите пакет.

Экран MOK Manager после перезагрузки

Сразу после перезагрузки появится синий экран shim. Он ждёт нажатия клавиши всего несколько секунд, поэтому не уходите от компьютера.

  1. Нажмите любую клавишу и выберите Enroll MOK.
  2. View key покажет данные ключа, можно пропустить. Далее Continue.
  3. На вопрос "Enroll the key(s)?" ответьте Yes.
  4. Введите пароль, заданный при импорте. Раскладка здесь английская, символы при вводе не отображаются.
  5. Выберите Reboot.

Пропустили экран и система загрузилась как обычно? Ничего страшного, импорт просто не выполнился. Повторите mokutil --import и перезагрузитесь ещё раз.

Задавайте простой пароль из латинских букв и цифр, без символов, которые на английской раскладке стоят в другом месте. На экране MOK Manager нет русской раскладки, и пароль с кириллицей или @, набранной "по-русски", не пройдёт. Пароль нужен один раз, сложность тут не важна.

Arch Linux: свои ключи Secure Boot через sbctl

Ядро Arch по умолчанию не требует подписи модулей, поэтому DKMS-драйверы грузятся без MOK. Здесь задача другая: включить Secure Boot вообще. Обычно используют sbctl, он создаёт собственные ключи платформы и подписывает ядро и загрузчик. Перед началом переведите прошивку в режим Setup Mode (в настройках UEFI это пункт вроде "Reset to Setup Mode" или "Clear Secure Boot keys").

sudo pacman -S sbctl
sbctl status
sudo sbctl create-keys
sudo sbctl enroll-keys -m
sudo sbctl verify
sudo sbctl sign -s /boot/vmlinuz-linux
sudo sbctl sign -s /boot/EFI/BOOT/BOOTX64.EFI

Ключ -m оставляет в базе сертификаты Microsoft. Не пропускайте его: прошивки многих видеокарт и сетевых контроллеров подписаны Microsoft, и без этих сертификатов можно получить чёрный экран при старте. sbctl verify показывает неподписанные файлы, а флаг -s запоминает их, чтобы хук pacman переподписывал их после каждого обновления.

Проверка подписи и откат, если что-то пошло не так

Убедиться, что всё в порядке, можно так:

# ключи, которые уже в MOK
mokutil --list-enrolled | grep -i subject
# кем подписан модуль
modinfo -F signer nvidia
modinfo vboxdrv | grep -e signer -e sig_id
# загружен ли модуль
lsmod | grep -e nvidia -e vboxdrv

Если нужно подписать сторонний модуль вручную, используйте sign-file из заголовков ядра. Модули в .ko.zst или .ko.xz сначала распакуйте, подписывается несжатый файл:

sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 /var/lib/dkms/mok.key /var/lib/dkms/mok.pub module.ko

Путь к sign-file зависит от дистрибутива: в Debian он лежит в /usr/lib/linux-kbuild-*/scripts/, в других системах в /lib/modules/$(uname -r)/build/scripts/.

Как откатить

  • Убрать ключ из очереди до перезагрузки: sudo mokutil --revoke-import.
  • Удалить уже добавленный ключ: sudo mokutil --delete /var/lib/dkms/mok.pub, затем подтвердить удаление в MOK Manager.
  • Если после правок система не грузится, временно выключите Secure Boot в UEFI, загрузитесь и разберитесь. Для восстановления загрузчика поможет статья о восстановлении GRUB.

Владельцам компьютеров с Windows рядом: отключение Secure Boot или сброс ключей в прошивке может заставить BitLocker попросить ключ восстановления. Найдите его в учётной записи Microsoft заранее. Сама регистрация MOK базу прошивки не меняет. Тонкости двойной загрузки разобраны в статье о Linux рядом с Windows 11.

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

Что значит ошибка Key was rejected by service?

Ядро работает в режиме Secure Boot и не доверяет подписи модуля. Нужно добавить ключ, которым DKMS или akmods подписывает модули, в MOK и пересобрать модуль.

Безопасно ли добавлять свой ключ в MOK?

Да, если закрытый ключ хранится только у вас. Каждый ключ подтверждается вручную до загрузки системы, поэтому чужая программа не добавит его тайно. Для защиты закрытого ключа полезно шифрование диска.

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

Нет. Ключ остаётся в MOK, а DKMS и akmods подписывают им модули для каждого нового ядра автоматически.

Я пропустил экран MOK Manager, что делать?

Повторите sudo mokutil --import с тем же файлом ключа и перезагрузитесь. На экране shim нажмите клавишу в течение нескольких секунд.

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

Командой mokutil --sb-state. Она выводит SecureBoot enabled или disabled.

Документация и источники

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

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.