我正在尝试使用 pci-passthrough 扩展让 virtualbox 在我的机器上工作。当尝试运行虚拟机时,我收到以下错误消息:
Kernel driver not installed (rc=-1908)
[message asking me to install the vboxdrv kernel driver
by executing /sbin/vboxconfig as root]
所以我这样做了并得到了这个:
vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.
vboxdrv.sh: failed: modprobe vboxdrv failed. Please use 'dmesg' to find out why.
There were problems setting up VirtualBox. To re-start the set-up process, run
/sbin/vboxconfig
as root.
查看 dmesg,安装没有添加新条目。
查看日志文件,最后一个模块失败:
Building the main VirtualBox module.
Building the net filter module.
Building the net adaptor module.
Building the PCI pass-through module.
这意味着这是在 中失败的代码/usr/lib/virtualbox/vboxdrv.sh
,从 调用/sbin/vboxconfig
:
log "Building the PCI pass-through module."
if ! myerr=`$BUILDINTMP \
--use-module-symvers /tmp/vboxdrv-Module.symvers \
--module-source "$MODULE_SRC/vboxpci" \
--no-print-directory install 2>&1`; then
log "Error building the module:"
module_build_log "$myerr"
failure "Look at $LOG to find out what went wrong"
fi
其中$BUILDINTMP
指向可运行文件/usr/share/virtualbox/src/vboxhost/build_in_tmp
这就是我排除故障的程度,我不知道下一步该怎么做。
一些信息:
- IOMMU/VT-D 已启用
- 内核版本是
4.10.0-38-generic
- 操作系统是Linux Mint 18.3
- 据我所知,内核头文件已安装,“据我所知”意味着该路径
/lib/modules/4.10.0-38-generic/build/include/linux
存在并且充满 .h 文件和其他子目录 - Virtualbox 版本为 5.2.20
- 当我将PCI直通扩展安装到VBox时,表明安装成功
答案1
从问题评论来看:
modprobe: ERROR: could not insert 'vboxdrv': Required key not available
这表明该模块已经构建,但是它尚未经过签名以满足安全启动要求。
最简单的解决方法是禁用安全启动。对于 VirtualBox 5.2 来说尤其如此,因为:
- 它使用自己的模块构建系统而不是 DKMS,并且
- 据我所知,它没有工具将模块签名命令添加到其模块构建过程中
(我真的希望 VirtualBox 的未来版本将转向使用 DKMS,或者至少提供挂钩以允许将自定义脚本绑定到 VirtualBox 模块安装过程中。)
解决此问题的“正确”方法是创建您自己的安全启动密钥,并使用它来完全控制系统固件中的安全启动,或者将其注册为机器所有者密钥(引导加载程序级扩展)安全启动)(如果这是不可能或太困难的话)。
这永远不可能完全自动化,因为这种自动化将被视为安全启动规避设备,并将包含在UEFI 撤销列表由 UEFI 论坛提供。该列表已嵌入到新的 UEFI 固件版本中。幸运的是,注册是一次性过程。
将密钥注册到安全启动后,您可以使用该密钥对模块进行签名,以使它们能为系统所接受。每次更新内核或 VirtualBox 时,您都必须重复模块签名。
根据 Ubuntu 文档,您应该能够创建一个合适的密钥,sudo update-secureboot-policy --new-key
然后将其注册为机器所有者密钥 (MOK) 并sudo update-secureboot-policy --enroll-key
重新启动。重新启动时,shim.efi
应该会自动启动 MokManager 程序,这将要求您确认机器所有者密钥的注册,因为只有在启动时,它才能验证输入是否来自用户而不是其他地方。这样做是为了确保安全启动密钥的任何自定义都是在系统所有者/管理员的显式控制下进行的。
重新安装操作系统不会从 UEFI 固件变量中删除 MOK,但 UEFI 固件升级或将所有 UEFI 固件设置重置为默认值可能会这样做。在这种情况下,您需要重新办理注册手续。
一旦 MOK 成功注册,密钥应由固件自动传递到内核,并可用于对模块进行签名。 VirtualBox 5.2 将其模块安装到/lib/modules/<kernel version number>/misc/
目录中。要在那里签署模块,您可以使用kmodsign 命令。例如,要签署vboxdrv.ko
模块:
cd /lib/modules/$(uname -r)/misc
kmodsign sha512 /var/lib/shim-signed/mok/MOK.priv /var/lib/shim-signed/mok/MOK.der vboxdrv.ko
对此目录中找到的每个模块重复此操作。至少应有四个:vboxdrv.ko
、vboxnetadp.ko
、vboxnetflt.ko
和vboxpci.ko
。