介绍
PCI 直通允许您在虚拟机中使用物理 PCI 设备(图形卡、网卡)(仅限 KVM 虚拟化)
如果对设备进行“PCI 直通”,则主机将无法再使用该设备
注意:
PCI直通是Proxmox VE的一项实验性功能!无法迁移具有直通设备的 VM
启用 IOMMU
您需要通过编辑内核命令行来启用 IOMMU
首先打开引导加载程序内核命令行配置文件
GRUB:
nano /etc/default/grub
查找带有“GRUB_CMDLINE_LINUX_DEFAULT”的行
英特尔处理器
对于英特尔 CPU,请添加
intel_iommu=on
AMD 处理器
对于 AMD 处理器,请添加
amd_iommu=on
改完后:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
然后保存更改并更新 grub:
update-grub
重启虚拟机
reboot
PT 模式
英特尔和AMD芯片都可以使用附加参数“iommu=pt”,以与上述相同的方式添加到内核cmdline中。
iommu=pt
这仅在必要时启用 IOMMU 转换,适配器不需要对内存使用 DMA 转换,因此可以提高虚拟机管理程序 PCIe 设备(未直通到 VM)的性能
验证是否已启用 IOMMU
dmesg | grep -e DMAR -e IOMMU
输出 "DMAR: IOMMU enabled". 如果没有输出,则有问题。
添加模块
所需模块添加到 /etc/modules
nano /etc/modules
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
vfio_iommu_type1
vfio_pci
vfio_virqfd
IOMMU 中断重映射
如果没有中断重映射,将无法使用 PCI 直通。设备分配将失败,并显示“无法分配设备”[设备名称]“:不允许操作”或“找不到中断重新映射硬件,将设备传递到非特权域不安全”错误。
所有使用英特尔处理器和芯片组的系统,如果支持英特尔定向 I/O 虚拟化技术 (VT-d),但不支持中断重映射,将看到此类错误。较新的处理器和芯片组(AMD 和英特尔)中提供了中断重映射支持。
要确定您的系统是否支持中断重映射,请执行以下操作:
dmesg | grep 'remapping'
如果您看到以下行之一:
"DMAR-IR: Enabled IRQ remapping in xapic mode"
"x2apic: IRQ remapping doesn't support X2APIC mode" (“x2apic”在旧 CPU 上可能有所不同,但应该仍然有效)
"x2apic: IRQ remapping doesn't support X2APIC mode" (“x2apic”在旧 CPU 上可能有所不同,但应该仍然有效)
支持重映射。
如果您的系统不支持中断重映射,则可以允许不安全的中断:
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf
验证 IOMMU 隔离
对于正常工作的 PCI 直通,需要为要分配给 VM 的所有 PCI 设备使用专用的 IOMMU 组。
你应该有这样的东西:
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
/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