前提条件
首先要保证BIOS中开启了VT-d或类似的虚拟化技术,否则是无法直通成功的
设置过程
开启IOMMU
然后我们需要在Grub引导中开启iommu
编辑文件
编辑:nano /etc/default/grub
不直通任何显卡
# Intel CPU
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction pci=nommconf"
# AMD CPU
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt pcie_acs_override=downstream,multifunction pci=nommconf"
如需要直通显卡
# 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 amd_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream,multifunction pci=nommconf"
使用GVT-G显卡
仅支持Intel 4~10代HD/UHD核显
# Intel CPU
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_gvt=1 initcall_blacklist=sysfb_init"
完整参数对照表
nano /etc/default/grub # 将以下行粘贴到其中,并在旧标签前面添加一个注释标签#,以下为常用的一些写法。
# 对于 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的控制台输出,也只能直通个一个虚拟机
# 参数释义
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 允许将此空间映射到内存以便更简单地访问。
添加VFIO模块
编辑文件:nano /etc/modules
vfio
vfio_pci
vfio_virqfd
vfio_iommu_type1
# kvmgt # 如需GVT-G,需要取消注释
屏蔽驱动模块
编辑文件
编辑:nano /etc/modprobe.d/pve-blacklist.conf
# NVIDIA 显卡
blacklist nvidiafb
blacklist nouveau
blacklist nvidia
options nouveau modeset=0
# AMD 核/独显
blacklist amdgpu
blacklist radeon
# Intel UHD
# 如需GVT-G,请注释下列的行
# 如需直通核显则保留下列的行
# 如不需要直通核显,请注释行
blacklist snd_hda_codec_hdmi
blacklist snd_hda_intel
blacklist snd_hda_codec
blacklist snd_hda_core
根据你的显卡类型来对应添加对应的驱动屏蔽
执行命令
如果你是NVIDIA显卡,还需要执行
echo "options kvm ignore_msrs=1 report_ignored_msrs=0" > /etc/modprobe.d/kvm.conf
直通显卡
查看显卡
执行:lspci -knn | grep -i -A 2 vga
OutPut:
17:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] [1002:67df] (rev e7)
Subsystem: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] [1002:0b31]
Kernel driver in use: vfio-pci
--
65:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU104 [GeForce RTX 2080 Rev. A] [10de:1e87] (rev a1)
Subsystem: ASUSTeK Computer Inc. TU104 [GeForce RTX 2080 Rev. A] [1043:865f]
Kernel driver in use: vfio-pci
其中65:00是代表组名。65:00.0是代表65:00组的第一个设备。
1043:865f表示厂商ID:设备ID,直接通过lspci看的话可以看到音频设备甚至是USB设备
这里我因为不需要对当前PCI-E设备组再拆分,所以直接略过
如果你需要设置显卡显示设备和音频设备单独直通,需要执行下面语句
让PCI-E设备(显卡)由vfio驱动程序接管便于直通
如果不需要单独直通,vfio驱动会在设置直通的时候自动接管PCI-E设备,可以不用配置vfio-pci
设置直通
编辑文件
ids=后面跟直通组的所有设备。中间以英文逗号隔开。自己的设备需要替换为对应ID
echo "options vfio-pci ids=10de:1381,10de:0fbc" > /etc/modprobe.d/vfio.conf
更新引导
# PVE over Debian模式安装执行
update-grub2 && update-initramfs -u -k all
# PVE引导镜像安装执行
pve-efiboot-tool refresh
重启设备
重启之后,在终端输入:dmesg | grep remapping
出现如下输出则代表可以直通:
Intel:DMAR-IR: Enabled IRQ remapping in x2apic mode
AMD:AMD-Vi: Interrupt remapping enabled
重启之后,在终端输入:lspci -knn | grep -i -A 2 vga
出现如下输出则代表直通成功:
输出:Kernel driver in use: vfio-pci
禁止系统自动安装驱动
AMD部分显卡需要重置
编辑: /var/lib/vz/snippets/gpu-hookscript.sh
#!/bin/bash
if [ $2 == "pre-start" ]
then
echo "gpu-hookscript: Resetting GPU for Virtual Machine $1"
echo 1 > /sys/bus/pci/devices/0000\:01\:00.0/remove
echo 1 > /sys/bus/pci/rescan
fi
设置:
#create snippets folder
mkdir /var/lib/vz/snippets
#create script with content above
nano /var/lib/vz/snippets/gpu-hookscript.sh
#make it executable
chmod +x /var/lib/vz/snippets/gpu-hookscript.sh
#apply script to VM
qm set 100 --hookscript local:snippets/gpu-hookscript.sh
参考资料
[1] PVE 7.3 优化和显卡直通,凤曦,2023-01-28,凤曦的小窝,https://blog.rayfalling.com/2023/01/pve-7-3-%e4%bc%98%e5%8c%96%e5%92%8c%e6%98%be%e5%8d%a1%e7%9b%b4%e9%80%9a.html
[2] PVE开启显卡虚拟化intel GVT-g,佛西博客,2020-07-06,https://foxi.buduanwang.vip/virtualization/pve/592.html/