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

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

简短的问题:

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

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

vboxpci: No IOMMU domain (attach)

长问题:

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

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

NVIDIA市场这“SLI 多操作系统“配置,这基本上是我多年来一直想要设置的,但我不想在虚拟化软件(Parallels Workstation Extreme)上花费太多,因为我已经非常愉快地使用 VirtualBox 多年了。

主机系统

我正在相当高端的工作站设备(带有 Intel ICH10R 芯片组和 Xeon W3680 CPU 的 Asus P6T7 WS Supercomputer mobo)上运行 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

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

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

从来宾中使用主机 GPU

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

当我下次启动 guest 虚拟机时,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)

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

更新:

我现在已经使用 启动了内核intel_iommu=on,但仍然无法完全正常工作。重新启动主机后,来宾启动,登录正常,一切看起来都像开始之前一样。我的第二块显卡没有输出任何东西。

在设备管理器中,Quadro FX 设备旁边有一个感叹号,并且设备属性中存在错误代码 12,并显示一条消息“此设备找不到足够的可用资源”。进一步说明微软技术网

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

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

如果我第二次启动来宾操作系统而不重新启动主机,则显示会再次冻结在“欢迎”阶段。不过,它肯定完成了登录阶段,因为我可以使用 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!

答案1

我使用 KVM 作为 vfio-vga 的虚拟机管理程序,与 NVIDIA GTX 760 一起使用 VGA 直通;我从来没有用 Virtualbox 尝试过。这很痛苦,但在正确配置后效果很好。 KVM 与 Virtualbox 一样方便,可以从桌面快速创建虚拟机,您可能会将其视为另一种选择。

该线程包含大量有关许多不同配置和故障排除步骤的信息,并且非常有帮助:https://bbs.archlinux.org/viewtopic.php?id=162768

答案2

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

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

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

答案3

听起来你有两个不同的问题。重新启动才能使用 VGA 直通功能确实是一件很困难的事情。在 Xen 中,VGA 设备通常显示为可移动设备,有些人在重新启动之前“弹出”该设备会比较幸运。

只需在 Windows 设备管理器中禁用虚拟视频设备即可修复代码 12 错误。

答案4

在 HP dc7900 上进行测试,看到消息“IOMMU found”:

停用集成视频

iommu=calgary intel_iommu=on intel_iommu=igfx_off

相关内容