【PVE】All in One 的快乐之PVE系统配置及核显SRIOV直通

教程参考B站UP主爱折腾的老高,感谢大佬持续产出优秀折腾经验,吾辈楷模。
视频link:
畅网N100十二代低功
耗多网口小主机测评 开箱/拆解/烤机/温度/功耗/12代PVE安装简单避坑/SRIOV核显直通/硬解

原笔记出处:
Intel 11(Tigerlake)/12/13/14代SRIOV vGPU虚拟核显直通应用
遇到编译问题时参考的解决方案:
https://github.com/strongtz/i915-sriov-dkms/issues/151
感谢makazeu 大佬提供的解决方案!
感谢畅网小云大佬提供的技术支持!!超棒棒哦!
感谢JAZZ大佬提供的脚本支持以及核显调用查看方案!
转载本文请注明出处,互联网开放精神,你我共享!

引言

  • 有朋友问不想核显虚拟化,只想把核显直通给群晖SA6400转码和硬解使用,该怎么办,由于有现成一键脚本,故为了节约大家时间,在此推荐JAZZ大佬编写的一键脚本,作者已经验证过支持pve最新版,故不再另开新文。pve_source

一、系统配置

1.1 配置前的准备

系统配置之前,检查下BIOS的这些功能是否正确开启,畅网N100/N305 默认开启:

  • Intel VMX虚拟化技术 (需要开启)
  • VT-d (需要开启)
  • SR-IOV (需要开启)
  • IOMMU (需要开启)
  • VMD setup menu (需要关闭)

1.2 安装PVE(略)

1.3 整合PVE存储空间(可选)

重要提醒:以下步骤误操作容易导致PVE崩溃,请在刚装完PVE系统后进行操作,不建议已经组好All in One的用户进行操作,后果自行承担!!

1.3.1 loacl和local-lvm两个分区合二为一

  • 查询当前local的大小
df -h
  • /dev/mapper/pve-root这个是系统自动给local的空间
  • 进入到PVE节点的Shell输入以下命令(删除pve/data路径下的local-lvm逻辑卷)
lvremove pve/data -y
  • 输入完之后会提示是否确定删除,此时按y回车
  • 继续输入以下命令(将所有系统盘可用空间全部交由local这一个逻辑卷分配)
lvextend -l +100%FREE -r pve/root
  • 继续输入以下命令(使其适应已经调整大小的逻辑卷)
resize2fs /dev/mapper/pve-root
  • 查询是否扩容成功
df -h
  • 成功扩容接下来删除local-lvm
    点数据中心 ——> 存储 ——> local-lvm ——> 移除 ——> local ——> 编辑 ——> 内容(所有选项全部选上) ——> OK

1.4 PVE更换软件源

因为众所周知的原因,PVE无法连上国外的官方源,因此替换为国内的镜像源,以便更新相关软件。

1.4.1 换国内源

  • 备份PVE自带的软件包源文件
cp /etc/apt/sources.list /etc/apt/sources.list_bak

北方小伙伴选择清华大学源,南方小伙伴选择中科大源,二选一

1.4.2 换软件包源

# 编辑源配置文件
nano /etc/apt/sources.list
  • 进入到nano编辑器后,将每一行前面加上’#‘注释掉,例如下面这这样
#deb http://ftp.debian.org/debian bookworm main contrib
#deb http://ftp.debian.org/debian bookworm-updates main contrib
# security updates
#deb http://security.debian.org bookworm-security main contrib
# 添加中科大源(在被注释掉的文本下面添加以下内容)
deb https://mirrors.ustc.edu.cn/debian/ bookworm main contrib non-free
deb https://mirrors.ustc.edu.cn/debian/ bookworm-updates main contrib non-free
deb https://mirrors.ustc.edu.cn/debian/ bookworm-backports main contrib non-free
deb https://mirrors.ustc.edu.cn/debian-security/ bookworm-security main contrib non-free

键盘组合键ctrl+x再输入y 回车保存退出

# 添加清华大学源(中科大源和清华大学源二选一)
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware

键盘组合键ctrl+x再输入y 回车保存退出

1.4.3 编辑企业源

nano /etc/apt/sources.list.d/pve-enterprise.list
  • 将其中原有的源前面 # 注释掉,变为:
#deb https://enterprise.proxmox.com/debian/pve bookworm pve-enterprise
  • 北方添加清华源:
deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian/pve bookworm pve-no-subscription
  • 南方添加中科大源:
deb https://mirrors.ustc.edu.cn/proxmox/debian/pve bookworm pve-no-subscription
  • 键盘组合键ctrl+x再输入y 回车保存退出

1.4.4 添加pve无订阅源

nano /etc/apt/sources.list.d/pve-no-subscription.list
  • 粘贴以下pve中科大的无订阅源
deb https://mirrors.ustc.edu.cn/proxmox/debian/ceph-quincy bookworm no-subscription
  • 键盘组合键ctrl+x再输入y 回车保存退出

1.4.5 更新软件包

apt update

修复源401错误(如无401报错可忽略此条):

nano /etc/apt/sources.list.d/ceph.list
  • 将其中原有的proxmox句首加 # 注释掉
变为:#deb http://download.proxmox.com/debian/ceph-quincy bookworm no-subscription
  • 添加中科大ceph源:
deb https://mirrors.ustc.edu.cn/proxmox/debian/ceph-quincy bookworm no-subscription
  • 键盘组合键ctrl+x再输入y 回车保存退出
  • 再次更新
apt update

1.4.6更换LXC容器源

中科大源和清华大学源二选一

  • 备份PVE自带的LXC容器源文件
cp /usr/share/perl5/PVE/APLInfo.pm /usr/share/perl5/PVE/APLInfo.pm_back
  • 更换为中科大源:
sed -i 's|http://download.proxmox.com|https://mirrors.ustc.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm
  • 更换为清华大学源:
sed -i 's|http://download.proxmox.com|https://mirrors.tuna.tsinghua.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm
  • 重启PVE(使所有更换的源文件生效)
reboot

二、方案一:SRIOV核显虚拟化(推荐,方案来源:畅网小云大佬,兼容PVE8.2 和 6.8内核)

注意此处若您进行过内核版本升级,请执行此处命令重新安装内核和内核头并切换,以避免虚拟化失败,若未升级过请忽略

apt install pve-kernel-$(uname -r)
proxmox-boot-tool kernel pin $(uname -r)
apt install pve-headers-$(uname -r)

  • 下载需要的deb包,无法下载可点击此处下载后上传i915
wget https://github.com/MoetaYuko/intel-gpu-i915-backports/releases/download/I915MT65-24.1.19-3/intel-i915-dkms_1.24.1.19.240119.1.nodrm+i3-1_all.deb
  • 下载依赖包
apt install flex bison
  • 安装header
apt update & apt install build-* pve-headers-$(uname -r) git dkms sysfsutils flex bison -y
  • 下载i915所需二进制文件
mkdir -p /lib/firmware/updates/i915/
wget -O /lib/firmware/updates/i915/tgl_guc_70.9.1.bin https://mirror.ghproxy.com/https://raw.githubusercontent.com/intel-gpu/intel-gpu-firmware/main/firmware/tgl_guc_70.9.1.bin
  • 安装deb包
sudo dpkg -i intel-i915-dkms_1.24.1.19.240119.1.nodrm+i3-1_all.deb
  • 出现以下信息即说明安装成功
    3dc2e40a9df62e23cb3962257ca6ee2.png

  • 编辑 grub 配置文件

nano /etc/default/grub
  • quiet 后添加 intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7
  • 键盘组合键ctrl+x再输入y 回车保存退出
  • 更新grub和initramfs
update-grub
update-initramfs -u
  • 安装sysfsutils(对新手友好方便对VF核显数量设置)

不建议使用开机自启脚本rc.local,增加不必要的风险

apt install -y sysfsutils

下面命令中sriov_numvfs = 5的5代表SRIOV核显数量,可自定义设定,最多设置7个设置为1个性能最强,如果设置为7个,那么每一个的性能只有14%(所以这里大家根据自身核显性能自行考量)

echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 3" > /etc/sysfs.conf

----------------
#有修改虚拟核显数量的需求
nano /etc/sysfs.conf
#将原来写入的参数注释掉
#devices/pci0000:00/0000:00:02.0/sriov_numvfs = 3
#改成你需要的数量,例如下述为5个
devices/pci0000:00/0000:00:02.0/sriov_numvfs = 5
  • 重启pve,使配置生效
reboot
  • 出现以下信息说明安装成功,可以进行后续直通操作
dkms status

image.png

dmesg |grep i915

image.png

lspci | grep VGA

image.png

  • 在创建好虚拟机后,修改在该虚拟机的config文件
nano /etc/pve/qemu-server/[虚拟机编号].conf

#例如Windows虚拟机的序号是101
则命令为:
nano /etc/pve/qemu-server/101.conf
  • 第一行加上,固定GPU的PCI序号:
args: -set device.hostpci0.addr=02.0 -set device.hostpci0.x-igd-gms=0x2

image.png

  • 并且将虚拟机显示器设为或者VirtIO-GPU
    image.png
    image.png

  • 安装Win虚拟机时需要勾选主GPU选项,才能正确安装核显驱动,其他虚拟机按需勾选。
    image.png

三、方案二:SRIOV核显虚拟化(方案一无效的情况下可尝试方案二)

理论来说,目前仅有Intel 11(Tigerlake)/12/13/14代带核显CPU支持SRIOV核显虚拟化,非此类CPU不能SRIOV虚拟化。

  • 核显SRIOV优缺点对比

3.1 升级内核头文件headers

  • 查看内核版本
uname -a

i915-sriov目前支持6.1~6.5内核,根据uname-a反馈信息调整 header 的版本信息

  • 下载安装 headers,如果遇到报错,或以前执行过dkms安装都可执行以下命令
apt install pve-kernel-6.5.13-5-pve
proxmox-boot-tool kernel pin 6.5.13-5-pve
apt install pve-headers-6.5.13-5-pve
  • 查看当前内核版本是否锁定为6.5.13-5
proxmox-boot-tool kernel list
  • 重启PVE使其生效
reboot

3.2 编译i915-sriov驱动

3.2.1 安装 git工具 及 dkms

KERNEL=$(uname -r); KERNEL=${KERNEL%-pve}
apt install -y git build-* dkms
  • clone代码库(下载源码时请保证能连接上github,修改dns可以连上,具体百度)
git clone https://github.com/strongtz/i915-sriov-dkms.git
  • 帮大家找到一个国内镜像代码库,已经做好了替换,图省事的同学拉取这个库直接跳到后文镜像库提示的地方。
git clone https://gitee.com/ifwwww/i915-sriov-dkms

3.2.2 添加安装sriov模块

经过测试发现这里有个坑!!!6.5.13-5这个内核版本使用大佬的库直接编译的话会出以下报错:

/var/lib/dkms/i915-sriov-dkms/6.5/build/drivers/gpu/drm/i915/display/intel_dp_mst.c:86:35: error: too many arguments to function ‘drm_dp_calc_pbn_mode’
86 | crtc_state->pbn = drm_dp_calc_pbn_mode(adjusted_mode->crtc_clock,
| ^~~~~~~~~~~~~~~~~~~~
In file included from /var/lib/dkms/i915-sriov-dkms/6.5/build/drivers/gpu/drm/i915/display/intel_display_types.h:36,
from /var/lib/dkms/i915-sriov-dkms/6.5/build/drivers/gpu/drm/i915/display/intel_dp_mst.c:40:
./include/drm/display/drm_dp_mst_helper.h:835:5: note: declared here
835 | int drm_dp_calc_pbn_mode(int clock, int bpp);
| ^~~~~~~~~~~~~~~~~~~~
/var/lib/dkms/i915-sriov-dkms/6.5/build/drivers/gpu/drm/i915/display/intel_dp_mst.c: In function ‘intel_dp_mst_mode_valid_ctx’:
/var/lib/dkms/i915-sriov-dkms/6.5/build/drivers/gpu/drm/i915/display/intel_dp_mst.c:906:17: error: too many arguments to function ‘drm_dp_calc_pbn_mode’
906 | drm_dp_calc_pbn_mode(moll_pbn) {
| ^~~~~~~~~~~~~~~~~~~~
./include/drm/display/drm_dp_mst_helper.h:835:5: note: declared here
835 | int drm_dp_calc_pbn_mode(int clock, int bpp);

| ^~~~~~~~~~~~~~~~~~~~
make[2]: *** [scripts/Makefile.build:251: /var/lib/dkms/i915-sriov-dkms/6.5/build/drivers/gpu/drm/i915/display/intel_dp_mst.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [/usr/src/linux-headers-6.5.13-5-pve/Makefile:2039: /var/lib/dkms/i915-sriov-dkms/6.5/build] Err
or 2
make: *** [Makefile:234: __sub-make] Error 2
make: Leaving directory '/usr/src/linux-headers-6.5.13-5-pve'
  • 下文已经将步骤更改为最新,理论上来说按照如下步骤操作即可成功编译。
  • 如果下载失败可以点击此处下载intel_dp_mst.c
cd i915-sriov-dkms/drivers/gpu/drm/i915/display/
mv intel_dp_mst.c intel_dp_mst.c.bak
wget http://download.cloudstaymoon.com/cloudstaymoon/blog/intel_dp_mst.c

  • 使用镜像库的同学直接眺到这里继续执行下列代码,github库执行完上面的代码后也要继续执行下列代码!
cd ~/i915-sriov-dkms
cp -a ~/i915-sriov-dkms/dkms.conf{,.bak}
sed -i 's/"@_PKGBASE@"/"i915-sriov-dkms"/g' ~/i915-sriov-dkms/dkms.conf
sed -i 's/"@PKGVER@"/"'"$KERNEL"'"/g' ~/i915-sriov-dkms/dkms.conf
sed -i 's/ -j$(nproc)//g' ~/i915-sriov-dkms/dkms.conf
cat ~/i915-sriov-dkms/dkms.conf
  • 控制台输出如下结果
    image.png
apt install --reinstall dkms -y
dkms add .
cd /usr/src/i915-sriov-dkms-$KERNEL
dkms status
  • 如果输出added则表示前期准备完成,
    image.png
  • 输入以下命令进行编译
dkms install -m i915-sriov-dkms -v $KERNEL -k $(uname -r) --force -j 1
dkms status
  • 输出
    image.png

如果失败了可以先运行以下命令,然后回到二、SRIOV核显虚拟化重新开始编译一次

rm -rf /var/lib/dkms/i915-sriov-dkms*
rm -rf /usr/src/i915-sriov-dkms*
rm -rf ~/i915-sriov-dkms
  • 检查安装是否成功

输入以下命令检查是否成功

modinfo i915|grep vf 

反馈如下表示成功
parm: max_vfs:Limit number of virtual functions to allocate. (0 = no VFs [default]; N = allow up to N VFs) (uint)

3.2.3 设置直通和i915控制器

  • 编辑 grub 配置文件
nano /etc/default/grub
  • quiet 后添加 intel_iommu=on iommu=pt i915.enable_guc=3 i915.max_vfs=7

  • 键盘组合键ctrl+x再输入y 回车保存退出

  • 更新grub和initramfs

update-grub
update-initramfs -u
  • 安装sysfsutils(对新手友好方便对VF核显数量设置)

不建议使用开机自启脚本rc.local,增加不必要的风险

apt install -y sysfsutils

3.2.4 设置SRIOV核显数量

下面命令中sriov_numvfs = 5的5代表SRIOV核显数量,可自定义设定,最多设置7个设置为1个性能最强,如果设置为7个,那么每一个的性能只有14%(所以这里大家根据自身核显性能自行考量)

  echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 3" > /etc/sysfs.conf 
  • 重启使其生效
reboot
  • 重启完之后检查是否成功
  • 通过PVE节点的Shell输入以下命令查看SRIOV核显直通是否成功
lspci | grep VGA

如果成功则会输出以下数据

00:02.0 VGA compatible controller: Intel Corporation Alder Lake-S GT1 (rev 0c)
00:02.1 VGA compatible controller: Intel Corporation Alder Lake-S GT1 (rev 0c)
00:02.2 VGA compatible controller: Intel Corporation Alder Lake-S GT1 (rev 0c)
00:02.3 VGA compatible controller: Intel Corporation Alder Lake-S GT1 (rev 0c)
00:02.4 VGA compatible controller: Intel Corporation Alder Lake-S GT1 (rev 0c)
00:02.5 VGA compatible controller: Intel Corporation Alder Lake-S GT1 (rev 0c)

00:02.x VGA 这就是刚刚虚拟出来的核显了
注意:物理核显02.0不能直通出去(可以映射给LXC),否则物理核显本体被独占,所有虚拟核显消失。
本教程结束,接下来就可以按照自己的需求安装虚拟机了。


四、效果预览

4.1 Windows 核显驱动

image.png

4.2 SA6400 EMBY转码

image.png

4.3 SA6400 Jellyfin转码

image.png

查看核显调用情况的方法

docker exec -it jellyfin bash
apt update
apt install intel-gpu-tools -y
intel_gpu_top

53104537ae226e4cad83dfca03dea59.png

4.4 转码时CPU使用率

image.png

image.png