Linux 内核更新后 VirtualBox 机器无法启动的真正原因

Linux 内核更新后 VirtualBox 机器无法启动的真正原因

我知道有很多关于此问题的公开讨论,但没有一个讨论能解决该错误的独特原因。

就我而言,它是关于 Ubuntu 16.04 的。我从 Ubuntu 存储库安装 VirtualBox,使用sudo apt install virtualbox-qt

我安装了内核 4.4.0-34-generic。安装 VirtualBox 后,一切正常。

但是,在我更新系统(通过软件更新程序)并使用 和 升级后,sudo apt upgrade我的虚拟机无法启动。内核 4.4.0-36-generic 现已安装。它显示以下内容:sudo apt dist-upgradeauto-remove

please install virtualbox-dkms and check if appropriate linux-headers are installed

virtualbox-dkms已经安装,因此之后什么也不会发生sudo apt install virtualbox-dkms

但是标题怎么办?

$ dpkg -l | grep linux-headers  
ii  linux-headers-4.4.0-34  4.4.0-34.53  all  Header files related to Linux kernel version 4.4.0  
ii  linux-headers-4.4.0-34-generic  4.4.0-34.53  amd64  Linux kernel headers for version 4.4.0 on 64 bit x86 SMP  
ii  linux-headers-4.4.0-36  4.4.0-36.55  all  Header files related to Linux kernel version 4.4.0  
ii  linux-headers-4.4.0-36-generic  4.4.0-36.55  amd64  Linux kernel headers for version 4.4.0 on 64 bit x86 SMP  
ii  linux-headers-generic  4.4.0.36.38  amd64  Generic Linux kernel headers  

$ uname -r  
4.4.0-36-generic

每次内核更新后都会发生这种情况的真正原因是什么?我想知道确切该怎么做,而不是总是花几天时间去修复它。

答案1

我找到了一个解决方案。

虽然我的问题没有得到解答,我也不太明白为什么会出现这个问题,但我想和大家分享一下解决方案的简单总结。我承认,Linux 内核在更新后根本不支持 Virtualbox。他们知道原因。

无论如何,这个问题几乎在每次内核更新或软件包升级后都会发生。如果你尝试

$ sudo modprobe vboxdrv, 你得到modprobe: ERROR: could not insert 'vboxdrv': Required key not available

解决方案是每次发生这种情况时手动签署密钥,因为签名依赖于内核。它与未禁用安全启动的 Ubuntu 16.04 有关。

脚步:

  1. 检查已安装的标头($ dpkg -l | grep linux-headers)是否与正在运行的内核匹配

    $ uname -r)。

  2. 您随时可以使用此命令查看已注册/签名密钥的列表:

    $ sudo keyctl list %:.system_keyring

  3. 如果您已经为 Virtualbox 签名了密钥(使用旧内核),则需要将其删除。有一种方法可以删除单个密钥,但我一次性删除所有密钥(我注册的所有密钥):

    $ sudo mokutil --reset. 选择一个密码并重新启动计算机。

  4. Ubuntu 启动时会自动询问您。选择“重置 MOK”并使用所选密码。
  5. 如果您尚未创建 X.509 密钥,请为该密钥创建文件夹并导航到它。
  6. 使用以下命令创建密钥:$ openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Akrog/"。选择名称(例如“vbX509Key”和“vbKey”),而不是“MOK”和“Akrog”。
  7. 使用以下命令注册密钥:$ sudo /usr/src/linux-headers-XXX-generic/scripts/sign-file sha256 ./MOK.priv ./MOK.der /lib/modules/XXX-generic/updates/dkms/vboxdrv.ko。请使用指定名称代替“MOK”,并使用正确的内核版本代替“XXX”。
  8. 使用 导入密钥$ sudo mokutil --import MOK.der。再次使用指定的名称,而不是“MOK”。选择密码并重新启动计算机。
  9. Ubuntu 启动时会自动询问您。选择“注册 MOK”并使用所选密码。

现在您可以正常启动并使用Virtualbox。

答案2

内核升级后,如果 Ubuntu 存储库中的 VirtualBox 出现问题,只需使用从官方网站获取最新的 VirtualBox。这可能是最简单、最快捷的解决方案。

相关内容