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

Эта проблема возникает только в системах UEFI с включенной безопасной загрузкой.

Когда я пытаюсь установить модули DKMS, такие как драйверы VirtualBox, Nvidia или Broadcom, они не устанавливаются, и я получаю Required key not available когда я пытаюсь modprobe их.

VirtualBox жалуется, что vboxdrv не загружен

Broadcom wl водитель показан в lspci -k как модуль ядра, но не используется. sudo modprobe wl бросает Required key not available,

Также эта проблема может возникнуть при установке некоторых модулей ядра из исходников git.

Эта проблема может появиться после обновления ядра в виде отключенного беспроводного адаптера, черного экрана после перезагрузки и т. Д.

Как я могу это исправить?

4 ответа

Решение

Начиная с ядра Ubuntu 4.4.0-20 EFI_SECURE_BOOT_SIG_ENFORCE Конфигурация ядра была включена. Это предотвращает загрузку неподписанных сторонних модулей, если включена UEFI Secure Boot.

Самый простой способ решить эту проблему - отключить безопасную загрузку в настройках UEFI (BIOS).

В большинстве случаев вы можете войти в настройки UEFI, используя меню grub. Нажмите кнопку ESC при загрузке, войдите в меню grub и выберите System Setup. Опция Безопасная загрузка должна быть в разделе "Безопасность" или "Загрузка" UEFI.

Вы можете войти в UEFI напрямую, но это зависит от вашего оборудования. Прочтите руководство к компьютеру, чтобы узнать, как туда добраться. Это может быть Del, или F2 при загрузке, или что-то еще.

Альтернативный способ - отключить безопасную загрузку с помощью mokutil,

Начиная с сборки ядра Ubuntu 4.4.0-21.37 это можно исправить, запустив

sudo apt install mokutil
sudo mokutil --disable-validation

Для этого потребуется создать пароль. Пароль должен быть не менее 8 символов. После перезагрузки UEFI спросит, хотите ли вы изменить настройки безопасности. Выберите "Да".

Затем вам будет предложено ввести ранее созданный пароль. Некоторые прошивки UEFI запрашивают не полный пароль, а ввод некоторых символов, таких как 1-й, 3-й и т. Д. Будьте осторожны. Некоторые люди не понимают этого. Я не получил это с первой попытки;-)

Обновление: теперь эта конфигурация ядра включена во всех поддерживаемых ядрах Ubuntu. Ubuntu 16.04, 15.10 и 14.04 затронуты.

По предложению пользователя @zwets, я копирую (с правками) ответ здесь:

Начиная с версии ядра 4.4.0-20 было принудительно запрещено запускать неподписанные модули ядра с включенной безопасной загрузкой. Если вы хотите сохранить Secure Boot, а также запустить эти модули, то следующий логический шаг - подписать эти модули.

Итак, давайте попробуем это.

  1. Создать ключи подписи

    openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Descriptive name/"
    
  2. Подпишите модуль

    sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der /path/to/module
    
  3. Зарегистрируйте ключи для безопасной загрузки

    sudo mokutil --import MOK.der
    

    Введите пароль для последующего использования после перезагрузки

  4. Reboot и следуйте инструкциям, чтобы зарегистрировать MOK (ключ владельца машины). Вот образец с картинками. Система перезагрузится еще раз.

Пожалуйста, дайте мне знать, будут ли ваши модули работать таким образом в Ubuntu 16.04 (на ядре 4.4.0-21, я считаю).

Ресурсы: Подробная статья на сайте для реализации подписания модулей в Fedora и Ubuntu. (они работали над этим);-)

Дополнительный ресурс: я каждый раз создавал bash-скрипт для собственного использования virtualbox-dkms обновляет и, таким образом, перезаписывает подписанные модули. Проверьте мой vboxsign изначально на GitHub.

Дополнительное примечание для безопасности (экстра) сознательно:;-)

Поскольку закрытый ключ вы создали (MOK.priv в этом примере) может использоваться любым, кто может иметь к нему доступ, поэтому рекомендуется обеспечить его безопасность. Ты можешь chmod это, зашифровать (gpg) или храните его в другом безопасном месте (r). Или, как отмечено в этом комментарии, уберите опцию -nodes в шаге № 1. Это зашифрует ключ с парольной фразой.

Вы можете отключить безопасную загрузку (UEFI) в BIOS, выполнив следующие действия:

  1. Перезагрузите компьютер и войдите в меню BIOS (в моем случае нажмите F2)

  2. Ищите безопасную загрузку и переходите на Legacy

В материнской плате ASUS:

  • Перейти в расширенный режим (F7)
  • Зайдите в опцию Secure Boot в разделе Boot
  • Измените "Режим Windows UEFI" на "Другие ОС"
  • Сохраните и перезапустите, чтобы применить настройки (F10)

Вы также можете отключить безопасную загрузку в режиме работы с подписью sudo update-secureboot-policy, Эта вики-страница объясняет этот метод:

  • Откройте терминал (Ctrl + Alt + T), выполните команду sudo update-secureboot-policy и выберите "Да".
  • Введите временный пароль от 8 до 16 цифр. (Например, 12345678, мы будем использовать этот пароль позже
  • Введите тот же пароль еще раз для подтверждения.
  • Перезагрузите систему и нажмите любую клавишу, когда появится синий экран (управление МОК
  • Выберите Изменить состояние безопасной загрузки.
  • Введите пароль, который вы выбрали на шаге 2, и нажмите Enter.
  • Выберите Да, чтобы отключить безопасную загрузку в Shim-Sign.
  • Нажмите клавишу Enter, чтобы завершить всю процедуру.

Вы по-прежнему можете включить безопасную загрузку в Shim-Sign снова. Просто выполнить

sudo update-secureboot-policy --enable и затем выполните шаги, описанные выше

Другие вопросы по тегам