在内核中启用 IOMMU 以实现显卡直通

Ale*_*ach 17 pci grub2 virtualbox linux-kernel

简短的问题:

如何打开intel_iommuLinux内核中的设置?我使用 grub2 引导加载程序运行 Debian 主机。我见过的文档说要 edit /boot/grub/menu.lst,这似乎只与 grub 1.x 相关,因为我没有那个文件。

我的理解(也是我能想到的最后一个选项)更改此引导选项可能会消除以下错误消息 /var/log/kern.log

vboxpci: No IOMMU domain (attach)
Run Code Online (Sandbox Code Playgroud)

长问题:

允许来宾操作系统直接访问显卡

我最近意识到可以通过 PCI-express 设备传递到在 Virtualbox 中运行的来宾操作系统。酷,我想!我有两个 NVIDIA Quadro FX 显卡(SLI 桥接连接到位,我希望这不会造成麻烦)并且想将第二个显卡专用于来宾操作系统,以便我可以在其中使用 OpenGL 功能Photoshop 等。

NVIDIA 销售这种“ SLI 多操作系统”配置,这基本上是我多年来一直想要设置的配置,但我不想在虚拟化软件(Parallels 工作站极限)上花太多钱,当我已经多年来一直很高兴地使用 VirtualBox。

主机系统

我在相当高端的工作站设备(华硕 P6T7 WS 超级计算机主板,带英特尔 ICH10R 芯片组和至强 W3680 CPU)上运行 Debian 存储库中的 linux-3.5.0-19,并希望在内核中打开 IOMMU 支持,最好不必自己编译。

BIOS

在 BIOS 设置中,我启用了 VT-x 和 VT-d 支持。不过,我看不到任何特别提到 IOMMU 的内容。

连接 PCI 设备

这令人愉快地出乎意料地简单!官方 VirtualBox 文档在这里。我所做的,我发现不那么模棱两可的是,打开nvidia-settings,选择辅助图形卡并记下总线 ID(在我的例子中是“PCI:5:0:0”)。然后,从主机的命令行:-

VBoxManage modifyvm "Windows Guest" --pciattach 05:00.0
Run Code Online (Sandbox Code Playgroud)

(当我第一次运行时,出现错误,因为 VirtualBox 正在模拟 PIIX 芯片组;它说 PCI pass-through 仅适用于 ICH9 芯片组。所以我在 VirtualBox VM System 设置中将 Chipset 更改为 ICH9 并打开来宾安装必要的新驱动程序。稍后重新启动,一切正常,所以我关闭了来宾,并重新运行命令。)

没有输出,我几乎立即返回到命令行。

使用来自来宾的主机 GPU

在打开来宾之前,我首先通过 virtualbox-dkms 重新启动了主机,以防内核中发生一些未记录的事情。当我在没有sudo特权的情况下运行上一个命令时,我怀疑是否进行了任何更改。

当我下次启动来宾时,Windows Update 开始执行其操作并自动检测并安装正确的 NVIDIA 驱动程序。到目前为止一切看起来都很好。在我可以使用该设备之前,我不得不重新启动访客...

问题

现在图形卡驱动程序安装在客户机上并连接了 PCI 设备,我无法进入 Windows 桌面。我进入 Windows 登录屏幕,然后在登录后,屏幕冻结,只是说“欢迎”,旁边有一个应该旋转但不是蓝色的圆圈。

在 中/var/log/kern.log,最后打印的消息是:-

vboxpci: vboxPciOsDevInit: dev=500
vboxpci: detected device: 10de:05ff at 05:00.0, driver pci-stub
vboxpci: vboxPciOsDevInit: dev=500 pdev=ffff88061bea0000
pci-stub 0000:05:00.0: irq 76 for MSI/MSI-X
vboxpci: enabled MSI
500: linux vboxPciOsDevGetRegionInfo: reg=0
got mmio region: fa000000:16777216
500: linux vboxPciOsDevGetRegionInfo: reg=1
got mmio region: d0000000:268435456
500: linux vboxPciOsDevGetRegionInfo: reg=3
got mmio region: f8000000:33554432
500: linux vboxPciOsDevGetRegionInfo: reg=5
got pio region: 8c00:128
500: linux vboxPciOsDevGetRegionInfo: reg=6
got mmio region: fb980000:524288
got PCI IRQ: 76
device eth0 entered promiscuous mode
power state: 0
vboxpci: No IOMMU domain (attach)
Run Code Online (Sandbox Code Playgroud)

知道如何解决这个问题吗?

更新:

我现在用 启动了内核intel_iommu=on,但事情仍然不能完全正常工作.. 重新启动主机后,来宾启动,登录正常,一切看起来都和开始之前一样。我的第二个显卡没有输出任何东西。

在设备管理器中,Quadro FX 设备旁边有一个感叹号,在设备属性中出现错误代码 12,并提示“此设备找不到足够的可用资源”。technet.microsoft.com上的进一步说明。

在主机内核日志中,它看起来很有希望:-

vboxpci: detected device: 10de:05ff at 05:00.0, driver pci-stub
vboxpci: vboxPciOsDevInit: dev=500 pdev=ffff88061baa0000
pci-stub 0000:05:00.0: irq 76 for MSI/MSI-X
vboxpci: enabled MSI
500: linux vboxPciOsDevGetRegionInfo: reg=0
got mmio region: fa000000:16777216
500: linux vboxPciOsDevGetRegionInfo: reg=1
got mmio region: d0000000:268435456
500: linux vboxPciOsDevGetRegionInfo: reg=3
got mmio region: f8000000:33554432
500: linux vboxPciOsDevGetRegionInfo: reg=5
got pio region: 8c00:128
500: linux vboxPciOsDevGetRegionInfo: reg=6
got mmio region: fb980000:524288
got PCI IRQ: 76
created IOMMU domain ffff88058377c9a0
device eth0 entered promiscuous mode
power state: 0
vboxpci: iommu_attach_device() success
Run Code Online (Sandbox Code Playgroud)

如果我第二次启动来宾操作系统,而不重新启动主机,则显示会在“欢迎”阶段再次冻结。不过,它肯定会完成登录阶段,因为我可以使用 Windows 快捷方式来关闭机器而不强制关机。

现在我有点想不通了……有什么建议可以让这个工作?我可以提供更多信息吗?

更新2:

dmesg 包含一些更有趣的错误,但我不知道我能对它们做些什么:

IOMMU 0 0xfbfff000: using Queued invalidation
IOMMU 1 0xfbffe000: using Queued invalidation
------------[ cut here ]------------
WARNING: at /build/buildd/linux-3.5.0/drivers/iommu/intel-iommu.c:4254 init_dmars+0x39b/0x74f()
Hardware name: System Product Name

Your BIOS is broken; DMA routed to ISOCH DMAR unit but no TLB space.

BIOS vendor: American Megatrends Inc.; Ver: 0811   ; Product Version: System Version
...
Your BIOS is broken; RMRR ends before it starts!
Run Code Online (Sandbox Code Playgroud)

小智 0

如果您的 Nvidia 驱动程序表示无法找到足够的可用资源,请尝试在设备管理器中禁用模拟的“标准 VGA 适配器”。重新启动 guest 虚拟机,您可能会发现按顺序发生以下情况:

1) 您的 VM POST/启动发生在模拟 VGA 适配器上。2) 模拟 VGA 适配器在进入登录屏幕之前变为空白 3) Nvidia 驱动程序加载并启动直通 GPU,您将在 Nvidia 卡上看到登录屏幕。

如果运气好的话,您可能会发现从那时起事情就一切顺利。这或多或少正是我使用 Xen 进行类似设置时所发生的情况。请报告结果。:)