Установка VirtualBox при сохранении безопасности

Я пытаюсь установить VirtualBox на Ubuntu 16.04, сохраняя безопасную загрузку.

Я выполнил следующие инструкции: Не удалось загрузить «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 перед выполнением этих инструкций. Я попытался, и тот же результат.

Я попробовал ответить здесь: Не удалось загрузить «vboxdrv» после обновления до Ubuntu 16.04 (и я хочу сохранить безопасную загрузку) Что подсказывает мне снова спросить, хочу ли я отключить безопасную загрузку, к которой я говорю No, и обратно к квадрату.

Если я запустил modprobe, я получаю: modprobe: ERROR: could not insert 'vboxdrv': Required key not available

Любая идея о том, как заставить VirtualBox работать с включенным SecureBoot (пожалуйста, воздержитесь от того, чтобы мне было сказано удалить его ...)?

thanks

4
задан 15 May 2017 в 08:18

3 ответа

Я не пробовал ни одну из этих процедур. Однако я делаю это по-другому, но это очень утомительный метод. Это описание упростит это, потому что я ссылаюсь на большую страницу, которую я написал, которая покрывает худшие из утомительных частей. Моя процедура:

Возьмите под свой контроль Безопасную загрузку. В моем случае я настроил свой компьютер так, чтобы я встроил свой собственный открытый ключ Secure Boot в прошивку. Таким образом, мне не нужно использовать Shim или MOK. Я удалил ключи от 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) и public (refind_local.cer) в /etc/refind.d/keys/. Вам придется изменить это место для своей собственной системы, если вы не используете rEFInd и не используете для этого локальные ключи. Файл закрытого ключа должен быть таким же безопасным, как вы можете его сделать, например, иметь разрешения 0400 (-r--------). Также может оказаться полезным ограниченный доступ к самому каталогу. Еще лучше, поставьте его на флэш-накопитель USB, который вы подключаете только при выполнении этой команды.

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

Можно предположить, что этот скрипт будет работать с методами на основе MOK, которые вы пытались использовать, если вы указали его на файлы ключей, которые вы создали , публичный файл которого вы загрузили в MOK. Однако я не могу этого обещать, и, конечно, ваши проблемы могут быть вызваны неправильным образом подписанными модулями ядра или проблемами на конце Shim / MOK. Использование этого скрипта поможет только в том случае, если ваши модули ядра не были правильно подписаны.

4
ответ дан 22 May 2018 в 22:38
  • 1
    Большое спасибо! Читая ответ, я понял, что пропустил шаг в другом посте, с которым я связался. Мне не нужно было делать свой первый шаг, но я сохранил ваш очень удобный сценарий;). Кроме того, для будущих читателей у меня возникла проблема при попытке запустить виртуальную машину, потому что ускорение VM было отключено. Для справки: askubuntu.com/questions/256792/… – ddeunagomez 15 May 2017 в 01:20
  • 2
    Пропуск шага часто вызывает проблемы! ;) Скрипт помогает сделать это менее вероятным. – Rod Smith 15 May 2017 в 04:59

Я не пробовал ни одну из этих процедур. Однако я делаю это по-другому, но это очень утомительный метод. Это описание упростит это, потому что я ссылаюсь на большую страницу, которую я написал, которая покрывает худшие из утомительных частей. Моя процедура:

Возьмите под свой контроль Безопасную загрузку. В моем случае я настроил свой компьютер так, чтобы я встроил свой собственный открытый ключ Secure Boot в прошивку. Таким образом, мне не нужно использовать Shim или MOK. Я удалил ключи от 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) и public (refind_local.cer) в /etc/refind.d/keys/. Вам придется изменить это место для своей собственной системы, если вы не используете rEFInd и не используете для этого локальные ключи. Файл закрытого ключа должен быть таким же безопасным, как вы можете его сделать, например, иметь разрешения 0400 (-r--------). Также может оказаться полезным ограниченный доступ к самому каталогу. Еще лучше, поставьте его на флэш-накопитель USB, который вы подключаете только при выполнении этой команды.

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

Можно предположить, что этот скрипт будет работать с методами на основе MOK, которые вы пытались использовать, если вы указали его на файлы ключей, которые вы создали , публичный файл которого вы загрузили в MOK. Однако я не могу этого обещать, и, конечно, ваши проблемы могут быть вызваны неправильным образом подписанными модулями ядра или проблемами на конце Shim / MOK. Использование этого скрипта поможет только в том случае, если ваши модули ядра не были правильно подписаны.

4
ответ дан 18 July 2018 в 13:19

Я не пробовал ни одну из этих процедур. Однако я делаю это по-другому, но это очень утомительный метод. Это описание упростит это, потому что я ссылаюсь на большую страницу, которую я написал, которая покрывает худшие из утомительных частей. Моя процедура:

Возьмите под свой контроль Безопасную загрузку. В моем случае я настроил свой компьютер так, чтобы я встроил свой собственный открытый ключ Secure Boot в прошивку. Таким образом, мне не нужно использовать Shim или MOK. Я удалил ключи от 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) и public (refind_local.cer) в /etc/refind.d/keys/. Вам придется изменить это место для своей собственной системы, если вы не используете rEFInd и не используете для этого локальные ключи. Файл закрытого ключа должен быть таким же безопасным, как вы можете его сделать, например, иметь разрешения 0400 (-r--------). Также может оказаться полезным ограниченный доступ к самому каталогу. Еще лучше, поставьте его на флэш-накопитель USB, который вы подключаете только при выполнении этой команды.

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

Можно предположить, что этот скрипт будет работать с методами на основе MOK, которые вы пытались использовать, если вы указали его на файлы ключей, которые вы создали , публичный файл которого вы загрузили в MOK. Однако я не могу этого обещать, и, конечно, ваши проблемы могут быть вызваны неправильным образом подписанными модулями ядра или проблемами на конце Shim / MOK. Использование этого скрипта поможет только в том случае, если ваши модули ядра не были правильно подписаны.

4
ответ дан 24 July 2018 в 20:09

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

Похожие вопросы: