构建 virtualbox pci-passthrough 内核模块时出错 - 出了什么问题?

构建 virtualbox pci-passthrough 内核模块时出错 - 出了什么问题?

我正在尝试使用 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.kovboxnetadp.kovboxnetflt.kovboxpci.ko

相关内容