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

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

我从 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 安装。

笔记:如果你不介意禁用安全启动,请参阅为什么安装第三方内核模块或内核升级后会出现“所需密钥不可用”的情况?反而。

答案1

从内核版本 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将修复该问题)或密钥未签名。只需重复该步骤,一切都会正常工作。

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

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

答案2

我知道这个问题太老了,但是因为没有可接受的答案,而且这些答案都没有解决我的问题,所以我今天写下了我如何解决这个问题无需禁用安全启动

运行此命令时,出现以下错误:

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

问题在于模块未签名,因此未随内核加载。如果您的计算机已激活 SecureBoot 模式,就会发生这种情况,这在现代设备中非常常见。

这就是为什么我在虚拟机中打开任何机器时都会出现此错误

内核驱动程序未安装(rc=-1908)

按照以下步骤对驱动程序进行签名,并将其作为内核模块加载到 Ubuntu 系统和 Debian 9 上:

1.安装 mkutil 包以便能够进行签名。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install mokutil

2.生成签名文件:

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

3.然后将其添加到内核:

sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv)

4.将其注册为安全启动。

重要的!这将要求您输入密码,输入您想要的密码,您只需在下次重启时使用一次该密码。

sudo mokutil --import MOK.der

5.最后,重启电脑。会出现一个蓝屏,上面写着“键盘等待,按下中断启动的键”。

在此处输入图片描述

当您处于蓝屏状态时,选择

Enroll MOK > Continue > and it will ask you for the password

您之前已经输入过的内容,您将输入它,然后会被告知操作已成功完成。

现在你的操作系统将启动,你可以毫无问题地使用 VirtualBox :)

希望这对某人有帮助。

答案3

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

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

答案4

我在使用 Ubuntu 20.04(全新安装后)时遇到了这个问题。我没有在 BIOS 中运行 UEFI,而是在 Ubuntu 上自动登录。

修复该问题的是,我将自动登录更改为不自动登录,并在 BIOS 中打开 UEFI。

相关内容