PVE开启IOMMU(硬件直通)
硬件直通
确认主板支持
启用 VT-d
启用 amd-v(amd cpu)
禁用 CSM # i44fx机型建议开启此项,并且设置csm里的其他项目为UEFI
ACS Enable # 如果存在,设置为已启用(自动不起作用)
启用 4G解码 4G Decoding
禁用 Resizable BAR/Smart Access Memory智能访问内存 #(如果启用,AMD GPUS(Vega 及更高版本)会遇到“代码 43 错误”)
启用 IOMMU # 如果存在,主要用于 AMD 主板
将主显示器设置为 CPU/iGPU # 如果您的 CPU 有 iGPU
预分配内存为 64M
忽略部分错误(同 忽略显卡警告(Nvidia专属)
忽略 dmesg 输出中的一些的错误, 请运行以下命令(# 这一步对于直通来说不是必需的,但有助于保持干净。)
nano /etc/modprobe.d/kvm.conf
options kvm ignore_msrs=Y report_ignored_msrs=0
# 按 Ctrl + X,然后按 Y + Enter 保存更改。
开启iommu
IOMMU(Input-Output Memory Management Unit)是一种硬件功能,用于管理设备对系统内存的访问。启用 IOMMU 后,可以在虚拟机中直接访问物理设备,并允许虚拟机独立于主机操作系统运行
-
编辑(nano、vi) /etc/default/grub ,并修改 GRUB_CMDLINE_LINUX_DEFAULT 那一行。
# 对于 Intel CPU GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream,multifunction pci=nommconf" # 对于 AMD CPU GRUB_CMDLINE_LINUX_DEFAULT="quiet iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream,multifunction pci=nommconf" # 其他的一些写法(如果是AMD处理器,将intel改为amd) GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_gvt=1 video=efifb:off" # 这是GVT模式,也就是共享模式,少部分cpu支持,但体验很好 GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off" # 这是独占模式,都支持,但显示器没有pve的控制台输出,也只能直通个一个虚拟机 GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction" GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on initcall_blacklist=sysfb_init pcie_acs_override=downstream,multifunction" # 参数释义 1.iommu=pt:启用 Intel VT-d 或 AMD-Vi 的 IOMMU。这是一种硬件功能,用于管理设备对系统内存的访问。在虚拟化环境中,启用 IOMMU 后,可以将物理设备直通到虚拟机中,以便虚拟机可以直接访问硬件设备。“iommu=pt”不是必须的,PT模式只在必要的时候开启设备的IOMMU转换,可以提高未直通设备PCIe的性能,建议添加。 2.initcall_blacklist=sysfb_init:禁用 sysfb_init 内核初始化函数。这个函数通常用于在内核启动过程中初始化系统帧缓冲。在使用 GPU 直通的情况下,这个函数可能会干扰直通操作,因此需要禁用它。 3.i915.enable_gvt=1:启用 Intel GVT-g 虚拟 GPU 技术。这个选项用于创建一个虚拟的 Intel GPU 设备,以便多个虚拟机可以共享物理 GPU 设备。启用 GVT-g 需要在支持虚拟 GPU 的 Intel CPU 和主板上运行,并且需要正确配置内核和虚拟机。想开启GVT-g的就添加这条,显卡直通的就不要添加了。 4.initcall_blacklist=sysfb_init:屏蔽掉pve7.2以上的一个bug,方便启动时候就屏蔽核显等设备驱动; 5.pcie_acs_override=downstream,multifunction:便于iommu每个设备单独分组,以免直通导致物理机卡死等问题 6.pci=nommconf:意思是禁用pci配置空间的内存映射,所有的 PCI 设备都有一个描述该设备的区域(您可以看到lspci -vv),访问该区域的最初方法是通过 I/O 端口,而 PCIe 允许将此空间映射到内存以便更简单地访问。
intel_iommu 和 amd_iommu=on 为 开启IOMMU video=vesafb:off 不加载 vesafb 是 veas设备 的 fb video=efifb:off 不加载 uefi设备 的 fb 在 PVE 7.3 之后版本用initcall_blacklist=sysfb_init 替代 pcie_acs_override=downstream 是为了将 iommu groups拆分, 方便直通一些板载的设备(来源于加强硬件直通的功能)
-
更新GRUB
proxmox-boot-tool refresh 或 update-grub reboot
-
加载内核模块,编辑
/etc/modules
,新增一下内容nano /etc/modules # 添加以下行; vfio vfio_iommu_type1 vfio_pci #vfio_virqfd vfio_virqfd 在 Linux 6.2 以上版本中不适用,低于 Linux 6.2 的请取消注释-
-
刷新 initramfs。 运行以下命令
update-initramfs -u -k all
-
验证是否成功,输入命令,如有类似下列提示,则成功
dmesclg | grep -e DMAR -e IOMMU # 如果没有输出,则说明有问题。你应该看到这样的东西;“DMAR: IOMMU enabled” # 另外一种验证方式 dmesg | grep iommu [ 1.341100] pci 0000:00:00.0: Adding to iommu group 0 [ 1.341116] pci 0000:00:01.0: Adding to iommu group 1 [ 1.341126] pci 0000:00:02.0: Adding to iommu group 2 [ 1.341137] pci 0000:00:14.0: Adding to iommu group 3 [ 1.341146] pci 0000:00:17.0: Adding to iommu group 4 # 此时输入命令 find /sys/kernel/iommu_groups/ -type l # 出现很多直通组,就代表成功了。如果没有任何东西,就是没有开启
-
验证是否 启用IOMMU中断重映射 输入
dmesg | grep remapping
并输出 类似 以下内容即为成功。到目前为止可以 直通 除显卡外 的 PCI-E设备。dmesg | grep remapping # intel [ 0.175675] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping. [ 0.177198] DMAR-IR: Enabled IRQ remapping in x2apic mode # amd AMD-Vi: Interrupt remapping enabled
-
如果失败或者没有,可能没有 启用IOMMU中断重映射 ,会导致无法直通,请如下操作。
vim /etc/modprobe.d/iommu_unsafe_interrupts.conf #增加 options vfio_iommu_type1 allow_unsafe_interrupts=1
-
显卡直通
-
屏蔽驱动 编辑
/etc/modprobe.d/pve-blacklist.conf
,添加以下内容nano /etc/modprobe.d/pve-blacklist.conf # 添加以下行; # Nvidia blacklist nvidiafb blacklist nouveau blacklist nvidia # AMD blacklist amdgpu blacklist radeon # Intel UHD blacklist snd_hda_codec_hdmi blacklist snd_hda_intel blacklist snd_hda_codec blacklist snd_hda_core blacklist i915
-
忽略显卡警告(Nvidia专属,主要在 Win 中遇到一些应用,列如 GeForce Experience 、Passmark Performance Test 和 SiSoftware Sandra) 编辑
/etc/modprobe.d/kvm.conf
options kvm ignore_msrs=1 report_ignored_msrs=0 ignore_msrs 忽略异常 report_ignored_msrs 是否报告异常
-
配置 VFIO ,主要用于 显示输出 和 音频输出 分开
-
查看显卡ID 输入
lspci -nn | grep VGA
,得到类似以下内容lspci -nn | grep -i “device” # 您也可以执行 lspci -nn 命令,这将列出所有设备及ID # “device”= amd、ati、nvidia、vga、usb、audio、wireless 等 # 然后您应该会看到类似于下面的列表; # 一次只引用一个设备,并记下您需要的 ID。 “0x:00.x VGA compatible controller … [1234:5678]” “0x.00.x Audio Device … [1234:5678]” # 无需记下 GPU 音频 ID。 “0x.00.x USB controller … [1234:5678]”
-
获取 设备ID 和 音频ID , 输入
lspci -n -s 02:00
上面的IDlspci -n -s 02:00 01:00.0 0300: 10dg:1fa2 (rev a1) 01:00.1 0403: 10dg:10fd (rev a1)
-
将 设备ID 和 音频ID 写入到
/etc/modprobe.d/vfio.conf
nano /etc/modprobe.d/vfio-pci.conf # 请注意,在此处添加disable_vga 可能会阻止来宾在SeaBIOS 模式下启动,也可以将disable_vga=1参数去掉 # 像这样在此文件中添加设备 ID,两组以上用,隔开,只有一个就不用了; options vfio-pci ids=1234:5678,1234:5678 disable_vga=1 # 再次强调,不要添加 GPU 音频 ID。 #如果有多个设备,ids后面每个设备之间用,隔开
-
更新内核,重启
update-initramfs -u reboot
-
检查
vfio-pci
是否应用成功 输入lspci -nnk
并找到 显卡编号 那一行,如果得到类似以下结果,为成功01:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU117GLM [Quadro T400 Mobile] [10dg:1fa2] (rev a1) Subsystem: NVIDIA Corporation TU117GLM [Quadro T400 Mobile] [10dg:1fa2] Kernel driver in use: vfio-pci Kernel modules: nvidiafb, nouveau 01:00.1 Audio device [0403]: NVIDIA Corporation Device [10dg:10fd] (rev a1) Subsystem: NVIDIA Corporation Device [10dg:10fd] Kernel driver in use: vfio-pci Kernel modules: snd_hda_intel #结果中有 Kernel driver in use: vfio-pci 即为成功
-
添加显卡到虚拟机
创建虚拟机
常规 选项卡请根据自己情况填写
操作系统 选项卡请根据自己情况填写
系统 选项卡
- 显卡 选择
标准VGA
、SPICE
、VirtlO-GPU
、VirGL GPU
任选其一即可 - 机型 选择
q35
- Qemu代理 选择 开启(一般会安装的,类似 ESXI agent,用于与 虚拟机通信 获取 虚拟机信息)
- BIOS 选择
OVMF(UEFI)
,并选择EFI存储
磁盘 选项卡请根据自己情况填写
CPU 选项卡
- 类别 推荐选择
host
- 其他请根据自己情况填写
内存 选项卡
- 推荐关闭
Ballooning设备
,因为 硬件直通 的 虚拟机 需要保证内存不是共享的。
网络 选项卡请根据自己情况填写
添加显卡到虚拟机
选择 虚拟机 , 并点击 硬件
点击 添加 , 然后点击 PCI设备
选择 原始设备
,在 设备 中选择需要直通的显卡
启用 所有功能 、 主GPU 、 ROM-Bar 、 PCI-Express
其中 主GPU 可以不用选择,此选项影响 显卡 为 默认参数(会导致无法启动终端) 所有功能 、ROM-Bar 、 PCI-Express 经测试不影响
nvidia-smi
命令
点击添加
intel GVT-g虚拟化核显
理论上支持intel 5-10代CPU
-
改 GRUB配置 ,在 GRUB_CMDLINE_LINUX_DEFAULT= 行添加
intel_iommu=on i915.enable_gvt=1
-
更新Grub,update-grub
Or
proxmox-boot-tool refresh -
检查 IOMMU是否开启
-
加载内核模块
编辑 /etc/modules vfio vfio_iommu_type1 vfio_pci # vfio_virqfd kvmgt #vfio_virqfd 在 Linux 6.2 以上版本中不适用,低于 Linux 6.2 的请取消注释
-
更新内核
update-initramfs -u
,并重启pve -
验证量否开启
ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/ # 如果不是,将00:02.0换成自己的 # 出现下面4个选项或者类似的即成功 i915-GVTg_V5_1 i915-GVTg_V5_2 i915-GVTg_V5_4 i915-GVTg_V5_8