Не удалось загрузить vboxdrv после обновления до Ubuntu 16.04 (и я хочу сохранить безопасную загрузку)

130

Я обновляю Ubuntu 15.10 до 16.04, и с тех пор VirtualBox 5.0.18 больше не запускает мои виртуальные машины. Он жалуется, что vboxdrv не загружен. Поэтому я пытаюсь загрузить его и получаю следующую ошибку:

$ sudo modprobe vboxdrv
modprobe: ERROR: could not insert 'vboxdrv': Required key not available

Я считаю, что это связано с безопасной загрузкой, которую я использую и которую я хочу продолжать использовать. На самом деле с Ubuntu 15.10 безопасная загрузка и VirtualBox работали просто отлично.

Также я попытался, $ sudo apt-get --reinstall install virtualbox-dkmsкоторый успешно собрал модуль ядра, но не решил эту проблему.

Любая идея, как загрузить vboxdrv при сохранении безопасной загрузки?

Обновление 2 : также я попытался выполнить sudo mokutil --disable-validation. При выполнении этой команды во время следующей загрузки мне предлагается отключить безопасную загрузку, добавить ключ или хэш с диска. Поскольку я не хочу отключать безопасную загрузку, похоже, это тоже не решает мою проблему. Также я хочу оставить UEFI активным для параллельной установки Windows.

Примечание . Если вы не против отключить безопасную загрузку, см. Почему я получаю «Требуемый ключ недоступен» при установке модулей ядра сторонних производителей или после обновления ядра? вместо.

Янс
источник
Хотя этот вопрос является дубликатом askubuntu.com/questions/762254/… , этот вопрос не содержит ответа, данного @Majal ниже.
zwets
1
Пошаговое руководство: stegard.net/2016/10/virtualbox-secure-boot-ubuntu-fail
Душан Мажар
FWIW, для googlers: в ​​Ubuntu 18.04 при установке aptitude install virtualbox virtualbox-dkms вы подпишете модуль и попросите ввести одноразовый (?) Пароль. Перезагрузитесь, введите MOK config и введите ключ, используя этот пароль.
Рафаэль

Ответы:

177

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

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

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

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

    Опция : для дополнительной безопасности пропустите ключ -nodes, который запросит пароль. Затем, прежде чем перейти к следующему шагу, обязательноexport KBUILD_SIGN_PIN='yourpassword'

  2. Подпишите модуль (vboxdrv для этого примера, но повторите для других модулей ls $(dirname $(modinfo -n vboxdrv))/vbox*.ko)для полной функциональности)

    sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv)
    
  3. Подтвердите, что модуль подписан

    tail $(modinfo -n vboxdrv) | grep "Module signature appended"
    
  4. Зарегистрируйте ключи для безопасной загрузки

    sudo mokutil --import MOK.der
    

    который попросит ввести пароль для подтверждения импорта на следующем шаге.

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

  6. Подтвердите, что ключ зарегистрирован

    mokutil --test-key MOK.der
    

Если VirtualBox по-прежнему не загружается, это может быть из-за того, что модуль не загрузился ( sudo modprobe vboxdrvисправит это) или ключ не подписан. Просто повторите этот шаг, и все должно работать нормально.

Ресурсы: Подробная статья на сайте для реализации подписания модулей в Fedora и Ubuntu . @zwets для дополнительной безопасности . @shasha_trn за упоминание всех модулей .

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

Majal
источник
7
Я также подписал модули vboxnetadp, vboxnetflt, vboxpci, чтобы иметь в сети виртуальные машины и устройства pass-throw pci.
sasha_trn
4
Расширяя ответ @ majal, я должен был выполнить, sudo apt install --reinstall virtualbox-dkmsпрежде чем следовать предоставленным инструкциям.
TylersSN
1
@zwets, не могли бы вы рассказать, как правильно установить KBUILD_SIGN_PINпеременную среды? export KBUILD_SIGN_PIN=passwordи export KBUILD_SIGN_PIN="password"до шага 2 оба привели кSSL error:0907B068:PEM routines:PEM_READ_BIO_PRIVATEKEY:bad password read: pem_pkey.c:117
adempewolff
3
@adempewolff Если ваш пароль содержит символы, которые интерпретирует ваша оболочка (например, «$» в строке в кавычках), вам нужно заключить его в апострофы (').
zwets
1
@ Majal Спасибо за ваш ответ! Я также предпочитаю подписывать модули, а не отключать эту функцию. Я могу добавить: (1) Это также относится к модулям VMware «vmmon» и «vmnet», которые имеют одинаковую судьбу. (2) При добавлении созданных ключей выбирайте пароль с умом. На этапе регистрации перезагрузки и безопасной загрузки раскладка клавиатуры может отличаться от настроек локали. (-> US-Layout)
-мегабайтный
15

В моей системе я сделал следующее, чтобы она заработала:

Запустите mokutil:

sudo mokutil --disable-validation

Затем mokutil попросил меня установить пароль для менеджера MOK. После перезагрузки ПК в BIOS появилось диалоговое окно для настройки MOK Manager. Я отключил SecureBoot из этого диалога, он запрашивал несколько символов из пароля (т. Е. Введите символ (5) и т. Д.).

После загрузки модули vboxdrv загружаются правильно.

lsmod | grep vboxdrv
vboxdrv               454656  3 vboxnetadp,vboxnetflt,vboxpci

Любопытно, что mokutil все еще показывает, что SecureBoot включен:

sudo mokutil --sb-state
SecureBoot enabled
Pocho
источник
9
Как указано в моем вопросе, я хочу продолжить использовать безопасную загрузку. Таким образом, отключение безопасной загрузки не решает проблему.
Янв
2
Я не хотел отключать безопасную загрузку, но в конце концов должен был сделать это, так как больше ничего не сработало бы - не хочу начинать подписывать вещи каждый раз, когда происходит обновление ядра. Жаль, что это единственное простое решение. Кстати, UEFI все еще говорит, что безопасная загрузка включена. ¯_ (ツ) _ / ¯
jaywink
4

Вы можете отключить проверку

sudo apt install mokutil
sudo mokutil --disable-validation

После этого следует установить пакеты DKMS.

Pilot6
источник
2
Также я попытался выполнить sudo mokutil --disable-validation. При выполнении этой команды во время следующей загрузки мне предлагается отключить безопасную загрузку, добавить ключ или хэш с диска. Поскольку я не хочу отключать безопасную загрузку, похоже, это тоже не решает мою проблему. Пожалуйста, дайте мне знать, если я неправильно понял эту команду.
Янв
2
Попробуйте отключить безопасную загрузку. Вы можете включить его обратно, если это не поможет.
Pilot6
Я пытался отключить безопасную загрузку - но она все еще включена :( (ubuntu 18.04)
xhudik
0

Я получил ошибку о vboxdrv после обновления тоже. Но была проблема со старой версией (5.0.14) Oracle VM VirtualBox Extension Pack. Я скачал и установил более новую версию (5.0.18) этого пакета, и проблема исчезла.

Reling
источник
Эй, не могли бы вы уточнить? Откуда ты это скачал? PPA или файл deb?
Картик Нишант
1
Я скачал пакет расширений из загрузок на сайте VirtualBox , ссылка «VirtualBox 5.0.18 Oracle VM VirtualBox Extension Pack -> Все поддерживаемые платформы ». Затем я открыл Файл> Настройки в Oracle VM Virtual Box Manager, выбрал «Расширения» и добавил загруженный файл в список. Он заменил старую версию «Oracle VM VirtualBox Extension Pack» (была 5.0.14rxxxxxx).
Релинг
1
Пакет расширений не исправляет ошибку. Ошибка при подписании модуля
Картик Нишант
Это не относится к моей проблеме.
Янв
1
Это не связано с проблемой ОП. Сообщение об ошибке «Обязательный ключ недоступен» означает, что проблема связана с неподписанным модулем ядра на платформе с безопасной загрузкой. Никакое обновление VirtualBox не может исправить это, если оно не включает модуль, подписанный с использованием ключа, которому доверяет ядро. То есть либо Canonical должна подписать его, либо Oracle должен подписать его, и его открытый ключ должен быть добавлен к доверенным ключам ядра (или вашей платформы).
zwets
0

Хорошо, после небольшого тестирования я почти уверен, что это проблема безопасной загрузки.

Как в случае, если он включен, то это бросается:

ВНИМАНИЕ: модуль ядра vboxdrv не загружен. Либо нет доступного модуля для текущего ядра (4.4.0-21-generic), либо его не удалось загрузить. Пожалуйста, перекомпилируйте модуль ядра и установите его с помощью установки sudo / sbin / rcvboxdrv

Однако, если безопасная загрузка отключена, то Virtualbox загружается просто без ошибок.

У меня все еще мой биос установлен как UEFI.

Дэвид Хейнс
источник
3
Как указано в моем вопросе, я хочу продолжить использовать безопасную загрузку. Таким образом, отключение безопасной загрузки не решает проблему.
Янв
0

У меня была та же проблема сегодня, у меня были Windows 10 и Ubuntu 15.10 при двойной загрузке с включенным UEFI на Bios (я не отключил его, чтобы я мог запустить предустановленную Windows).

После обновления до Ubuntu 16.04 VirtualBox перестал загружать мои виртуальные машины с тем же сообщением об ошибке:

modprobe: ERROR: could not insert 'vboxdrv': Required key not available

Я подозревал проблему UEFI, потому что при обновлении установщик спросил меня, хочу ли я отключить его, на что я ответил «Нет» (потому что «Да» может сделать мою Windows непригодной для использования).

Что я сделал, так это перешел в Bios и включил поддержку устаревшей загрузки BIOS БЕЗ отключения безопасной загрузки.

Виртуалбокс теперь работает нормально.

Обновление : как правильно заметил @zwets в комментарии, включение устаревших модулей приводит к отключению безопасной загрузки.

Zeine77
источник
2
На самом деле мне также нужен UEFI для загрузки параллельной установки Windows. Так что отключить это тоже не вариант для меня. Я обновил свой вопрос соответственно.
Янв
Вы включили поддержку устаревших модулей BIOS? Это еще одна опция в биографии UEFI, отличная от безопасной загрузки.
Zeine77
1
@ Zeine77, можете ли вы убедиться, что ваш BIOS позволяет включать «устаревшие модули», пока включена безопасная загрузка ? Это крайне маловероятно, поскольку первый вариант позволяет ненадежному коду запускаться в пространстве ядра, что противоречит цели второго.
zwets
@zwets вы правы, я только что проверил мои настройки BIOS; и включение устаревших модулей приводило к отключению безопасной загрузки. Как я объяснил в ответе, я предположил, что отключение безопасной загрузки приведет к сбою загрузки Windows 10, но это не так. Когда я впервые установил 15.10 (несколько месяцев назад), я старался не отключать безопасную загрузку, так как это повредит установке Win 10. Значит ли это, что предустановленная Win 10 нормально работает с отключенным защищенным режимом?
Zeine77