问题描述
我从Ubuntu 15.10升级到16.04,从此VirtualBox 5.0.18不再启动我的虚拟机了。它抱怨’vboxdrv’未加载。所以我尝试加载它并得到以下错误:
$ sudo modprobe vboxdrv
modprobe: ERROR: could not insert 'vboxdrv': Required key not available
我相信它与我使用的安全启动有关,并且我想继续使用它。实际上,Ubuntu 15.10安全启动和VirtualBox工作得很好。
我也尝试过成功构建内核模块的$ sudo apt-get --reinstall install virtualbox-dkms
,但没有解决这个问题。
任何想法如何获得vboxdrv加载,同时保持启动安全启动?
更新2:我也尝试执行sudo mokutil --disable-validation
。执行此命令时,在下次启动时,系统会提示您禁用安全引导,从磁盘添加密钥或散列。由于我不想禁用安全引导,因此似乎也不能解决我的问题。另外我想保持UEFI在并行Windows安装中激活。
注意:如果您不介意禁用安全引导,请参阅Why do I get “Required key not available” when install 3rd party kernel modules or after a kernel upgrade?。
最佳解决方案
自内核版本4.4.0-20开始,强制执行未启用安全引导的未签名内核模块将不被允许运行。因为你想保持安全启动,那么下一个逻辑步骤就是签署这些模块。
所以我们试试吧。
-
创建签名密钥
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Descriptive name/"
选项:为了增加安全性,请跳过-nodes开关,它将要求输入密码。然后在继续下一步之前,确保
export KBUILD_SIGN_PIN='yourpassword'
-
对模块进行签名(本例为vboxdrv,但重复
ls $(dirname $modinfo -n vboxdrv))/vbox*.ko)
中的其他模块以获得全部功能)sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv)
-
确认模块已签名
tail $(modinfo -n vboxdrv) | grep "Module signature appended"
-
将密钥注册到安全引导
sudo mokutil --import MOK.der
这将要求输入密码以确认下一步的导入。
-
重新启动并按照说明注册MOK(机器所有者密钥)。这里有一张带有图片的sample。系统将重新启动一次。
-
确认密钥已注册
mokutil --test-key MOK.der
如果VirtualBox仍然无法加载,可能是因为该模块未加载(sudo modprobe vboxdrv
将修复该问题)或该密钥未被签名。只需重复这一步,一切都应该正常工作。
资源:模块签名的详细网站article for Fedora和Ubuntu implementation。 @zwets用于additional security。 @ shasha_trn用于mentioning all the modules。
其他资源:每次virtualbox-dkms
升级时,我都会创建一个bash脚本供我自己使用,从而覆盖已签名的模块。看看我的vboxsign on GitHub。
次佳解决方案
在我的系统上,我做了以下工作:
运行mokutil:
sudo mokutil --disable-validation
然后mokutil要求我为MOK管理器设置一个密码。重新启动PC后,BIOS显示一个对话框来配置MOK管理器。我从此对话框中禁用了SecureBoot,它从密码中请求了几个字符(即输入字符(5)等)。
启动正确加载的vboxdrv模块后。
lsmod | grep vboxdrv
vboxdrv 454656 3 vboxnetadp,vboxnetflt,vboxpci
奇怪的是,mokutil仍然显示启用了SecureBoot:
sudo mokutil --sb-state
SecureBoot enabled
第三种解决方案
您可以通过禁用验证检查
sudo apt install mokutil
sudo mokutil --disable-validation
之后DKMS包应该安装。