我正在尝试在 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
我没有尝试过这两种方法。不过,我可以用不同的方法做到这一点——但这是一种非常繁琐的方法。这个描述会让它看起来比这更容易,因为我参考了我写的一个很长的页面,其中涵盖了繁琐部分中最糟糕的部分。我的程序是:
- 控制安全启动-- 就我而言,我已将计算机配置为在固件中嵌入自己的安全启动公钥。这样我就不需要使用 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
) 和公钥 ( refind_local.cer
) /etc/refind.d/keys/
。除非您使用 rEFInd 并使用本地密钥,否则您必须根据自己的系统更改该位置。私钥文件应尽可能安全,例如具有 0400 ( -r--------
) 权限。限制对目录本身的访问也可能有帮助。更好的方法是将其放在 USB 闪存驱动器上,仅在运行此命令时插入。
另外,我编写此脚本是为了个人使用。它可能有错误,特别是如果以我意想不到的方式使用。如果没有安装必要的内核源文件,它肯定会失败。
可以想象,如果您将脚本指向您生成的密钥文件(即您将其公共文件加载到 MOK 中),该脚本将与您尝试使用的基于 MOK 的方法兼容。不过,我不能保证这一点,当然,您的问题可能是由于内核模块签名不正确或 Shim/MOK 端存在问题。仅当您的内核模块未正确签名时,使用此脚本才会有帮助。
答案2
VirtualBox 6.1 将在 19.10 上安装并启用安全启动。