硬件平台:
主板:华南X99-PD4
CPU:E5 2630 V4
显卡:华硕圣旗 DG1 80EU
内存:三星 RECC 32G * 2
固态:三星SN770 1T
软件平台:
宿主机:PVE 8.2
虚拟机:Ubuntu 24.04
DG1 是Intel推出一款编解码性能非常强悍的独立显卡,有大号核显之称。从官网介绍来看,DG1共有四种型号,PCI ID分别为4905、4907、4908、4909,笔者所用的80EU款为4908(Intel® Iris® Xe Graphics)。根据皮蛋熊大佬的分享(https://blog.kkk.rs/archives/32)来看,DG1的编解码能力超过RTX3050,直逼RTX4060TI!要知道,这可是一款PDD 只要200块的显卡,拿来给 Jellyfin等平台做硬解真是太香了。
然而,在前两年,DG1的驱动支持可谓是一团糟,几乎处于被抛弃的边缘。非Windows用户几乎处于无法使用的状态。不过这些随着 Xe 内核驱动的更新,都不再是问题!下面介绍一下Intel在linux下的显卡驱动情况,不关注的可以直接跳过。
linux下的显卡驱动分为内核驱动和用户T态驱动,简称KMD和UMD,像我们经常看到的 i915 就是内核驱动,media-driver和VPL属于用户态驱动。KMD直接访问硬件资源和操作系统内核,UMD一般以SO库的形式直接给应用提供API。需要注意的是,KMD和UMD不是互相独立的存在,而是需要紧密配合,共同协作给上层应用提供支持。
Intel 内核驱动也分为上游驱动(Upstream drivers)和 OOT 驱动(Out-of-tree drivers)。
上游驱动程序包含在操作系统的主线内核源代码中维护。这些驱动程序是与更广泛的开源社区合作开发的,并由操作系统维护人员集成到官方内核版本中。作为 kernel.org 内核发布周期的一部分被纳入各种发行版中。(https://github.com/torvalds/linux/tree/master/drivers/gpu/drm/i915 、 https://github.com/torvalds/linux/tree/master/drivers/gpu/drm/xe)
OOT驱动的开发、维护和分发独立于操作系统的主线内核源代码。这些驱动程序不包含在操作系统或虚拟机管理程序供应商提供的默认内核中,而是作为单独的软件包提供。Intel使用动态内核模块系统 (DKMS) 提供这些驱动程序,可以从源代码开始构建Intel GPU 内核驱动程序。( https://github.com/intel-gpu/intel-gpu-i915-backports )
从Intel官方文档 https://dgpu-docs.intel.com/devices/hardware-table.html 可以看到,DG1显卡的内核驱动已经在linux 6.8 内核版本中跟随主线发布完成,但尚未默认开启。
常见的用户态驱动是Intel提供的媒体驱动,它提供了基于 GEN 的图形硬件的硬件加速解码、编码和视频后期处理API。( https://github.com/intel/media-driver 、 https://github.com/intel/libvpl )本文中Jellyfin中用到的硬件解码能力,就源于媒体驱动提供的VAAPI。
首先要注意的是,DG1在本文提到的硬件平台上,并不能充当亮机卡的功能,DG1在未加载驱动前无法点亮,所以请提前准备亮机卡。
使用亮机卡,将启动模式改为UEFI,开启 Above 4G功能,否则无法进入系统。另外,若BIOS开启了ASPM功能,最好关闭,否则容易出现宕机问题。
虚拟机有自己独立的内核,理论上不升级应当不影响使用。但是笔者暂未尝试,有兴趣的小伙伴可以试试直接进入1.2 步是否有问题。
2024年4月,Proxmox 发布了基于Linux kernel 6.8 的 PVE 8.2 版本,本文未验证低于 8.2 版本的PVE是否会有问题,因此建议升级至PVE 8.2,重新安装的小伙伴可以跳过升级步骤,直接安装 8.2版本。
本文介绍PVE 8.0 升级至 8.2 的过程,若您的PVE 版本为 7.X及以下,请参照 https://pve.proxmox.com/wiki/Upgrade_from_7_to_8 说明文档升级至 8.X。
进入shell 控制台,输入以下命令更新源信息。
执行升级
此步骤比较耗时,如果未更换过国内源,可能需要科学上网,建议直接使用 ustc 镜像,可以使用pve_tools 一键换源。执行完成后重启机器,输入以下命令检查升级结果。
输出以下信息,说明更新成功。
请先在主板BIOS中打开虚拟化功能,一般为VT-X或VT-D。
① 编辑vim /etc/defalut/grub, 修改GRUB_CMDLINE_LINUX_DEFAULT 为如下配置。
其他教程中你可能看到过 video=efifb:off 和 video=simplefb:off 这两项配置,这两项均经废弃不再使用,新版本需要配置initcall_blacklist=sysfb_init 替代 。
intel_iommu=on 在AMD平台可以省略,AMD默认开启IOMMU,amd_iommu=on 无意义。
pcie_aspm=off DG1不支持ASPM,关闭以避免DG1出现一些不可知的问题。pcie_acs_override=downstream 开启后可能导致虚拟机能够访问宿主机内存,很多教程都开了这个,不知道为什么开启,有时间再深究下。
② 执行命令更新启动参数,完成后重启机器。
③ 重启完成后,输入以下命令检查IOMMU输出
理论上,此时应当有类似以下输出
④ 添加VFIO模块
其他教程中添加的 vfio_virqfd 在PVE 8.x 已废弃,无需添加。
⑤ 更新initramfs并重启机器
⑥ 允许不安全中断,配置虚拟机一些参数
⑦ 增加驱动黑名单
在Ubuntu官网下载 24.04 LTS镜像( https://cn.ubuntu.com/download/server/step1 )。注意,目前只有24.04 版本默认使用了 Linux 6.8内核,其余版本需要自行升级内核。
此处不限于Ubuntu 24.04,只要使用了 Linux 6.8 之后的内核,应当都能支持。
一路使用默认值,用户名密码页面自行填写,直到下面页面,按空格启用OpenSSH Server,方便后面SSH连接。
后面继续一路回车,使用默认值,等待系统安装完成。
到此处,可以停止虚拟机,并移除ISO镜像。
移除完成后,启动虚拟机,进入系统,建议使用SSH连接,比控制台要简洁清晰。
启动参数GRUB_CMDLINE_LINUX_DEFAULT 增加 xe.force_probe=4908(根据上述提到的lspci查询的实际情况填写)
更新
添加intel 的官方key
添加intel 的官方源
执行更新
执行命令安装安装以下包
安装完成后,关闭虚拟机。
启动后,输入lspci -nnk 找到DG1输出的信息,说明xe驱动已经启用。
添加当前用户到 render组
重启使配置生效
输入id 查看用户是否正确加入 render组中。
输入vainfo ,查询是否能够执行正常,如下
使用一键安装脚本
此处若执行比较慢,可能需要科学上网。
注:apt 可以用如下方式添加代理,或通过软路由科学上网。
创建目录
安装cifs-utils
修改fstab文件,开启自动挂载
添加以下内容
重新加载
执行挂载
进入目录,此时应当已经有SMB对应的文件。
安装acl包
增加jellyfin文件夹权限,否则添加媒体库时会报错找不到路径
在浏览器中输入IP:8096,进入jellfyin,将上面使用的目录添加进媒体库,等待扫描完成。
勾选VAAPI 硬件解码,注意,不要勾选AV1编码,DG1当前版本的媒体驱动仅支持AV1解码,并不支持AV1编码,勾选后会报错。
说明:低电压模式可以正常开启,不过转码效率并无太大变化,对于N5105等CPU则必须开启,笔者用的E5平台开不开没啥区别。
附:编解码能力表
此处请不要使用intel QSV,jellyfin源码在使用QSV配置时,只会使用i915的kernel_drive,导致生成的ffmpeg参数后,调用ffmpeg会报错 no va display found for any default device
截止到此,所有操作均已完成啦,可以打开jellfyin下的视频,看下是否解码成功!
使用皮蛋熊大佬提供的测试视频( https://blog.kkk.rs/archives/32 ),测试结果如下: