我从 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 开始,未签名启用安全启动后,内核模块将不允许运行。因为您想保留安全启动,所以下一个合乎逻辑的步骤是符号那些模块。
那我们就尝试一下吧。
创建签名密钥
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'
对模块进行签名(
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)
确认模块已签名
tail $(modinfo -n vboxdrv) | grep "Module signature appended"
将密钥注册到安全启动
sudo mokutil --import MOK.der
这将要求输入密码,以便在下一步中确认导入。选择您喜欢的任何密码并记住它。
重新启动并按照屏幕上显示的说明注册 MOK(机器所有者密钥)。以下是样本附有图片。系统将再次重新启动。
确认密钥已注册
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。