lnsylei • 2023 年 04 月 09 日
官网指导教程,估计也看不懂。
https://pve.proxmox.com/wiki/Pci_passthrough
一.开启PVE核显直通
1.启动内核IOMMU支持
打开PVE节点的shell,输入命令:
nano /etc/default/grub
将GRUB_CMDLINE_LINUX_DEFAULT=”quiet”修改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on video=efifb:off"
简单解释下:
Intel_iommu=on #启用IOMMU功能。AMD CPU要换成amd。 iommu=pt #pt只会影响内核驱动,能让内核驱动设备性能更高。 pcie_acs_override=downstream,multifunction #IOMMU拆分分组,比如4口pcie网卡每个口为一组,不加整体为一组。 efifb:off #禁用efi启动的显示设备。不直通核显可以不加。 vesafb:off #禁用vesa启动的显示设备。不直通核显可以不加。
修改完成之后更新grub
update-grub
加载内核模块
nano /etc/modules
# PVE8.0-3 GNU nano 7.2 /etc/modules # /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. # Parameters can be specified after the module name vfio vfio_iommu_type1 vfio_pci vfio_virqfd
更新内核参数并重启
update-initramfs -k all -u reboot
输入一下命令,验证IOMMU是否开启成功
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
出现很多直通组,就代表成功了。如果没有任何东西,就是没有开启
2.添加驱动到PVE黑名单
打开PVE节点的shell,输入命令:
nano /etc/modprobe.d/blacklist.conf
添加黑名单驱动
Intel GPUs
blacklist snd_hda_intel blacklist snd_hda_codec_hdmi blacklist i915
AMD GPUs
blacklist amdgpu blacklist radeon
NVIDIA GPUs
blacklist nouveau blacklist nvidia*
3.查找核显和声卡id
打开PVE节点的shell,输入命令:
lspci

00:02.0 VGA compatible controller: Intel Corporation Xeon E3-1200 v3 Processor Integrated Graphics Controller (rev 06) 00:03.0 Audio device: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor HD Audio Controller (rev 06)
我的核显和声卡的PCIE ID 为00:02.0 00:03.0 取前两位数就是00:02 00:03
4.查询对应硬件ID
lspci -n -s 00:02 #查询显卡 00:02 以上获取的ID lspci -n -s 00:03 #查询声卡 00:03 以上获取的ID

从以上可以查询到显卡硬件ID为8086:040a 声卡硬件ID为8086:0c0c
5.填上以上ID,添加直通组。多个设备,ids后面每个设备之间用,隔开
nano /etc/modprobe.d/vfio.conf
添加上
options vfio-pci ids=8086:040a,8086:0c0c
6.添加options防止VM死机
nano /etc/modprobe.d/kvm.conf
添加上
options kvm ignore_msrs=1
注: vfio.conf 和 kvm.conf 默认没有此两文件
7、以上文件修改并保存后,更新内核并重启PVE
update-initramfs -k all -u reboot
8.重启完成后,输入命令检查模块是否加载成功
lsmod | grep vfio

看到以上输出画面说明加载成功
二.为PVE虚拟机安装编译gcc工具、Git工具,make工具
1.更新源
apt-get update
2.安装gcc编译工具
apt-get install gcc
查询gcc版本
gcc --version
3.安装Git工具
apt-get install git
4.安装make工具
apt-get install make
三. 编译官方提供的核显rom修复工具
git clone https://github.com/awilliam/rom-parser cd rom-parser make
四.导出核显ROM
cd /sys/bus/pci/devices ls

通过lspci查看设备我们可以看出0000:00:02.0为核显,输入下面命令进行到处vbios.rom
cd 0000:00:02.0 echo 1 > rom cat rom > /tmp/vbios.rom echo 0 > rom
在winscp进入PVE的tmp目录就可以看到导出的核显vbios.rom
五.查询导出核显的硬件设备ID
cd rom-parser #进入rom-parser ./rom-parser /tmp/vbios.rom #查询vbios.rom设备ID

这里会发现我们导出的核显rom 硬件设备ID为8086:0406, 这个是存在问题的,通过lspci -n -s 00:02查询到的核显设备ID应该为8086:040a,这个才是正确的,所以我们要借助rom-parser编译出来的修复文件进行修复
六.修复核显ROM的设备通道ID
cd rom-parser ./rom-fixer /tmp/vbios.rom

七.配置虚拟机核显输出
nano /etc/pve/qemu-server/104.conf
在顶部加入这行代码,代表直通核显直出核显
args: -device vfio-pci,host=00:02.0,addr=0x02,x-igd-gms=1,romfile=/root/104.bin
注意 /root/104.bin 为vbios.rom文件路径