Установите VirtualBox, сохраняя Secure Boot
Я пытаюсь установить VirtualBox на Ubuntu 16.04, сохраняя Secure Boot. Когда я установил его через Synaptic, меня попросили удалить SecureBoot, я сказал No
,
Я следовал этим инструкциям: не удалось загрузить vboxdrv после обновления до Ubuntu 16.04 (и я хочу сохранить безопасную загрузку) и https://stegard.net/2016/10/virtualbox-secure-boot-ubuntu-fail/ Оба почти то же самое (я оставил файлы MOK в каталоге /root, как во второй ссылке). Кажется, все работает нормально, я перезагрузился, снова поставил пароль, перезагрузил. Все хорошо
Но потом, когда я пытаюсь использовать VirtualBox, он все равно не работает. Если я запускаю его из терминала, я получаю:
WARNING: The character device /dev/vboxdrv does not exist.
Please install the virtualbox-dkms package and the appropriate
headers, most likely linux-headers-generic.
You will not be able to start VMs until this problem is fixed.
Но эти два пакета уже установлены и обновлены.
В одном из комментариев в верхнем ответе другого поста сказано переустановить virtualbox-dkms
прежде чем следовать этим инструкциям. Я попробовал и тот же результат.
Я попробовал ответ здесь: Проблема с установкой VirtualBox, который снова заставляет меня спросить, хочу ли я отключить безопасную загрузку, на что я отвечаю No
и обратно на круги своя.
Если я бегу modprobe
Я получил:modprobe: ERROR: could not insert 'vboxdrv': Required key not available
Любая идея о том, как заставить VirtualBox работать с включенным SecureBoot (пожалуйста, воздержитесь от указания мне удалить его...)?
Спасибо
1 ответ
Я не пробовал ни одну из этих процедур. Я, однако, делаю это по-другому - но это очень утомительный метод. Это описание покажет, что это проще, потому что я ссылаюсь на большую страницу, которую я написал, которая покрывает худшие из утомительных частей. Моя процедура:
- Возьмите под контроль безопасную загрузку - в моем случае я настроил свой компьютер так, чтобы встраивать свой собственный открытый ключ безопасной загрузки в прошивку. Таким образом, мне не нужно использовать Shim или MOKs. Я удалил ключи Microsoft и добавил свои собственные и ключи Canonical на компьютер, на котором я использую эту процедуру, но вы можете настроить свои так, как вам нравится. Важнейшей частью вашего вопроса является то, что вы должны включить сгенерированный вами ключ с закрытым ключом, который вы сохраните, чтобы он работал. Вам также понадобятся ключи, используемые для подписи стандартных компонентов - ключ Canonical, открытый ключ Microsoft на рынке или оба этих ключа. Если вы используете двойную загрузку с Windows, вам понадобится открытый ключ, который Microsoft использует для подписи собственного загрузчика. См. Эту мою страницу для всех кровавых деталей - но знайте, что это утомительная и привередливая процедура, так что вы можете потратить довольно много времени на то, чтобы эта часть работала. Обратите внимание, что большинство UEFI позволяют довольно легко восстановить стандартный набор ключей, поэтому риск, связанный с выполнением этой процедуры, невелик.
- Подписаниемодулей VirtualBox. Следующим шагом является подписание модулей ядра VirtualBox. Это делается почти так же, как и страницы, на которые вы ссылаетесь; Тем не менее, у меня есть скрипт, чтобы помочь автоматизировать этот процесс (см. ниже).
- Загрузите модуль VirtualBox. После подписания модули должны быть загружены. Это должно произойти автоматически при перезагрузке; но если вы хотите использовать VirtualBox без перезагрузки, вы должны явно использовать
modprobe
для каждого из модулей (vboxdrv
,vboxnetflt
,vboxpci
, а такжеvboxnetadp
). - Повторите шаги 2-3 после каждого обновления ядра. После обновления ядра шаги 2 и 3 необходимо повторить.
Для удобства я написал скрипт для выполнения шагов № 2 и № 3 в одной команде. Я называю это sign-vbox
, Вот:
#!/bin/bash
# sign-vbox script, copyright (c) 2017 by Rod Smith
# Distributed under the terms of the GPLv3
if [ "$#" -ne 1 ] && [ "$#" -ne 0 ]; then
echo "Usage: $0 [ {kernel-version} ]"
exit 1
fi
if [ "$#" == 0 ]; then
kernel_version=$(uname -r)
else
kernel_version="$1"
fi
sign_file=$(find /usr/src/ -name sign-file | tail -n 1)
if [ -z $sign_file ]; then
echo "Can't find the sign-file binary! Exiting!"
exit 1
else
path_to_modules="/lib/modules/$kernel_version/updates/dkms"
if [ ! -f $path_to_modules/vboxdrv.ko ]; then
echo "Could not find $path_to_modules/vboxdrv.ko!"
echo "Is the kernel version correct?"
exit 1
fi
echo "Signing modules for $kernel_version"
$sign_file sha256 /etc/refind.d/keys/refind_local.key /etc/refind.d/keys/refind_local.cer $path_to_modules/vboxdrv.ko
$sign_file sha256 /etc/refind.d/keys/refind_local.key /etc/refind.d/keys/refind_local.cer $path_to_modules/vboxnetadp.ko
$sign_file sha256 /etc/refind.d/keys/refind_local.key /etc/refind.d/keys/refind_local.cer $path_to_modules/vboxnetflt.ko
$sign_file sha256 /etc/refind.d/keys/refind_local.key /etc/refind.d/keys/refind_local.cer $path_to_modules/vboxpci.ko
modprobe vboxdrv
modprobe vboxnetflt
modprobe vboxpci
modprobe vboxnetadp
echo "Loaded vbox modules:"
lsmod | grep vbox
fi
Чтобы использовать этот скрипт, просто введите его имя. Он подписывает модули VirtualBox, связанные с работающим в данный момент ядром. Если вы передадите ему номер версии ядра, он должен подписать ядра, связанные с этой версией ядра, но при указании номера версии ядра нет места ошибкам. (Ожидается тот же формат, что uname -r
вернулся бы, если бы ядро работало.)
Обратите внимание, что скрипт ожидает найти приватный (refind_local.key
) и публичный (refind_local.cer
) ключи в /etc/refind.d/keys/
, Вам придется изменить это местоположение для вашей собственной системы, если только вы не используете rEFInd и не используете для него локальные ключи. Файл закрытого ключа должен быть максимально безопасным, например 0400 (-r--------
) разрешения. Ограничение доступа к самому каталогу также может быть полезным. А еще лучше, поместите его на USB-накопитель, который вы подключаете только при запуске этой команды.
Кроме того, я написал этот скрипт для личного использования. Вероятно, в нем есть ошибки, особенно если они используются не так, как я ожидаю. Конечно, это очень плохо, если необходимые исходные файлы ядра не установлены.
Вполне возможно, что этот сценарий будет работать с методами на основе MOK, которые вы пытались использовать, если вы указали его на ключевые файлы, которые вы сгенерировали, публичный файл которых вы загрузили в MOK. Однако я не могу этого обещать, и, конечно, ваши проблемы могут быть связаны с неправильно подписанными модулями ядра или проблемами на стороне Shim/MOK. Использование этого скрипта поможет, только если ваши модули ядра не были должным образом подписаны.
VirtualBox 6.1 будет установлен на 19.10 с включенной безопасной загрузкой.