在内核中启用IOMMU以实现图形卡传递


16

简短问题:

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

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

vboxpci: No IOMMU domain (attach)

长问题:

使访客操作系统直接访问图形卡

我最近意识到,可以将PCI Express设备传递给Virtualbox中运行的来宾OS。酷,我想!我有两块NVIDIA Quadro FX图形卡(具有SLI桥接器连接,希望不会引起麻烦),并且希望将第二张图形卡专用于来宾OS,以便可以在其中使用OpenGL功能。 Photoshop等。

NVIDIA销售这种“ SLI Multi-OS ”配置,这基本上是我多年来一直想要设置的配置,但是我不想花太多时间在虚拟化软件(Parallels极限工作站)上。使用VirtualBox已有很多年了。

主机系统

我正在相当高端的工作站设备(具有Intel ICH10R芯片组和Xeon W3680 CPU的Asus P6T7 WS超级计算机主板)上从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 System设置中将芯片组更改为ICH9,并打开了guest虚拟机。以安装必要的新驱动程序。稍后重新启动,一切正常,因此我关闭了来宾,然后重新运行命令。)

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

从来宾使用主机GPU

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

当我下一次启动客户机时,Windows Update开始执行它的工作,并自动检测并安装了正确的NVIDIA驱动程序。到目前为止一切都很好。不过,在使用设备之前,我必须重新启动访客。

问题

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

在中/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,并显示一条消息“此设备找不到足够的可用资源”。在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

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

现在我有点想法了...有什么建议可以解决这个问题?我可以提供更多信息吗?

UPDATE2:

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
如果硬件支持,默认情况下,IOMMU设置应在Debian稳定版上处于活动状态。由于它在日志中造成麻烦和大量错误,因此我必须使用停用它intel_iommu=soft。您可以尝试通过intel_iommu=on
Marco

1
太酷了,只是找到了要更改它的文件和行;KDE的平头配置模块把CONFIG_CMDLINE_LINUX=intel_iommu=on/etc/default/grub。现在,来宾启动了,但是没有检测到图形卡...
Alex Leach 2012年

intel_iommu=soft似乎不是有效的内核选项,当我使用它时,它恢复为intel_iommu=on..从www.kernel.org可以找到iommu=soft,但是我找不到任何相关的文档。有吗
亚历克斯·里奇

3
您是对的,是iommu=soft。它会停用硬件IOMMU(这会在我的系统上导致大量DMA错误),而改用软件IOMMU。这是旧线程的链接:建议对所有内核软件包使用iommu = soft
Marco Marco

谢谢。我下次重启时可能会尝试一下。我认为我所有的硬件都支持IOMMU,所以不确定软件仿真是否是一个好主意。与此相关的是,不确定我的GPU是否具有DMAR单元,以及使用它是否是一个好主意intel_iommu=igfx_off……
Alex Leach

Answers:


2

我将VGA通道与使用KVM作为vfio-vga的管理程序的NVIDIA GTX 760一起使用;我从来没有尝试过Virtualbox。这很痛苦,但是在正确配置之后效果很好。KVM与Virtualbox一样方便,可用于从您的桌面快速生成VM,您可以将KVM视为另一种选择。

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


1
CUDA有效吗?
Aleksandr Dubinsky

该博客现在声称已过时,并推荐vfio.blogspot.com
Aleksandr Dubinsky

好吧,从冷地开始建立高效的KVM + qemu可能不会那么快。
sitilge

@AleksandrDubinsky,目前要使CUDA正常工作,必须使用特定的Linux内核:superuser.com/a/1392031/109803
Gabriel Fair,

0

如果您的Nvidia驱动程序说找不到足够的可用资源,请尝试在设备管理器中禁用模拟的“标准VGA适配器”。重新启动来宾,您可能会发现依次发生以下情况:

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

运气好的话,您可能会发现从那时开始一切都很好。这与我使用Xen进行的类似设置差不多。请报告结果。:)


0

听起来您有两个不同的问题。重新启动以与VGA通道一起使用可能是真正的负担。在Xen中,VGA设备通常显示为可移动设备,有些人在重新启动之前最好“弹出”设备。

只需在Windows设备管理器中禁用虚拟视频设备,就可以解决代码12错误。


0

尝试在以下位置设置其中之一/etc/grub

  • iommu=memmaper
  • iommu=soft
  • vga=normal
  • vesa=0

我有一个新的AMD 64位系统,并且发现Linux由于BIOS中的iommu设置而导致Nvidia和DMA设置出现问题,因此在grub中进行设置对我来说是固定的。

请阅读此内容以获取更多详细信息


-1

在HP dc7900上进行了测试,以查看消息“找到了IOMMU”:

停用集成视频

iommu=calgary intel_iommu=on intel_iommu=igfx_off
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.