前言
对于PVE的核显直通对于不同的软件版本以及不同的硬件平台配置不尽相同,我也无法尝试验证每种组合下的配置情况,因此在这里给出我的配置环境以供大家参考:
- CPU:Intel N100
- ProxmoxVE:8.2.2
- Linux kernel:6.8.4-2-pve
系统配置之前,检查下BIOS的这些功能是否正确开启(畅网N100/N305 默认开启):
- Intel VMX虚拟化技术 (需要开启)
- VT-d (需要开启)
- SR-IOV (需要开启)
- IOMMU (需要开启)
- VMD setup menu (需要关闭)
开启IOMMU直通
Grub引导
Grub 是一个引导加载器,当电脑开机时,它会先被载入,然后GRUB 将负责加载操作系统。内核命令行需要放在变量GRUB_CMDLINE_LINUX_DEFAULT
文件中 /etc/default/grub
中,打开这个文件进行如下修改:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream i915.enable_guc=3 i915.max_vfs=7"
intel_iommu
与intel_iommu=on
:这会启用Intel 的IOMMU, IOMMU 是输入/输出内存管理单元,主要用于虚拟化情境,允许主机和虚拟机共享硬件资源;i915.enable_guc=3
与i915.max_vfs=7
:Intel i915驱动所需(来源于所需的内核参数);video=vesafb:off
与video=efifb:off
:不加载 vesafb 是 veas设备 的 fb ,efifb 是指 uefi设备 的 fb ,在 PVE 7.3 之后版本用initcall_blacklist=sysfb_init
替代(来源于PVE 7.3 优化和显卡直通);pcie_acs_override=downstream
:是为了将 iommu groups拆分,方便直通一些板载的设备(来源于加强硬件直通的功能)。这个参数可能在多个虚拟机使用同一PCIe设备时有所帮助,通常是在硬件层面上对虚拟机进行隔离;video=efifb:off
,vesafb:off
:efifb:off
:禁用efi启动的显示设备;vesafb:off
:禁用legacy启动的显示设备。
Systemd-boot引导
对于随 ZFS 一起安装的 EFI 系统,将使用根文件系统 systemd-boot。所有其他部署都使用标准的 Grub 引导加载程序(这通常也适用于安装在 Debian 之上的系统)。systemd-boot 是一个轻量级的 EFI 引导加载程序。它直接从安装它的 EFI 服务分区 (ESP) 读取内核和 initrd 映像。从 ESP 直接加载内核的主要优点是,它不需要重新实现用于访问存储的驱动程序。内核命令行需要作为一行放在 /etc/kernel/cmdline
中,修改如下:
root=ZFS=rpool/ROOT/pve-1 boot=zfs intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7
要应用更改,请运行 proxmox-boot-tool
刷新,这会将其设置为loader/entries/proxmox-*.conf
中所有配置文件的选项行。
# proxmox-boot-tool refresh
Running hook script 'proxmox-auto-removal'..
Running hook script 'zz-proxmox-boot'..
Re-executing '/etc/kernel/postinst.d/zz-proxmox-boot' in new private mount namespace..
Copying and configuring kernels on /dev/disk/by-uuid/AD4C-36C9
Copying kernel and creating boot-entry for 6.8.4-2-pve
Copying and configuring kernels on /dev/disk/by-uuid/AD4C-A52A
Copying kernel and creating boot-entry for 6.8.4-2-pve
验证配置
验证是否成功启用IOMMU:
# dmesg | grep -e DMAR -e IOMMU
[ 0.012712] ACPI: DMAR 0x0000000073166000 000088 (v02 INTEL EDK2 00000002 01000013)
[ 0.012751] ACPI: Reserving DMAR table memory at [mem 0x73166000-0x73166087]
[ 0.100058] DMAR: Host address width 39
[ 0.100060] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
[ 0.100071] DMAR: dmar0: reg_base_addr fed90000 ver 4:0 cap 1c0000c40660462 ecap 29a00f0505e
[ 0.100076] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
[ 0.100082] DMAR: dmar1: reg_base_addr fed91000 ver 5:0 cap d2008c40660462 ecap f050da
[ 0.100086] DMAR: RMRR base: 0x0000007c000000 end: 0x000000803fffff
[ 0.100091] DMAR-IR: IOAPIC id 2 under DRHD base 0xfed91000 IOMMU 1
[ 0.100094] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
[ 0.100096] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[ 0.101901] DMAR-IR: Enabled IRQ remapping in x2apic mode
[ 0.309007] pci 0000:00:02.0: DMAR: Skip IOMMU disabling for graphics
[ 0.387940] DMAR: No ATSR found
[ 0.387942] DMAR: No SATC found
[ 0.387944] DMAR: IOMMU feature fl1gp_support inconsistent
[ 0.387945] DMAR: IOMMU feature pgsel_inv inconsistent
[ 0.387947] DMAR: IOMMU feature nwfs inconsistent
[ 0.387949] DMAR: IOMMU feature dit inconsistent
[ 0.387951] DMAR: IOMMU feature sc_support inconsistent
[ 0.387952] DMAR: IOMMU feature dev_iotlb_support inconsistent
[ 0.387954] DMAR: dmar0: Using Queued invalidation
[ 0.387959] DMAR: dmar1: Using Queued invalidation
[ 0.389786] DMAR: Intel(R) Virtualization Technology for Directed I/O
验证是否成功启用IOMMU中断重映射:
# dmesg | grep remapping
[ 0.100096] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[ 0.101901] DMAR-IR: Enabled IRQ remapping in x2apic mode
如果失败或者没有,可能没有 启用IOMMU中断重映射 会导致无法直通,此时请参阅PVE直通显卡 & Intel SRIOV#开启IOMMU和硬件直通功能的第7点。
加载vifo内核模块
/etc/modules是Linux 系统中的一个配置文件,它用于列出在启动时应该自动载入的核心模组,这些模组通常是设备驱动或其他特殊功能的驱动,它们不是核心的固定部分,但可能是系统正常运行所需的。
当系统启动时,init 进程或相关的启动服务会读取/etc/modules文件,并使用modprobe
命令来载入其中列出的每一个模组。
例如,如果你有一个特定的硬体设备,如某种无线网卡,它需要一个特定的驱动来运行,但这个驱动不是预设载入的。在这种情况下,你可以将该驱动的模组名称添加到/etc/modules 文件中,确保每次系统启动时它都会被载入。
打开/etc/modules加入如下内容:
vfio
vfio_iommu_type1
vfio_pci
# vfio_virqfd
vfio
:这是VFIO(Virtual Function I/O)的主模组。 VFIO 是一种提供安全和模块化的方法来访问硬件的框架,通常用于虚拟化;vfio_iommu_type1
:这是VFIO 的IOMMU 驱动,它支持Type 1(I/O Virtualization);vfio_pci
:这个模组是用于PCI/PCIe 设备的VFIO 驱动;vfio_virqfd
:这是一个支持VFIO 虚拟中断的模组(vfio_virqfd
在 Linux Kernel 6.2 以上版本中无需加载,来源于Proxmox#Kernel Modules)。
将这些模组添加到/etc/modules 会确保在系统启动时它们被载入,这通常在设置硬件虚拟化或特定的硬件直通(如GPU 直通到虚拟机)时是必要的。使得系统在必要时启用IOMMU转换,将iommu分组相关的内核模块启用,从而可以提高VM中未使用的PCIe设备的性能。
在完成如上修改后需要刷新 initramfs ,在 Proxmox VE 上,可以通过执行以下命令来完成:
# update-initramfs -u -k all
SR-IOV核显虚拟化
Intel SR-IOV vGPU是一种硬件虚拟化技术,它允许多个虚拟机共享单个物理GPU,而不会降低性能。SR-IOV定义了一种标准方法,通过将设备分区为多个虚拟功能来共享物理设备功能。每个虚拟功能直接分配给一个虚拟机,从而实现了接近本地性能的虚拟机。Intel Graphics SR-IOV是Intel的最新图形虚拟化技术,它允许多个虚拟机共享单个物理GPU,从而实现了在虚拟机中的GPU加速工作负载。
准备工作
添加Promox源:
# echo "deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription" > /etc/apt/sources.list.d/pve.list apt update
若进行过内核版本升级,使用下面命令重新安装内核和内核头并切换,以避免虚拟化失败,若未升级过请忽略。
# apt install pve-kernel-$(uname -r)
# proxmox-boot-tool kernel pin $(uname -r)
# apt install pve-headers-$(uname -r)
安装构建工具:
# apt install build-* dkms
安装核显驱动
克隆Linux i915 驱动程序(dkms 模块)仓库到本地,然后执行命令如下:
# git clone https://github.com/strongtz/i915-sriov-dkms.git
# cd i915-sriov-dkms/
# dkms add .
Creating symlink /var/lib/dkms/i915-sriov-dkms/2024.09.21/source -> /usr/src/i915-sriov-dkms-2024.09.21
# dkms install -m i915-sriov-dkms -v $(cat VERSION) --force
Sign command: /lib/modules/6.8.4-2-pve/build/scripts/sign-file
Signing key: /var/lib/dkms/mok.key
Public certificate (MOK): /var/lib/dkms/mok.pub
Certificate or key are missing, generating self signed certificate for MOK...
Building module:
Cleaning build area...
make -j4 KERNELRELEASE=6.8.4-2-pve -C /lib/modules/6.8.4-2-pve/build M=/var/lib/dkms/i915-sriov-dkms/2024.09.21/build................................
Signing module /var/lib/dkms/i915-sriov-dkms/2024.09.21/build/i915.ko
Cleaning build area...
i915.ko:
Running module version sanity check.
- Original module
- Installation
- Installing to /lib/modules/6.8.4-2-pve/updates/dkms/
depmod...
验证安装状态如下则为安装成功:
# dkms status
i915-sriov-dkms/2024.09.21, 6.8.4-2-pve, x86_64: installed
为了启用 VF,必须安装sysfsutils
以设置sysfs
属性:
# apt install sysfsutils
使用lspci | grep VGA
查找 iGPU 所在的 PCIe 总线:
# lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics]
添加VFs参数如下:
# echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 3" > /etc/sysfs.conf
下面命令中sriov_numvfs = 3
的3
代表SRIOV核显数量,可自定义设定(N100建议最高3),最多设置7个设置为1个性能最强,如果设置为7个,那么每一个的性能只有14%。
安装i915驱动
在重启后并未按照预期的出现虚拟的显卡设备,查看dmesg信息如下:
# lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics]
# dmesg | grep i915
use xe.force_probe='46d1' and i915.force_probe='!46d1'
[ 4.719154] i915: module verification failed: signature and/or required key missing - tainting kernel
[ 5.051857] i915 0000:00:02.0: [drm] VT-d active for gfx access
[ 5.051891] i915 0000:00:02.0: vgaarb: deactivate vga console
[ 5.051952] i915 0000:00:02.0: [drm] Using Transparent Hugepages
[ 5.052339] i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem
[ 5.053221] mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915])
[ 5.063112] i915 0000:00:02.0: [drm] Finished loading DMC firmware i915/adlp_dmc.bin (v2.20)
[ 5.066881] i915 0000:00:02.0: [drm] GT0: GuC firmware i915/adlp_guc_70.bin version 70.20.0
[ 5.066892] i915 0000:00:02.0: [drm] GT0: HuC firmware i915/tgl_huc.bin version 7.9.3
[ 5.071567] i915 0000:00:02.0: [drm] GT0: HuC: authenticated for all workloads!
[ 5.072232] i915 0000:00:02.0: [drm] GT0: GUC: submission enabled
[ 5.072235] i915 0000:00:02.0: [drm] GT0: GUC: SLPC enabled
[ 5.072557] i915 0000:00:02.0: [drm] GuC RC: enabled
[ 5.072603] i915 0000:00:02.0: [drm] *ERROR* GT0: GUC: mmio request 0x4100: failure 201/0
[ 5.072607] i915 0000:00:02.0: [drm] *ERROR* GT0: Failed to retrieve hwconfig table: -ENOENT
[ 5.073472] mei_pxp 0000:00:16.0-fbf6fcf1-96cf-4e2e-a6a6-1bab8cbe36b1: bound 0000:00:02.0 (ops i915_pxp_tee_component_ops [i915])
[ 5.073653] i915 0000:00:02.0: [drm] Protected Xe Path (PXP) protected content support initialized
[ 5.074657] [drm] Initialized i915 1.6.0 20201103 for 0000:00:02.0 on minor 0
[ 5.077229] i915 0000:00:02.0: [drm] Cannot find any crtc or sizes
[ 5.077232] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915])
[ 5.077732] i915 0000:00:02.0: [drm] Cannot find any crtc or sizes
[ 5.078040] i915 0000:00:02.0: [drm] Cannot find any crtc or sizes
Debian中的backports存储库是一个额外的软件源,它包含了针对最新Debian稳定版本的软件包的更新版本。这些软件包经过测试,可以安全地在当前稳定版本上运行,但可能会包含新功能或修复了一些bug。backports存储库允许用户在不升级整个操作系统的情况下,使用最新的软件包。
尝试安装英特尔向后兼容显卡驱动程序 (intel-gpu-i915-backports):
# apt install flex bison # 安装依赖
# wget https://github.com/moetayuko/intel-gpu-i915-backports/releases/download/I915MT65-24.1.19-4/intel-i915-dkms_1.24.1.19.240119.1.nodrm+i4-1_all.deb # 下载发布页最新软件包
# sudo dpkg -i intel-i915-dkms_1.24.1.19.240119.1.nodrm+i4-1_all.deb # 安装软件包
配置验证
完成上述的所有配置后重启系统,验证SR-IOV过程如下,可以看到已经成功多出3个SR-IOV显卡设备:
# dmesg | grep i915
[ 0.000000] Command line: initrd=\EFI\proxmox\6.8.4-2-pve\initrd.img-6.8.4-2-pve root=ZFS=rpool/ROOT/pve-1 boot=zfs intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7
[ 0.040311] Kernel command line: initrd=\EFI\proxmox\6.8.4-2-pve\initrd.img-6.8.4-2-pve root=ZFS=rpool/ROOT/pve-1 boot=zfs intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7
use xe.force_probe='46d1' and i915.force_probe='!46d1'
[ 4.806867] i915_compat: module verification failed: signature and/or required key missing - tainting kernel
[ 5.230381] i915 0000:00:02.0: Running in SR-IOV PF mode
[ 5.231451] i915 0000:00:02.0: [drm] VT-d active for gfx access
[ 5.243440] i915 0000:00:02.0: vgaarb: deactivate vga console
[ 5.243530] i915 0000:00:02.0: [drm] Using Transparent Hugepages
[ 5.244051] i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=io+mem:owns=io+mem
[ 5.244971] mei_hdcp 0000:00:16.0-b638ab7e-94e2-4ea2-a552-d1c54b627f04: bound 0000:00:02.0 (ops i915_hdcp_ops [i915])
[ 5.257331] i915 0000:00:02.0: [drm] Finished loading DMC firmware i915/adlp_dmc.bin (v2.20)
[ 5.261143] i915 0000:00:02.0: [drm] GT0: GuC firmware i915/tgl_guc_70.bin version 70.20.0
[ 5.261154] i915 0000:00:02.0: [drm] GT0: HuC firmware i915/tgl_huc.bin version 7.9.3
[ 5.265949] i915 0000:00:02.0: [drm] GT0: HuC: authenticated for all workloads
[ 5.266619] i915 0000:00:02.0: [drm] GT0: GUC: submission enabled
[ 5.266623] i915 0000:00:02.0: [drm] GT0: GUC: SLPC enabled
[ 5.266964] i915 0000:00:02.0: [drm] GT0: GUC: RC enabled
[ 5.290361] [drm] Initialized i915 1.6.0 20201103 for 0000:00:02.0 on minor 1
[ 5.292354] i915 display info: display version: 13
[ 5.292357] i915 display info: cursor_needs_physical: no
[ 5.292359] i915 display info: has_cdclk_crawl: yes
[ 5.292360] i915 display info: has_cdclk_squash: no
[ 5.292360] i915 display info: has_ddi: yes
[ 5.292361] i915 display info: has_dp_mst: yes
[ 5.292362] i915 display info: has_dsb: yes
[ 5.292363] i915 display info: has_fpga_dbg: yes
[ 5.292364] i915 display info: has_gmch: no
[ 5.292364] i915 display info: has_hotplug: yes
[ 5.292365] i915 display info: has_hti: no
[ 5.292366] i915 display info: has_ipc: yes
[ 5.292366] i915 display info: has_overlay: no
[ 5.292367] i915 display info: has_psr: yes
[ 5.292368] i915 display info: has_psr_hw_tracking: no
[ 5.292369] i915 display info: overlay_needs_physical: no
[ 5.292370] i915 display info: supports_tv: no
[ 5.292370] i915 display info: has_hdcp: yes
[ 5.292371] i915 display info: has_dmc: yes
[ 5.292372] i915 display info: has_dsc: yes
[ 5.292517] i915 0000:00:02.0: 7 VFs could be associated with this PF
[ 5.319402] snd_hda_intel 0000:00:1f.3: bound 0000:00:02.0 (ops i915_audio_component_bind_ops [i915])
[ 5.320151] fbcon: i915drmfb (fb0) is primary device
[ 5.391253] i915 0000:00:02.0: [drm] fb0: i915drmfb frame buffer device
[ 6.601864] i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=none:owns=io+mem
use xe.force_probe='46d1' and i915.force_probe='!46d1'
[ 6.603816] i915 0000:00:02.1: enabling device (0000 -> 0002)
[ 6.604200] i915 0000:00:02.1: Running in SR-IOV VF mode
[ 6.604959] i915 0000:00:02.1: [drm] GT0: GUC: interface version 0.1.9.0
[ 6.605913] i915 0000:00:02.1: [drm] VT-d active for gfx access
[ 6.606250] i915 0000:00:02.1: [drm] Using Transparent Hugepages
[ 6.606811] i915 0000:00:02.1: [drm] GT0: GUC: interface version 0.1.9.0
[ 6.607654] i915 0000:00:02.1: [drm] GT0: GUC: interface version 0.1.9.0
[ 6.608908] i915 0000:00:02.1: GuC firmware PRELOADED version 0.0 submission:SR-IOV VF
[ 6.609193] i915 0000:00:02.1: HuC firmware PRELOADED
[ 6.611864] i915 0000:00:02.1: [drm] PMU not supported for this GPU.
[ 6.612296] [drm] Initialized i915 1.6.0 20201103 for 0000:00:02.1 on minor 0
[ 6.614634] i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=io+mem
[ 6.614918] i915 0000:00:02.1: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=none:owns=none
use xe.force_probe='46d1' and i915.force_probe='!46d1'
[ 6.616734] i915 0000:00:02.2: enabling device (0000 -> 0002)
[ 6.617082] i915 0000:00:02.2: Running in SR-IOV VF mode
[ 6.617873] i915 0000:00:02.2: [drm] GT0: GUC: interface version 0.1.9.0
[ 6.618508] i915 0000:00:02.2: [drm] VT-d active for gfx access
[ 6.618822] i915 0000:00:02.2: [drm] Using Transparent Hugepages
[ 6.619502] i915 0000:00:02.2: [drm] GT0: GUC: interface version 0.1.9.0
[ 6.620161] i915 0000:00:02.2: [drm] GT0: GUC: interface version 0.1.9.0
[ 6.620815] i915 0000:00:02.2: GuC firmware PRELOADED version 0.0 submission:SR-IOV VF
[ 6.621093] i915 0000:00:02.2: HuC firmware PRELOADED
[ 6.623685] i915 0000:00:02.2: [drm] PMU not supported for this GPU.
[ 6.624056] [drm] Initialized i915 1.6.0 20201103 for 0000:00:02.2 on minor 2
[ 6.626106] i915 0000:00:02.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=io+mem
[ 6.626384] i915 0000:00:02.1: vgaarb: VGA decodes changed: olddecodes=none,decodes=none:owns=none
[ 6.626658] i915 0000:00:02.2: vgaarb: VGA decodes changed: olddecodes=io+mem,decodes=none:owns=none
use xe.force_probe='46d1' and i915.force_probe='!46d1'
[ 6.628452] i915 0000:00:02.3: enabling device (0000 -> 0002)
[ 6.628776] i915 0000:00:02.3: Running in SR-IOV VF mode
[ 6.629360] i915 0000:00:02.3: [drm] GT0: GUC: interface version 0.1.9.0
[ 6.629976] i915 0000:00:02.3: [drm] VT-d active for gfx access
[ 6.630291] i915 0000:00:02.3: [drm] Using Transparent Hugepages
[ 6.630960] i915 0000:00:02.3: [drm] GT0: GUC: interface version 0.1.9.0
[ 6.631664] i915 0000:00:02.3: [drm] GT0: GUC: interface version 0.1.9.0
[ 6.632523] i915 0000:00:02.3: GuC firmware PRELOADED version 0.0 submission:SR-IOV VF
[ 6.632766] i915 0000:00:02.3: HuC firmware PRELOADED
[ 6.634466] i915 0000:00:02.3: [drm] PMU not supported for this GPU.
[ 6.634899] [drm] Initialized i915 1.6.0 20201103 for 0000:00:02.3 on minor 3
[ 6.635409] i915 0000:00:02.0: Enabled 3 VFs
# lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics]
00:02.1 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics]
00:02.2 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics]
00:02.3 VGA compatible controller: Intel Corporation Alder Lake-N [UHD Graphics]
配置虚拟机
完成显卡的SR-IOV配置后我们需要将虚拟出来的显卡添加到虚拟机中,首先需要将虚拟机显示设为无
或者VirtIO-GPU(这里我设置为无时无法启动虚拟机)。
然后为虚拟机添加PCI设备。
这里需要注意的是不要选择0000:00:02.0设备(其他比如0000:00:02.1,0000:00:02.2都是可以的),以及不要勾All Functions(All Functions会将的VF都会被分配到一个虚拟机中),安装Win虚拟机时需要勾选主GPU
选项,才能正确安装核显驱动,其他虚拟机按需勾选。
完成配置后启动虚拟机,进入命令行后使用lspci
确认是否正确的完成显卡直通,直通前后对比如下:
# 配置直通前
00:02.0 VGA compatible controller: Device 1234:1111 (rev 02)
# 配置直通后
00:02.0 VGA compatible controller: Red Hat, Inc. Virtio 1.0 GPU (rev 01)
参考
- https://www.cloudstaymoon.com/2024/04/10/all-in-one-1
- https://www.aitxn.com/565.html
- https://post.smzdm.com/p/a5o38n37/
- https://www.cnblogs.com/MAENESA/p/18005241
- https://blog.csdn.net/Abin17618/article/details/135360998
- https://diyforfun.cn/605.html
- https://bbs.cnction.com/forum.php?mod=viewthread&tid=535
- https://blog.csdn.net/tzconn/article/details/142059054
- https://blog.mstg.top/archives/933
- https://foxi.buduanwang.vip/virtualization/pve/1536.html/
- https://www.gitlx.com/2021/03/iommu/
- https://www.151365.io/post/49
- https://www.frostfox.cn/pve/2024/sriov.html