Skip to main content

启用 IOMMU

进入

nano /etc/default/grub

找到 "GRUB_CMDLINE_LINUX_DEFAULT",变成

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

更新 grub

update-grub

重启

Reboot

验证硬件直通开启是否成功

dmesg | grep -e DMAR -e IOMMU

应该有一行看起来像“DMAR:IOMMU enabled”。如果没有输出,说明有问题。

点对点模式

Intel 和 AMD 芯片都可以使用附加参数“iommu=pt”,以与上述相同的方式添加到内核 cmdline。

iommu = pt

这仅在必要时启用 IOMMU 转换,适配器不需要对内存使用 DMA 转换,因此可以提高管理程序PCIe 设备(未传递到 VM)的 性能

所需模块

添加到 /etc/modules

vfio 
vfio_iommu_type1 
vfio_pci 
vfio_virqfd

请注意,在基于 5.4 的内核中,其中一些模块已经直接内置到内核中。

IOMMU 中断重映射

如果没有中断重新映射,就无法使用 PCI 直通。设备分配将失败,并显示“无法分配设备“[设备名称]”:不允许操作”或“未找到中断重新映射硬件,将设备传递到非特权域是不安全的。” 错误。

所有使用 Intel 处理器和芯片组且支持 Intel Virtualization Technology for Directed I/O (VT-d) 但不支持中断重新映射的系统都会看到此类错误。较新的处理器和芯片组(AMD 和 Intel)提供中断重新映射支持。

要确定您的系统是否支持中断重新映射

dmesg | grep 'remapping'

如果您看到以下行之一:

  • "AMD-Vi: Interrupt remapping enabled"
  • "DMAR-IR: Enabled IRQ remapping in x2apic mode" ('x2apic' can be different on old CPUs, but should still work)

然后支持重新映射。

如果您的系统不支持中断重新映射,您可以通过以下方式允许不安全的中断:

echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf

验证 IOMMU 隔离

对于工作 PCI 直通,您需要一个专用的 IOMMU 组,用于要分配给 VM 的所有 PCI 设备。

你应该有类似的东西:

# find /sys/kernel/iommu_groups/ -type l 
/sys/kernel/iommu_groups/0/devices/0000:00:00.0 
/sys/kernel/iommu_groups/1/devices/0000:00:01.0 
/sys/kernel/iommu_groups /1/devices/0000:01:00.0 
/sys/kernel/iommu_groups/1/devices/0000:01:00.1 
/sys/kernel/iommu_groups/2/devices/0000:00:02.0 
/sys/kernel/iommu_groups/3 /devices/0000:00:16.0 
/sys/kernel/iommu_groups/4/devices/0000:00:1a.0 
/sys/kernel/iommu_groups/5/devices/0000:00:1b.0 
/sys/kernel/iommu_groups /6/devices/0000:00:1c.0 
/sys/kernel/iommu_groups/7/devices/0000:00:1c.5 
/sys/kernel/iommu_groups/8/devices/0000:00:1c.6 
/sys /kernel/iommu_groups/9/devices/0000:00:1c.7 
/sys/kernel/iommu_groups/9/devices/0000:05:00.0
/sys/kernel/iommu_groups/10/devices/0000:00:1d.0
/sys/kernel/iommu_groups/11/devices/0000:00:1f.0
/sys/kernel/iommu_groups/11/devices/0000:00:1f.2
/sys/kernel/iommu_groups/11/devices/0000:00:1f.3
/sys/kernel/iommu_groups/12/devices/0000:02:00.0
/sys/kernel/iommu_groups/12/devices/0000:02:00.1
/sys/kernel/iommu_groups/13/devices/0000:03:00.0
/sys/kernel/iommu_groups/14/devices/0000:04:00.0

要拥有单独的 IOMMU 组,您的处理器需要支持称为 ACS(访问控制服务)的功能。确保为此在 BIOS 中启用相应的设置。

除至强 E3-1200 外,所有至强处理器都支持它们(E3、E5)。

对于 Intel Core 则不同,只有部分处理器支持 ACS。只要支持 VT-d,任何比下面列出的更新都应该支持 ACS。请参阅https://ark.intel.com了解更多信息。

Haswell-E (LGA2011-v3) 
i7-5960X (8-core, 3/3.5GHz) 
i7-5930K (6-core, 3.2/3.8GHz) 
i7-5820K (6-core, 3.3/3.6GHz) 

Ivy Bridge- E (LGA2011) 
i7-4960X (6-core, 3.6/4GHz) 
i7-4930K (6-core, 3.4/3.6GHz) 
i7-4820K (4-core, 3.7/3.9GHz) 

Sandy Bridge-E (LGA2011) 
i7 -3960X(6 核,3.3/3.9GHz)
i7-3970X(6 核,3.5/4GHz)
i7-3930K(6 核,3.2/3.8GHz)
i7-3820(4 核,3.6/3.8GHz)

来自 Ryzen 第一代和更新版本的 AMD 芯片也很好。

如果您没有专门的 IOMMU 组,您可以尝试:

1) 将卡移动到另一个 pci 插槽

2) 将“pcie_acs_override=downstream”添加到内核引导命令行(grub 或 systemd-boot)选项中,这有助于某些 ACS 实施不良的设置。

查看有关编辑内核命令行的文档

更多信息:

http://vfio.blogspot.be/2015/10/intel-processors-with-acs-support.html http://vfio.blogspot.be/2014/08/iommu-groups-inside-and-out.html

确定您的 PCI 卡地址,并配置您的虚拟机

最简单的方法是使用 GUI 在 VM 的硬件选项卡中添加类型为“Host PCI”的设备。

或者,您可以使用命令行:

使用“lspci”找到您的卡。地址应采用以下格式: 01:00.0 编辑 <vmid>.conf 文件。它可以位于:/etc/pve/qemu-server/vmid.conf。

将此行添加到文件末尾:

hostpci0: 01:00.0

如果您有一个多功能设备(例如带有嵌入式音频芯片组的 vga 卡),您可以手动传递所有功能:

hostpci0: 01:00.0;01:00.1

或者,自动传递所有函数:

hostpci0: 01:00

PCI Express 直通

添加设备时选中 GUI 中的“PCI-E”复选框,或手动将 pcie=1 参数添加到 VM 配置:

machine: q35
hostpci0: 01:00.0,pcie=1

PCIe 直通仅在 Q35 机器上受支持。

请注意,这并不意味着分配没有此设置的设备将只有 PCI 速度,它只是为来宾设置一个标志,告诉它该设备是 PCIe 设备,而不是“真正快速的传统 PCI 设备”。一些来宾应用程序从中受益。

GPU 直通

对于 VM 配置,它们有 4 种可能的配置:

GPU OVMF PCI 直通(推荐)

为您的 VM 选择“OVMF”作为“BIOS”,而不是默认的“SeaBIOS”。您需要安装支持 uefi 的来宾操作系统。(对于 Windows,请尝试 win >=8)

使用 OVMF,您还可以将 disable_vga=1 添加到 vfio-pci 模块,如果可能,它会尝试从 vga 仲裁中选择退出设备:

echo "options vfio-pci ids=10de:1381,10de:0fbc disable_vga=1" > /etc/modprobe.d/vfio.conf

并且您需要确保您的显卡具有 UEFI 可启动 rom:http: //vfio.blogspot.fr/2014/08/does-my-graphics-card-rom-support-efi.html

bios: ovmf
scsihw: virtio-scsi-pci
bootdisk: scsi0
scsi0: .....
hostpci0: 01:00,x-vga=on

GPU OVMF PCI Express 直通

同上,但将机器类型设置为 q35 并启用 pcie=1:

bios: ovmf
scsihw: virtio-scsi-pci
bootdisk: scsi0
scsi0: .....
machine: q35
hostpci0: 01:00,pcie=1,x-vga=on

GPU Seabios PCI 直通

hostpci0: 01:00,x-vga=on

GPU Seabios PCI Express 直通

machine: q35
hostpci0: 01:00,pcie=1,x-vga=on

如何知道显卡是否兼容 UEFI (OVMF)

获取并编译软件“rom-parser”:

git clone https://github.com/awilliam/rom-parser
cd rom-parser
make

然后转储你的VGA卡的ROM:

cd /sys/bus/pci/devices/0000:01:00.0/
echo 1 > rom
cat rom > /tmp/image.rom
echo 0 > rom

并通过以下方式对其进行测试:

./rom-parser /tmp/image.rom

输出应如下所示:

Valid ROM signature found @0h, PCIR offset 190h
 PCIR: type 0, vendor: 10de, device: 1280, class: 030000
 PCIR: revision 0, vendor revision: 1
Valid ROM signature found @f400h, PCIR offset 1ch
 PCIR: type 3, vendor: 10de, device: 1280, class: 030000
 PCIR: revision 3, vendor revision: 0
  EFI: Signature Valid
 Last image

要与 UEFI 兼容,您需要在结果中添加“类型 3”。

NVIDIA 提示

一些 Windows 应用程序,如 geforce experience、Passmark Performance Test 和 SiSoftware Sandra crash 可能会使 VM 崩溃。您需要添加:

echo "选项 kvm ignore_msrs=1" > /etc/modprobe.d/kvm.conf

如果您在“dmesg”系统日志中看到大量警告消息,请添加以下内容:

echo "options kvm ignore_msrs=1 report_ignored_msrs=0" > /etc/modprobe.d/kvm.conf

用户报告说 NVIDIA Kepler K80 GPU 在 vmid.conf 中需要这个:

args: -machine pc,max-ram-below-4g=1G

“romfile”选项

http://lime-technology.com/forum/index.php?topic=43644.msg482110#msg482110

默认情况下,某些主板无法通过第一个 PCI(e) 插槽上的 GPU,因为它的 vbios 在启动期间会被遮蔽。您需要在其“正常”工作时捕获其 vBIOS(即安装在不同的插槽中),然后您可以将卡移动到插槽 1 并使用转储的 vBIOS 启动 vm。

要转储 BIOS:

cd /sys/bus/pci/devices/0000:01:00.0/
echo 1 > rom
cat rom > /usr/share/kvm/vbios.bin
echo 0 > rom

然后您可以通过以下命令传递 vbios 文件(必须位于 /usr/share/kvm/ 中):

hostpci0: 01:00,x-vga=on,romfile=vbios.bin

故障排除

BAR 3:无法保留 [mem] 错误

如果您在尝试将卡用于 VM 时遇到此错误:

vfio-pci 0000:04:00.0: BAR 3: can't reserve [mem 0xca000000-0xcbffffff 64bit]

您可以尝试添加以下内核命令行选项:

video=efifb:off

查看有关编辑内核命令行的文档

香料

Spice 在通过 GPU 时可能会带来麻烦,因为它会向来宾提供“虚拟”PCI 显卡,并且即使两张卡都出现,一些驱动程序也会遇到问题。总是值得尝试禁用 SPICE 并再次检查是否出现故障。

HDMI 音频噼啪声/损坏

某些数字音频设备(通常通过 GPU 功能添加)可能需要启用 MSI(消息信号中断)才能正常运行。如果您遇到任何问题,请尝试更改客户机中的 MSI 设置并重新启动客户机。

此处提供了简化此操作的 Windows 工具:https ://github.com/CHEF-KOCH/MSI-utility/releases/latest

Linux 来宾通常会自行启用 MSI。要强制将 MSI 用于 GPU 音频设备,请使用以下命令并重新启动:

echo "options snd-hda-intel enable_msi=1" >> /etc/modprobe.d/snd-hda-intel.conf

使用“lspci -vv”并检查设备上的以下行以查看是否启用了 MSI:

Capabilities: [a0] MSI: Enable+ Count=1/1 Maskable- 64bit+

如果显示“启用+”,则 MSI 正在工作,“启用-”表示支持但已禁用,如果该行缺失,则 PCIe 硬件不支持 MSI。

这也可以潜在地提高其他直通设备(包括 GPU)的性能,但这取决于所使用的硬件。

BIOS 选项

确保您使用的是适用于主板的最新 BIOS 版本。通常 IOMMU 分组或直通支持在以后的版本中得到了改进。

一些可能需要更改以允许直通工作的常规 BIOS 选项:

  • IOMMU 或 VT-d:设置为“启用”或等效项,通常“自动”不一样
  • 'Legacy boot' 或 CSM:对于 GPU 直通,它可以帮助禁用此功能,但请记住 PVE 必须安装在 UEFI 模式下,因为如果不启用此功能,它将无法在 BIOS 模式下启动。禁用此功能的原因是它避免了已安装 GPU 的传统 VGA 初始化,使它们能够在以后根据直通要求重新初始化。尝试在单 GPU 系统中使用直通时最有用。
  • “Resizable BAR”/“Smart Access Memory”:如果在主机上启用此功能,某些 AMD GPU(Vega 及更高版本)在 Windows 客户机中会遇到“Code 43”。无论哪种方式(目前),VM 都不支持它,因此推荐设置为“关闭”。

验证操作

启动虚拟机并在 CLI 上输入 qm 监视器:“qm monitor vmnumber” 验证您的卡是否在此处列出:“info pci”然后在您的客户操作系统上安装驱动程序。

注:卡支持可能仅限于 2 或 3 个设备。

注意:PCI 设备只能连接到单个 VM。

注意:只要它所连接的 VM 正在运行,此过程就会从 proxmox 主机操作系统中移除该卡。

注意:使用 PCI 直通将驱动器直接呈现给 ZFS(FreeNAS、Openfiler、OmniOS)虚拟机可以进行测试,但不建议用于生产用途。具体的 FreeNAS 警告可以在这里找到: http ://forums.freenas.org/threads/absolutely-must-virtualize-freenas-a-guide-to-not-completely-losing-your-data.12714/

USB 直通

如果您需要通过 USB 设备(键盘、鼠标),请遵循此 wiki 文章:

https://pve.proxmox.com/wiki/USB_physical_port_mapping

原文链接