我正在尝试使用 pci-passthrough 扩展让 virtualbox 在我的机器上工作。尝试运行 VM 时,我收到以下错误消息:
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 时,它表明安装成功
从问题评论:
这表明模块已经构建,但尚未签名以满足安全启动要求。
最简单的解决方法是禁用安全启动。VirtualBox 5.2 尤其如此,因为:
(我真的希望 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
模块:对您将在此目录中找到的每个模块重复此操作。应该至少有四个:
vboxdrv.ko
、vboxnetadp.ko
和。vboxnetflt.ko
vboxpci.ko