在保持安全启动的同时安装 VirtualBox

exc*_*491 10 virtualbox uefi secure-boot

我正在尝试在 Ubuntu 16.04 上安装 VirtualBox,同时保持安全启动。当我通过 Synaptic 安装它时,我被要求删除 SecureBoot,我说No

我遵循以下说明: 升级到 Ubuntu 16.04 后无法加载“vboxdrv”(我想保持安全启动)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.
Run Code Online (Sandbox Code Playgroud)

但是这两个软件包已经安装并且是最新的。

另一篇文章的最佳答案中的评论说virtualbox-dkms在遵循这些说明之前重新安装。我试过了,结果一样。

我在这里尝试了答案: VirtualBox 的安装问题 这再次提示我询问是否要禁用安全启动,我说No,然后回到第一个。

如果我跑modprobe我得到: modprobe: ERROR: could not insert 'vboxdrv': Required key not available

关于如何让 VirtualBox 在启用 SecureBoot 的情况下工作的任何想法(请不要告诉我删除它......)?

谢谢

Rod*_*ith 9

我没有尝试过这些程序中的任何一个。但是,我确实以不同的方式执行此操作 - 但这是一种非常乏味的方法。这个描述看起来比那更容易,因为我参考了我写的一个大页面,它涵盖了最乏味的部分。我的程序是:

  1. 控制安全启动——就我而言,我已经配置了我的计算机,以便在固件中嵌入我自己的安全启动公钥。这样我就不需要使用 Shim 或 MOK。我已经从使用此过程的计算机中删除了 Microsoft 的密钥,并将我自己的和 Canonical 的密钥添加到了我的计算机上,但是您可以使用您喜欢的任何键来设置您的密钥。就您的问题而言,关键部分是您必须包含您生成的密钥,以及您保留以使其工作的私钥。您还需要用于签署标准组件的密钥——Canonical 的密钥、Microsoft 的公共市场密钥,或两者兼而有之。如果您使用 Windows 进行双引导,您将需要 Microsoft 用来签署自己的引导加载程序的公钥。对于所有血腥的细节——但请注意,这是一个乏味和挑剔的过程,因此您可能会花费相当长的时间来使这部分工作。请注意,大多数 UEFI 可以非常轻松地恢复标准密钥集,因此尝试此过程所涉及的风险很低。
  2. 签署 VirtualBox 模块——下一步是签署 VirtualBox 内核模块。这与您链接到的页面描述的方式几乎相同;但是,我有一个脚本来帮助自动化这个过程(见下文)。
  3. 加载 VirtualBox 模块——签署模块后,必须加载它们。这应该在重新启动时自动发生;但如果你想使用VirtualBox的,无需重新启动,则必须明确地使用modprobe每个模块(vboxdrvvboxnetfltvboxpcivboxnetadp)。
  4. 每次内核更新后重复第 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
Run Code Online (Sandbox Code Playgroud)

要使用此脚本,只需键入其名称。它对与当前运行的内核相关联的 VirtualBox 模块进行签名。如果您向它传递内核版本号,它应该签署与该内核版本相关联的内核,但在指定内核版本号时没有错误的余地。(它期望在uname -r内核运行时返回的相同格式。)

请注意,脚本期望找到私人(refind_local.key)和大众(refind_local.cer)的按键/etc/refind.d/keys/。您必须为自己的系统更改该位置,除非您使用 rEFInd 并为其使用本地密钥。私钥文件应该尽可能安全,例如具有 0400 ( -r--------) 权限。限制对目录本身的访问也可能有帮助。更好的是,将它放在 USB 闪存驱动器上,只有在运行此命令时才插入该驱动器。

另外,我写了这个脚本供我个人使用。它可能有错误,特别是如果以我不期望的方式使用。如果没有安装必要的内核源文件,它肯定会失败得很厉害。

可以想象,如果您将脚本指向您生成的密钥文件(您加载到 MOK 中的公共文件),那么该脚本将适用于您尝试使用的基于 MOK 的方法。不过,我不能保证这一点,当然,您的问题可能是由于未正确签名的内核模块或 Shim/MOK 端的问题造成的。仅当您的内核模块未正确签名时,使用此脚本才有帮助。


归档时间:

查看次数:

26600 次

最近记录:

5 年,10 月 前