官网指导教程,估计也看不懂。
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

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

2023-04-09T03:21:59.png

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

2023-04-09T03:26:50.png

从以上可以查询到显卡硬件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

2023-04-09T03:43:20.png
看到以上输出画面说明加载成功

二.为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

2023-04-09T05:37:35.png
通过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

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

六.修复核显ROM的设备通道ID

cd rom-parser 
./rom-fixer /tmp/vbios.rom

2023-04-09T05:51:52.png

七.配置虚拟机核显输出

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文件路径

最后修改:2023 年 08 月 06 日
如果觉得我的文章对你有用,请随意赞赏