ivanhao / pvetools

proxmox ve tools script(debian9+ can use it).Including email, samba, NFS set zfs max ram, nested virtualization ,docker , pci passthrough etc. for english user,please look the end of readme.
GNU General Public License v3.0
4.2k stars 512 forks source link

加强硬件直通的功能 #34

Closed lurenJBD closed 2 years ago

lurenJBD commented 2 years ago

很抱歉,不按格式来汇报,但应该看完我写的内容,应该还是能明白,只需要添加一点内容就可以完成了

开启PVE硬件直通就是修改grub启动参数,开启内核对应功能,但参数中还有两个可选参数

iommu=pt

关于"iommu=pt"参数的说明一: iommu=pt并不会影响kvm/dpdk/spdk的性能,这三者本质上都是用户态驱动,iommu=pt只会影响内核驱动,能让内核驱动设备性能更高。 参考来源:IOMMU(二)-从配置说起 - 知乎 (zhihu.com) 关于"iommu=pt"参数的说明二: You should also append the iommu=pt parameter. This will prevent Linux from touching devices which cannot be passed through. 你还应该附加 iommu=pt 参数。这将防止Linux将不能直通的设备直通。 参考来源:PCI passthrough via OVMF - ArchWiki (archlinux.org)

以及

pcie_acs_override=downstream

关于"pcie_acs_override=downstream"参数的说明: 用于将iommu groups拆分,方便直通一些板载的设备

举例说明: iommu group 分离错误导致无法直通单个网口,在虚拟机中添加单个网口会将整个PCIe设备直通给虚拟机,或直通失败

实际操作:

先查看PCI设备,确定网卡所属的ID

lspci -k | grep Eth

shell运行后返回内容:

04:00.0 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
        DeviceName:  Intel Ethernet X540 #1
        Subsystem: Super Micro Computer Inc Ethernet Controller 10-Gigabit X540-AT2
04:00.1 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
        DeviceName:  Intel Ethernet X540 #2
        Subsystem: Super Micro Computer Inc Ethernet Controller 10-Gigabit X540-AT2
05:00.0 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
        DeviceName:  Intel Ethernet X540 #3
        Subsystem: Super Micro Computer Inc Ethernet Controller 10-Gigabit X540-AT2
05:00.1 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
        DeviceName:  Intel Ethernet X540 #4
        Subsystem: Super Micro Computer Inc Ethernet Controller 10-Gigabit X540-AT2
06:00.0 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
        DeviceName:  Intel Ethernet X540 #5
        Subsystem: Super Micro Computer Inc Ethernet Controller 10-Gigabit X540-AT2
06:00.1 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
        DeviceName:  Intel Ethernet X540 #6
        Subsystem: Super Micro Computer Inc Ethernet Controller 10-Gigabit X540-AT2

可以看到有6个ID,分别对应6个网口,而我的使用的硬件板载的三个X540-AT2网卡,每张网口有两个网口,正好是6个

查看iommu groups方法:

ls /sys/kernel/iommu_groups/*/devices

shell运行后返回内容:(仅展示网卡ID部分)

/sys/kernel/iommu_groups/1/devices:
0000:04:00.0  0000:04:00.1  0000:05:00.0  0000:05:00.1  0000:06:00.0  0000:06:00.1

iommu group 无法自动分离可以改/etc/default/grub里的内容为

intel处理器 修改后:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream"

添加参数后,iommu_groups全部分离了(仅展示网卡ID部分)

/sys/kernel/iommu_groups/13/devices:
0000:04:00.0

/sys/kernel/iommu_groups/14/devices:
0000:04:00.1

/sys/kernel/iommu_groups/15/devices:
0000:05:00.0

/sys/kernel/iommu_groups/16/devices:
0000:05:00.1

/sys/kernel/iommu_groups/17/devices:
0000:06:00.0

/sys/kernel/iommu_groups/18/devices:
0000:06:00.1

刚刚好每个网口都在一个单独的iommu_groups,这样就可以单独的直通某个网口,而不是整个网卡设备了,但注意的是在虚拟机添加PCI设备选项中不要勾选所有功能!!!

PVE7.0之前的版本是需要替换有PCIe ACS 补丁的Linux内核才能正常将iommu group拆分,但本次使用的PVE版本为7.0-11并没有打补丁就能正常拆分iommu group 参考:解决j3455直通iommu分组问题,PVE内核编 其中有现成编译好的内核,下载替换即可,仅限PVE使用,其他Debian系统请自己测试

ivanhao commented 2 years ago

之前的版本只在显卡直通中添加分组参数。此次v2.3.0中将在配置硬件直接时直接添加此参数,并判断pve的版本,只在大于等于7的版本中添加此参数。

grayguest commented 1 year ago

“但注意的是在虚拟机添加PCI设备选项中不要勾选所有功能!!!” 这个是何解?是所有PCI设备都不能勾选所有功能吗?还是只指网卡?

很抱歉,不按格式来汇报,但应该看完我写的内容,应该还是能明白,只需要添加一点内容就可以完成了

开启PVE硬件直通就是修改grub启动参数,开启内核对应功能,但参数中还有两个可选参数

iommu=pt

关于"iommu=pt"参数的说明一: iommu=pt并不会影响kvm/dpdk/spdk的性能,这三者本质上都是用户态驱动,iommu=pt只会影响内核驱动,能让内核驱动设备性能更高。 参考来源:IOMMU(二)-从配置说起 - 知乎 (zhihu.com) 关于"iommu=pt"参数的说明二: You should also append the iommu=pt parameter. This will prevent Linux from touching devices which cannot be passed through. 你还应该附加 iommu=pt 参数。这将防止Linux将不能直通的设备直通。 参考来源:PCI passthrough via OVMF - ArchWiki (archlinux.org)

以及

pcie_acs_override=downstream

关于"pcie_acs_override=downstream"参数的说明: 用于将iommu groups拆分,方便直通一些板载的设备

举例说明: iommu group 分离错误导致无法直通单个网口,在虚拟机中添加单个网口会将整个PCIe设备直通给虚拟机,或直通失败

实际操作:

先查看PCI设备,确定网卡所属的ID

lspci -k | grep Eth

shell运行后返回内容:

04:00.0 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
        DeviceName:  Intel Ethernet X540 #1
        Subsystem: Super Micro Computer Inc Ethernet Controller 10-Gigabit X540-AT2
04:00.1 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
        DeviceName:  Intel Ethernet X540 #2
        Subsystem: Super Micro Computer Inc Ethernet Controller 10-Gigabit X540-AT2
05:00.0 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
        DeviceName:  Intel Ethernet X540 #3
        Subsystem: Super Micro Computer Inc Ethernet Controller 10-Gigabit X540-AT2
05:00.1 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
        DeviceName:  Intel Ethernet X540 #4
        Subsystem: Super Micro Computer Inc Ethernet Controller 10-Gigabit X540-AT2
06:00.0 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
        DeviceName:  Intel Ethernet X540 #5
        Subsystem: Super Micro Computer Inc Ethernet Controller 10-Gigabit X540-AT2
06:00.1 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
        DeviceName:  Intel Ethernet X540 #6
        Subsystem: Super Micro Computer Inc Ethernet Controller 10-Gigabit X540-AT2

可以看到有6个ID,分别对应6个网口,而我的使用的硬件板载的三个X540-AT2网卡,每张网口有两个网口,正好是6个

查看iommu groups方法:

ls /sys/kernel/iommu_groups/*/devices

shell运行后返回内容:(仅展示网卡ID部分)

/sys/kernel/iommu_groups/1/devices:
0000:04:00.0  0000:04:00.1  0000:05:00.0  0000:05:00.1  0000:06:00.0  0000:06:00.1

iommu group 无法自动分离可以改/etc/default/grub里的内容为

intel处理器 修改后:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream"

添加参数后,iommu_groups全部分离了(仅展示网卡ID部分)

/sys/kernel/iommu_groups/13/devices:
0000:04:00.0

/sys/kernel/iommu_groups/14/devices:
0000:04:00.1

/sys/kernel/iommu_groups/15/devices:
0000:05:00.0

/sys/kernel/iommu_groups/16/devices:
0000:05:00.1

/sys/kernel/iommu_groups/17/devices:
0000:06:00.0

/sys/kernel/iommu_groups/18/devices:
0000:06:00.1

刚刚好每个网口都在一个单独的iommu_groups,这样就可以单独的直通某个网口,而不是整个网卡设备了,但注意的是在虚拟机添加PCI设备选项中不要勾选所有功能!!!

PVE7.0之前的版本是需要替换有PCIe ACS 补丁的Linux内核才能正常将iommu group拆分,但本次使用的PVE版本为7.0-11并没有打补丁就能正常拆分iommu group 参考:解决j3455直通iommu分组问题,PVE内核编 其中有现成编译好的内核,下载替换即可,仅限PVE使用,其他Debian系统请自己测试