升级到Ubuntu 16.04后无法加载’vboxdrv’(我想保持安全启动)

我从Ubuntu 15.10升级到16.04,从那以后VirtualBox 5.0.18不再启动我的VM了。 它抱怨’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 。 执行此命令时,在下次引导期间,系统会提示您禁用安全引导,从磁盘添加密钥或哈希。 由于我不想禁用安全启动,似乎这也无法解决我的问题。 此外,我想为并行Windows安装激活UEFI。

注意 :如果您不介意禁用安全启动,请参阅安装第三方内核模块或内核升级后为什么会出现“必需密钥不可用”? 代替。

从内核版本4.4.0-20开始,强制要求在启用安全启动的情况下不允许运行未签名的内核模块。 因为您希望保持安全启动,所以下一个逻辑步骤是签署这些模块。

所以让我们试试吧。

  1. 创建签名密钥

     openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Descriptive common name/" 

    选项 :为了提高安全性,请跳过-nodes开关,它会要求输入密码。 然后在继续下一步之前,确保export KBUILD_SIGN_PIN='yourpassword'

  2. 签署模块(此示例为vboxdrv,但重复ls $(dirname $(modinfo -n vboxdrv))/vbox*.ko)其他模块以获取完整function)

     sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv) 
  3. 确认模块已签名

     tail $(modinfo -n vboxdrv) | grep "Module signature appended" 
  4. 将密钥注册到安全启动

     sudo mokutil --import MOK.der 

    这将要求在下一步中使用密码来确认导入。

  5. 重新启动并按照说明注册MOK(机器所有者密钥)。 这是一个带图片的示例 。 系统将再次重启。

  6. 确认密钥已注册

     mokutil --test-key MOK.der 

如果VirtualBox仍然没有加载,可能是因为模块没有加载( sudo modprobe vboxdrv会修复它)或者密钥没有签名。 只需重复这一步,一切都应该正常。

资源: Fedora和Ubuntu实现模块签名的详细网站文章 。 @zwets提供额外的安全性 。 @shasha_trn 提到所有模块 。

附加资源:我每次virtualbox-dkms升级时都会创建一个bash脚本供我自己使用,从而覆盖已签名的模块。 在GitHub上查看我的vboxsign 。

在我的系统上,我做了以下工作以使其工作:

运行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 

您可以通过禁用validation检查

 sudo apt install mokutil sudo mokutil --disable-validation 

之后应该安装DKMS包。

升级后我也遇到了关于vboxdrv的错误。 但是Oracle VM VirtualBox Extension Pack的旧版本(5.0.14)存在问题。 我下载并安装了这个包的更新版本(5.0.18),问题就消失了。

好吧,经过一些测试,我很确定这是一个安全启动问题。

如果它已启用,那么抛出:

警告:未加载vboxdrv内核模块。 当前内核没有可用的模块(4.4.0-21-generic)或者无法加载。 请重新编译内核模块并通过sudo / sbin / rcvboxdrv安装程序进行安装

但是,如果禁用安全启动,则虚拟机可以正常加载而不会出现错误。

我仍然将我的BIOS设置为UEFI。

我今天遇到了同样的问题,我在双启动时使用了Windows 10和Ubuntu 15.10,在Bios上启用了uefi(我没有禁用它,所以我可以运行预安装的Windows)。

升级到Ubuntu 16.04后,VirtualBox停止加载我的VM,并显示相同的错误消息:

 modprobe: ERROR: could not insert 'vboxdrv': Required key not available 

我怀疑UEFI问题,因为升级安装程序时问我是否要禁用它,我回复了否(因为是可能使我的Windows无法使用)。

我所做的是转到Bios并支持传统BIOS启动而不禁用安全启动。

Virtualbox现在运行正常。

更新 :正如@zwets在评论中正确指出的那样,启用旧模块会导致禁用安全启动。