安装 VirtualBox 并保持安全启动

安装 VirtualBox 并保持安全启动

我正在尝试在 Ubuntu 16.04 上安装 VirtualBox,同时保留安全启动。当我通过 Synaptic 安装它时,系统要求我删除安全启动,我说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.

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

另一篇文章顶部答案中的一条评论说,virtualbox-dkms在按照这些说明操作之前,请重新安装。我试过了,结果是一样的。

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

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

关于如何让 VirtualBox 在启用 SecureBoot 的情况下工作,您有什么想法吗(请不要告诉我将其删除...)?

谢谢

答案1

我没有尝试过这两种方法。不过,我可以用不同的方法做到这一点——但这是一种非常繁琐的方法。这个描述会让它看起来比这更容易,因为我参考了我写的一个很长的页面,其中涵盖了繁琐部分中最糟糕的部分。我的程序是:

  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

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

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

另外,我编写此脚本是为了个人使用。它可能有错误,特别是如果以我意想不到的方式使用。如果没有安装必要的内核源文件,它肯定会失败。

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

答案2

VirtualBox 6.1 将在 19.10 上安装并启用安全启动。

相关内容