简介 #
PCI 直通允许您在 VM 内使用物理 PCI 设备(显卡、网卡)(仅限 KVM 虚拟化)。
如果您“PCI 直通”设备,则该设备不再可供主机使用。
提示:
PCI 直通是 Proxmox VE 中的一项实验性功能!无法迁移具有直通设备的 VM。
启用 IOMMU #
您需要通过编辑内核命令行来启用 IOMMU 。
首先打开您的引导加载程序内核命令行配置文件。
对于GRUB
# nano /etc/default/grub
找到带有“GRUB_CMDLINE_LINUX_DEFAULT”的行
对于systemd-boot:
# nano /etc/kernel/cmdline
它的格式是带有选项的单行。如果不存在,您可以为 systemd-boot 创建文件。
英特尔处理器
对于 Intel CPU 添加
intel_iommu=on
Grub
如果您使用的是 GRUB:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
然后保存更改并更新 grub:
update-grub
systemd-boot
如果您使用 systemd-boot,请在第一行末尾添加以下内容:
quiet intel_iommu=on
然后保存更改并更新 systemd-boot:
proxmox-boot-tool refresh
AMD 处理器
针对 AMD 处理器,添加:
amd_iommu=on
GRUB
如何您使用的是GRUB:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on"
然后保存变更并更新grub:
update-grub
systemd-boot
如何您使用 systemd-boot, 在第一行的末尾添加:
quiet amd_iommu=on
然后保存并更新systemd-boot:
proxmox-boot-tool refresh
验证 IOMMU 是否已启用
重新启动,然后运行:
dmesg | grep -e DMAR -e IOMMU
应该有一行看起来像“DMAR:IOMMU enabled”。如果没有输出,说明有问题。
PT模式
Intel 和 AMD 芯片都可以使用附加参数“iommu=pt”,以与上述相同的方式添加到内核 cmdline。
这仅在必要时启用 IOMMU 转换,适配器不需要对内存使用 DMA 转换,因此可以提高管理程序PCIe 设备(未传递到 VM)的 性能
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”在旧 CPU 上可能不同,但仍应有效)
然后支持重新映射。
如果您的系统不支持中断重新映射,您可以通过以下方式允许不安全的中断:
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 中启用相应的设置。
除 Xeon E3-1200 外,所有 Xeon 处理器都支持它们(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-core, 3.3/3.9GHz)
i7-3970X (6-core, 3.5/4GHz)
i7-3930K (6-core, 3.2/3.8GHz)
i7-3820 (4-core, 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 直通 #
备注 | 注意:如果您喜欢使用 HOWTO 方法的文章,请参阅http://blog.quindorian.org/2018/03/building-a-2u-amd-ryzen-server-proxmox-gpu-passthrough.html/ 。(注意:您通常不需要最后提到的 ROM 文件转储!) |
- 据报道,AMD RADEON 5xxx、6xxx、7xxx、NVIDIA GEFORCE 7、8、GTX 4xx、5xx、6xx、7xx、9xx、10xx 和 RTX 16xx/20xx 可以正常工作。
- AMD Navi (5xxx(XT)/6xxx(XT)) 存在重置错误(请参阅https://github.com/gnif/vendor-reset),虽然专用用户已经设法让它们运行,但他们需要更多的努力,可能不会完全稳定
- 您可能需要在 grub.cfg 或其他调整值中加载一些特定选项,以使您的配置特别工作/稳定
- 这是archlinux的一个很好的论坛主题:https ://bbs.archlinux.org/viewtopic.php?id=162768
对于初学者来说,如果主机不尝试使用 GPU,这通常会很有帮助,这可以避免主机驱动程序解除绑定和重新绑定到设备的问题。有时确保主机 BIOS POST 消息显示在不同的 GPU 上也很有帮助。这有时可以通过 BIOS 设置、将卡移动到不同的插槽或启用/禁用旧版引导支持来完成。
首先,找到您的 VGA 卡的设备和供应商 ID:
$ lspci -n -s 01:00
01:00.0 0300: 10de:1381 (rev a2)
01:00.1 0403: 10de:0fbc (rev a1)
因此,此 GPU 及其音频功能的供应商:设备 ID 为 10de:1381、10de:0fbc。
然后,创建一个文件:
echo "options vfio-pci ids=10de:1381,10de:0fbc" > /etc/modprobe.d/vfio.conf
将驱动程序列入黑名单:
echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/blacklist.conf
并重新启动您的机器。
对于 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”。
英伟达提示
一些 Windows 应用程序,如 geforce experience、Passmark Performance Test 和 SiSoftware Sandra crash 可能会使 VM 崩溃。您需要添加:
echo "options 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 直通,它可以帮助禁用此功能,但请记住,必须在 UEFI 模式下安装 PVE,因为如果不启用此功能,它将无法在 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 文章: