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

jan*_*ans 153 virtualbox kernel dkms secure-boot 16.04

我从 Ubuntu 15.10 升级到 16.04,从那时起 VirtualBox 5.0.18 不再启动我的 VM。它抱怨未加载“vboxdrv”。所以我尝试加载它并收到以下错误:

$ sudo modprobe vboxdrv
modprobe: ERROR: could not insert 'vboxdrv': Required key not available
Run Code Online (Sandbox Code Playgroud)

我相信这与我使用的安全启动有关并且我想继续使用它。实际上使用 Ubuntu 15.10 安全启动和 VirtualBox 工作得很好。

我也试过$ sudo apt-get --reinstall install virtualbox-dkms哪个成功构建了内核模块但没有解决这个问题。

知道如何在启用安全启动的同时加载 vboxdrv 吗?

更新 2:我也尝试执行sudo mokutil --disable-validation. 执行此命令时,在下次启动期间,我会收到禁用安全启动、从磁盘添加密钥或哈希的提示。由于我不想禁用安全启动,因此这似乎也不能解决我的问题。此外,我想为并行 Windows 安装保持 UEFI 激活。

注意:如果您不介意禁用安全启动,请参阅为什么在安装 3rd 方内核模块或内核升级后会出现“所需密钥不可用”?反而。

Maj*_*jal 206

自内核版本 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/"
    
    Run Code Online (Sandbox Code Playgroud)

    选项:为了额外的安全性,跳过 -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)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 确认模块已签名

    tail $(modinfo -n vboxdrv) | grep "Module signature appended"
    
    Run Code Online (Sandbox Code Playgroud)
  4. 注册安全启动的密钥

    sudo mokutil --import MOK.der
    
    Run Code Online (Sandbox Code Playgroud)

    这将要求输入密码以在下一步中确认导入。

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

  6. 确认密钥已注册

    mokutil --test-key MOK.der
    
    Run Code Online (Sandbox Code Playgroud)

如果 VirtualBox 仍未加载,可能是因为模块未加载(sudo modprobe vboxdrv将修复该问题)或密钥未签名。只需重复该步骤,一切都会正常进行。

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

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

  • 我还签署了 vboxnetadp、vboxnetflt、vboxpci 模块以在虚拟机中拥有网络和传递 throw pci 设备。 (8认同)
  • 扩展@majal 的答案,在按照提供的说明操作之前,我必须执行`sudo apt install --reinstall virtualbox-dkms`。 (4认同)
  • @adempewolff 如果您的密码包含您的 shell 将解释的字符(例如带引号的字符串中的 '$'),您需要将其括在撇号 (') 中。 (3认同)
  • 我发现注册模块后需要再次签署模块,之后一切正常。 (2认同)

小智 19

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

运行 mokutil:

sudo mokutil --disable-validation
Run Code Online (Sandbox Code Playgroud)

然后mokutil让我为MOK Manager设置密码。重新启动 PC 后,BIOS 会显示一个对话框来配置 MOK 管理器。我从此对话框中禁用了 SecureBoot,它要求输入密码中的几个字符(即输入字符 (5) 等)。

启动后正确加载了 vboxdrv 模块。

lsmod | grep vboxdrv
vboxdrv               454656  3 vboxnetadp,vboxnetflt,vboxpci
Run Code Online (Sandbox Code Playgroud)

奇怪的是,mokutil 仍然显示 SecureBoot 已启用:

sudo mokutil --sb-state
SecureBoot enabled
Run Code Online (Sandbox Code Playgroud)

  • 正如我的问题中所述,我想继续使用安全启动。因此禁用安全启动并不能解决问题。 (9认同)
  • 不想禁用安全启动,但最终不得不这样做,因为没有其他方法可以工作 - 不想在每次内核更新时手动开始签名......可惜这是唯一简单的解决方案。顺便说一句,UEFI 仍然说启用了安全启动。¯\_(ツ)_/¯ (2认同)

Adr*_*dez 18

我知道这个问题太老了,但是因为没有公认的答案,而且这些答案都没有解决我的问题,我正在写我今天如何在不禁用安全启动的情况下解决这个问题:

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

$ sudo modprobe vboxdrv
modprobe: ERROR: could not insert 'vboxdrv': Required key not available
Run Code Online (Sandbox Code Playgroud)

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

这就是为什么我在虚拟框中打开任何机器时出现此错误的原因

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

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

1.安装mkutil包就可以做签名了。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install mokutil
Run Code Online (Sandbox Code Playgroud)

2.生成签名文件:

openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=VirtualBox/"
Run Code Online (Sandbox Code Playgroud)

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

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

4.为安全启动注册它。

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

sudo mokutil --import MOK.der
Run Code Online (Sandbox Code Playgroud)

5.最后,重启电脑。将出现蓝屏并等待键盘,按要求您中断启动的键。

在此处输入图片说明

当您在蓝屏内时,选择

Enroll MOK > Continue > and it will ask you for the password
Run Code Online (Sandbox Code Playgroud)

之前输入过的,输入后会提示操作成功完成。

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

希望这有助于某人。


小智 0

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


Zei*_*e77 0

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

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

modprobe: ERROR: could not insert 'vboxdrv': Required key not available
Run Code Online (Sandbox Code Playgroud)

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

我所做的是进入 Bios 并启用对传统 BIOS 启动的支持,而不禁用安全启动。

Virtualbox 现在工作正常。

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

  • 实际上我还需要 UEFI 来启动并行的 Windows 安装。所以禁用它对我来说也不是一个选择。我相应地更新了我的问题。 (2认同)