我知道有很多关于此问题的公开讨论,但没有一个讨论能解决该错误的独特原因。
就我而言,它是关于 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-upgrade
auto-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 有关。
脚步:
检查已安装的标头(
$ dpkg -l | grep linux-headers
)是否与正在运行的内核匹配(
$ uname -r
)。您随时可以使用此命令查看已注册/签名密钥的列表:
$ sudo keyctl list %:.system_keyring
。如果您已经为 Virtualbox 签名了密钥(使用旧内核),则需要将其删除。有一种方法可以删除单个密钥,但我一次性删除所有密钥(我注册的所有密钥):
$ sudo mokutil --reset
. 选择一个密码并重新启动计算机。- Ubuntu 启动时会自动询问您。选择“重置 MOK”并使用所选密码。
- 如果您尚未创建 X.509 密钥,请为该密钥创建文件夹并导航到它。
- 使用以下命令创建密钥:
$ 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”。 - 使用以下命令注册密钥:
$ 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”。 - 使用 导入密钥
$ sudo mokutil --import MOK.der
。再次使用指定的名称,而不是“MOK”。选择密码并重新启动计算机。 - Ubuntu 启动时会自动询问您。选择“注册 MOK”并使用所选密码。
现在您可以正常启动并使用Virtualbox。
答案2
内核升级后,如果 Ubuntu 存储库中的 VirtualBox 出现问题,只需使用从官方网站获取最新的 VirtualBox。这可能是最简单、最快捷的解决方案。