PCI(e) 直通是一种机制,用于让虚拟机控制 来自主机的 PCI 设备。以及使用虚拟化硬件,例如更低的延迟、更高的性能或更高 功能(例如,卸载)。
但是,如果通过设备传递到虚拟机,则无法在主机或任何其他 VM 中使用该设备。 请注意,虽然 PCI 直通可用于 i440fx 和 q35 计算机,但 PCIe 直通仅在 Q35 计算机上可用。这并不意味着作为 PCI 设备传递的 PCIe 设备只能有PCI 速度。以 PCIe 身份通过设备只是为访客设置一个标志 告诉它该设备是PCIe设备,而不是“非常快的传统PCI 设备“。一些来宾应用程序从中受益。 1 前提条件1.1 硬件条件由于直通是在真实硬件上执行的,因此需要满足一些 要求。下面简要概述了这些要求。
硬件需要支持 IOMMU (I/O Memory Management Unit) 中断重新映射,这包括 CPU 和主板。
通常,具有 VT-d 的 Intel 系统和带有 AMD-Vi 的 AMD 系统都支持此功能。 但不能保证一切都会开箱即用,因为 硬件实现不良以及驱动程序缺失或质量低下。
此外,服务器级硬件通常比消费级硬件具有更好的支持 硬件,但即便如此,许多现代系统也可以支持这一点。 1.2 BIOS设置您必须在 BIOS/UEFI 中启用 IOMMU 支持。通常 相应的设置称为 IOMMU 或 VT-d。 2 查看pcie设备最简单的方法是使用 GUI 在 VM 的 VM 中添加“主机 PCI”类型的设备 “硬件”选项卡。或者,可以使用命令行。 lspci
比如说要查看pcie网卡信息 lspci | grep -i ethernet
3 查看硬件直通情况从命令行运行 如果没有输出,则说明为配置硬件直通?。 dmesg | grep -e DMAR -e IOMMU
4 开启硬件直通目前pve8.0以上直通很简单,不需要多设置。 nano /etc/default/grub
修改这一行 GRUB_CMDLINE_LINUX_DEFAULT="quiet"
intel的cpu改为这个 GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
amd改为这个 GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
intel_iommu=on:内容在内核上启用 IOMMU。
iommu=pt的注释:如果硬件支持 IOMMU 直通模式,则启用此模式可能会提高性能。 这是因为 VM 通常会绕过(默认)DMA 转换 由虚拟机管理程序执行,而是将 DMA 请求直接传递给硬件IOMMU。 update-grub
5 增加系统内核模块这仅在必要时启用IOMMU转换,将iommu分组相关的内核模块启用,从而可以提高VM中未使用的PCIe设备的性能。 nano /etc/modules
添加 vfio vfio_iommu_type1 vfio_pci vfio_virqfd #not needed if on kernel 6.2 or newer
注意:在高于 6.2 的内核(Proxmox VE 8 及更高版本)中 vfio_virqfd模块是VFIO模块的一部分,因此无需在Proxmox VE 8及更高版本中加载vfio_virqfd。 更改与模块相关的任何内容后,您需要刷新 initramfs。在Proxmox VE上,这可以通过执行以下命令来完成: update-initramfs -u -k all
要检查模块是否正在加载,输出 lsmod | grep vfio
应包括上面的四个模块。 6 检查直通情况重启!从命令行运行 以下命令如果没有输出,则说明有问题。 dmesg | grep -e DMAR -e IOMMU
如果有,可基本确认这个过程顺利完成! 应显示IOMMU, Directed I/O 或 Interrupt Remapping表明直通启用,根据硬件和内核的不同,确切的消息可能会有所不同。 接下来就可以为虚拟机正常的添加硬件直通了。
其他的黑名单都不用设置,官方贴心的自动禁用了。 7 虚拟机配置通过 GPU 时,使用 q35 作为机器类型、OVMF(虚拟机的 UEFI)而不是 SeaBIOS时,PCIe 时达到最佳兼容性。
|