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


130

我从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。执行此命令时,在下次启动时,系统提示我禁用安全启动,从磁盘添加密钥或哈希。由于我不想禁用安全启动,因此这似乎也无法解决我的问题。另外,我想保持UEFI激活以进行并行Windows安装。

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



尽管此问题与askubuntu.com/questions/762254/…重复,该问题不包含以下@Majal给出的答案。
zwets


FWIW,对于Google员工:在Ubuntu 18.04中,安装aptitude install virtualbox virtualbox-dkms 将对模块进行签名,并要求您输入一次(?)密码。重新启动,输入MOK config并使用该密码注册密钥。
拉斐尔

Answers:


177

从内核版本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)获取完整功能)

    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将解决该问题)或密钥未签名。只需重复此步骤,一切都应该正常工作。

资源:有关FedoraUbuntu实现模块签名的详细网站文章。@zwets可以提高安全性。@shasha_trn 提及所有模块

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


7
我还对vboxnetadp,vboxnetflt,vboxpci模块进行了签名,以在虚拟机中拥有网络并传递throw pci设备。
sasha_trn '15

4
扩展@majal的答案,我必须sudo apt install --reinstall virtualbox-dkms在遵循提供的说明之前执行。
TylersSN

1
@zwets您能否详细说明如何正确设置KBUILD_SIGN_PIN环境变量? export KBUILD_SIGN_PIN=passwordexport KBUILD_SIGN_PIN="password"在步骤2之前都导致SSL error:0907B068:PEM routines:PEM_READ_BIO_PRIVATEKEY:bad password read: pem_pkey.c:117
adempewolff

3
@adempewolff如果您的密码包含外壳程序将解释的字符(例如,带引号的字符串中的“ $”),则需要将其括在撇号(')中。
zwets

1
@Majal谢谢您的回答!我也更喜欢对模块进行签名而不是禁用功能。我可以添加:(1)这也适用于命运相同的VMware模块“ vmmon”和“ vmnet”。(2)在添加创建的密钥时,请明智地选择密码。在重新引导和安全引导注册阶段,您的键盘布局可能与区域设置不同。(-> US-Layout)
2016年

15

在我的系统上,我执行了以下操作以使其正常工作:

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

9
如我的问题所述,我想继续使用安全启动。因此,禁用安全启动并不能解决问题。
2016年

2
不想禁用安全启动,但最后不得不这样做,因为其他任何事情都将不起作用-不想在每次内核更新到来时都开始手动签名。顺便说一句,UEFI仍然说启用了安全启动。¯_(ツ)_ /
¯– jaywink

4

您可以通过以下方式禁用验证检查:

sudo apt install mokutil
sudo mokutil --disable-validation

之后,应该安装DKMS软件包。


2
我也尝试执行sudo mokutil --disable-validation。执行此命令时,在下次启动时,系统提示我禁用安全启动,从磁盘添加密钥或哈希。由于我不想禁用安全启动,因此这似乎也无法解决我的问题。如果我误解了此命令,请告诉我。
2013年

2
尝试禁用安全启动。您可以重新启用它,如果这样做没有帮助。
飞行员

我试图禁用安全启动-但仍然启用了:((ubuntu 18.04)
xhudik

0

升级后我也收到有关vboxdrv的错误。但是旧版本(5.0.14)的Oracle VM VirtualBox Extension Pack存在问题。我下载并安装了此软件包的较新版本(5.0.18),问题消失了。


嘿,您能详细说说吗?您从哪里下载的?PPA或deb文件?
Karthik Nishanth

1
我从VirtualBox站点上的下载中下载了扩展包,链接为“ VirtualBox 5.0.18 Oracle VM VirtualBox扩展包-> 所有受支持的平台 ”。然后,我在Oracle VM Virtual Box Manager上打开“文件”>“首选项”,选择“扩展名”,然后将下载的文件添加到列表中。它替换了旧版本的“ Oracle VM VirtualBox Extension Pack”(以前是5.0.14rxxxxxx)。
Reling

1
扩展包无法纠正错误。错误与签名模块有关
Karthik Nishanth'Aug

这不适用于我的问题。
2016年

1
这与OP的问题无关。错误消息“必需的密钥不可用”指示该问题是由于启用了安全启动的平台上的未签名内核模块引起的。除非 VirtualBox更新包含使用内核信任的密钥签名的模块,否则无法解决此问题。也就是说,Canonical必须对其进行签名,或者Oracle必须对其进行签名,并且必须将其公共密钥添加到内核(或您平台的)可信密钥中。
zwets

0

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

就像启用它一样,将引发此错误:

警告:vboxdrv内核模块未加载。当前内核(4.4.0-21-通用)没有可用的模块,或者加载失败。请重新编译内核模块并通过sudo / sbin / rcvboxdrv setup安装

但是,如果禁用了安全启动,则virtualbox可以正常加载且没有错误。

我仍然将自己的履历设置为UEFI。


3
如我的问题所述,我想继续使用安全启动。因此,禁用安全启动并不能解决问题。
2016年

0

今天我遇到了同样的问题,我在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在注释中正确指出的那样,启用旧版模块会导致安全启动被禁用。


2
实际上,我还需要UEFI来启动并行Windows安装。因此禁用它也不是我的选择。我相应地更新了我的问题。
2016年

您是否启用了对旧版BIOS模块的支持?这是UEFI BIOS中的另一个选项,与安全启动不同。
Zeine77 '16

1
@ Zeine77您是否可以在安全启动保持启用状态的情况下验证BIOS允许启用“旧版模块” ?这是极不可能的,因为第一种选择允许不受信任的代码在内核空间中运行,这违背了第二种选择的目的。
zwets

@zwets你说得对,我刚刚检查了我的BIOS设置;启用旧模块会导致安全启动被禁用。如响应中所述,我假设禁用安全启动会导致Windows 10启动失败,事实并非如此。当我首次安装15.10时(几个月前),我注意不要禁用安全启动,因为这会损坏Win 10的安装。这是否意味着在禁用安全模式的情况下预安装的Win 10可以正常工作?
Zeine77 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.