一、前言
Intel DG1显卡的编解码性能非常的强悍,将其用于NAS中的编解码任务是一个非常好的选择,本文旨在介绍Intel DG1独立显卡在群晖SA6400系统下的编解码安装。但由于DG1的硬件兼容性非常差,如果你没有DG1这张显卡,请先尝试下咨询网友自己的硬件平台是否兼容再决定是否购买尝试,切不可在不知兼容性的情况下直接购买。
注意:未经驱动源代码版权方Intel公司许可,不得将上述内容用于商业用途或侵犯版权行为。使用本驱动所产生的一切后果由用户自行承担,与提供者无关,本内容仅供学习研究使用。
介绍视频:
如果是ESXi作为底层请移步到ESXi处理办法
本驱动同时支持DG1/DG2(A380/A750/A770等),本文中的内核只处理了DG1的直通部分,DG2的直通本文中提供的内核无关。
更新
20240518:处理6.8.4内核
20240401:处理SA6400自定义内核
20240301:处理SA6400 7.1内核
初始版本:处理SA6400 7.2内核
1.1 名词解释
裸机:物理机器直接安装作业系统(SA6400)的统称。
虚拟机直通:物理机安装虚拟机管理器(ESXi、PVE)等,其中作业系统(SA6400)以虚拟机的形式部署,并将某个特定设备(DG1)分配给该虚拟机独享使用。
本教程兼顾裸机安装SA6400或者PVE直通安装SA6400并使用DG1;如果你是裸机的方式,请直接跳转阅读二、配置BIOS 和 六、RR配置
;如果你是虚拟机直通的方式,请从头开始阅读。
1.2 虚拟机直通环境介绍
DG1直通介绍:
这里我们介绍下我们的老员工(测试平台):
- CPU : Intel I5-10400
- 内存: DDR4 2666 8G x 4
- 显卡: 华硕圣旗DG1被动散热版
- 硬盘: 镁光5100 PRO 960G版本
我们需要准备一个容量大于8G的优盘,用于写入PVE
安装系统。
当然最开始的还是需要先在不安装DG1
的情况下配置BIOS。
二、配置BIOS
这里需要你具备一定的基础,需要了解如果进入BIOS,准确找到相关选项,如何修改BIOS并保存等。 需要修改的选项如下:
- 打开
above4G
选项。 - 打开
UEFI
引导,关闭CSM兼容模式。 - 打开
resizableBAR
选项(如果有),没有也不强求,该选项打开会增强一定兼容性,如果你未能成功点亮DG1,可尝试打开该选项再试试。 - 关闭PCIe子选项中的ASPM,由于DG1的PCIe IP兼容性非常差,且不太符合规范,所以很多高阶PCIe的特性请务必关闭这些经常变换PCIe工作状态的特性。
此时请尝试插入DG1,尝试是否可以点亮系统,如果不可以请多尝试诸如更新BIOS,检查bios设备等选项。
有些企业级平台对于PCIe的规范性要求比较严格,DG1极有可能无法通过其PCIe的测试,比如R730/R730XD明确无法通过,所以也无法点亮。
三、PVE系统安装
PVE系统安装时,请不要插入DG1,首先我们需要准备下载两套软件:
这里我们教程演示基于PVE7.4
,系统足够稳定是NAS
长久稳定运行的前提,这里我们选择非常稳定的PVE7.4
,不选PVE8
也是基于稳定的考量。
下载好上面两个软件后,我们在一台已经开机的windows电脑中,插入预先准备的优盘,打开rufus
,选择你要写入的U盘
和PVE镜像
,一切默认即可,可参考下面图片依次选择,
写入镜像过程中:
镜像写入完毕:
此时启动U盘我们就准备好了,这时我们将写入镜像后的优盘插入到系统,启动U盘中的安装系统。
启动后可以参考佛西大佬的教程:https://foxi.buduanwang.vip/virtualization/229.html/ 搜索开始安装pve
可直接定位到目标位置,参考图文一步步进行。
安装完毕过后我们进入到系统中,此时我们需要对电脑进行一些配置:
四、配置内核
4.1 安装指定内核
其中第一个就是更换为皮蛋熊修改过的内核,为了防止之前系统或存在同样的内核,所以先将其卸载:
dpkg --purge linux-tools-5.15 linux-tools-5.15-dbgsym pve-headers-5.15.131-1-pve pve-kernel-5.15.131-1-pve
注意:这里皮蛋熊处理5.15和6.8.4两种内核,请根据自己情况选择。
5.15地址:5.15
6.8.4地址:6.8.4
卸载后我们进行安装,这里皮蛋熊使用的目录是/root/kernel
:/root/kernel
。
# 准备内核
mkdir /root/kernel
cd /root/kernel
curl https://blog.kkk.rs/upload/5.15.131-pve-pdbear.tar.gz -o 5.15.131-pdbear.tar.gz
# 解压内核
tar -xf 5.15.131-pdbear.tar.gz
# 安装内核
cd ./5.15.131-pve
dpkg -i *.deb
# 固定启动内核版本
root@pve:~# pve-efiboot-tool kernel list
Manually selected kernels:
None.
Automatically selected kernels:
5.15.102-1-pve
5.15.131-1-pve
# 这里 5.15.131-1-pve 内核是皮蛋熊修改过的
# 这里固定内核内核为 5.15.131-1-pve
pve-efiboot-tool kernel pin 5.15.131-1-pve
# 更新下引导和ramfs
update-initramfs -u -k all
update-grub
reboot
内核安装完毕后,重启检查是否内核启动完成:
root@pve:~# uname -a
Linux pve 5.15.131-1-pve #1 SMP PVE 5.15.131-2 (2023-11-14T11:32Z) x86_64 GNU/Linux
可以看到上面内核已经修改成功了,接下来我们将修改内核参数。
4.2 修改内核参数
下面开始修改内核参数:
# vim /etc/default/grub
# 修改 GRUB_CMDLINE_LINUX_DEFAULT
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on spectre_v2=off spectre_v1=off pcie_acs_override=downstream pcie_aspm=off"
上面的选项解释如下:
intel_iommu=on
开启intel的iommu,这里如果是amd的处理需要修改为:amd_iommu=on
spectre_v2=off spectre_v1=off
两个CPU BUG的修补,是侧信道攻击,安全类BUG,但修复会导致CPU性能下降,这里我选择不修补,可根据自己情况进行选择。pcie_acs_override=downstream
IOMMU分组补丁,用于将设备分组分的更开一点,如果使用这段代码仍然无法分开iommu组,可以尝试使用这段:pcie_acs_override=downstream,multifunction
pcie_aspm=off
关闭PCIe硬件链路节能机制,DG1的PCIe IP不太兼容这个,建议关闭,关闭后可以运行的更为稳定。
上面选项修改完毕后,使用update-grub
更新引导,并重新启动PVE系统;
重新启动后将下面脚本保存为iommu.sh
,给与可执行权限chmod +x iommu.sh
,并执行,即可查看iommu分组:
#!/bin/bash
for g in `find /sys/kernel/iommu_groups/* -maxdepth 0 -type d | sort -V`; do \
echo "IOMMU Group ${g##*/}:"; \
for d in $g/devices/*; do \
echo -e "\t$(lspci -nns ${d##*/})"; \
done; \
done;
这里我的查看结果是:
root@pve:~# ./iommu.sh
.......
IOMMU Group 17:
05:00.0 VGA compatible controller [0300]: Intel Corporation DG1 [Iris Xe Graphics] [8086:4908] (rev 01)
IOMMU Group 18:
06:00.0 Audio device [0403]: Intel Corporation Device [8086:490d]
IOMMU Group 19:
07:00.0 Memory controller [0580]: Intel Corporation Device [8086:490e]
.......
可以发现iommu
分组都划分的很开,我们需要的DG1
划分到17
组里面。
确保一切正常后,可进行下面的创建虚拟机的环节。
五、创建虚拟机
开始正式安装群晖SA6400,这里我们将创建一个SA6400的虚拟机:
点击创建虚拟机Create VM
:
填入NameSA6400
,其中VM ID
是自动生成的:
至少给200G的空间:
选择Host
和核心数:
设置分配内存大小:
网络选择半虚拟化即可:
点击完成:
建立完成后:
删除CD/DVD Driver
:
添加直通的DG1设备,仅添加显卡就可以了,不用管声卡和周边设备:
下载RR引导并解压,并把引导文件rr_4GB.img
上传到PVE中,这里是上传到/root/arpl
目录;
PS:目前RR引导是最完善的黑群引导,但因为一些原因已经删库转为私有,关于引导文件的获取,可QQ频道搜索矿神NAS研究社
或者群晖引导编译交流
找寻最新的免费下载地址,这里我就不上传了。
这里我们将RR引导模拟为U盘使用,这里采用jim大佬博客中介绍的方法,详细可点击查看参考文档:
修改上面我们创建的虚拟机的配置文件,这里我的虚拟机ID是106,所以地址是/etc/pve/qemu-server/106.conf
,请根据自己的id进行修改对应路径,并在文件中添加下面的配置选项
args: -device 'nec-usb-xhci,id=usb-bus0,multifunction=on' -drive 'file=/root/arpl/rr_4GB.img,media=disk,format=raw,if=none,id=drive-disk-bootloader' -device 'usb-storage,bus=usb-bus0.0,port=1,drive=drive-disk-bootloader,id=usb-disk-bootloader,bootindex=999,removable=on'
上面配置中的file=/root/arpl/rr_4GB.img
,就是RR引导的具体路径。
这里把引导文件rr_4GB.img
上传到/root/arpl
目录中,即可正常启动RR并引导黑群晖了。
注意:第一个版本需要先取消RR内部自带的i915驱动(下面会讲述如何取消),如果NAS独显转码新王晋级, Intel DG1驱动第二阶段,PVE内核+群晖SA6400驱动分享!视频点赞或者投币超过3000,将会开始着手将代码提到RR中,后期代码提到RR后下面的操作不需要做,可直接驱动。
最后的RR黑裙虚拟机,配置如下:
其中直通了DG1,这里该设备的BDF是0000:05:00.0
,这里选择Q35
还是i440fx
都可以,没有任何问题。
六、RR配置
注意1:以下教程裸机或者虚拟群晖通用:
注意2:老版本的RR可以按照下面的教程进行取消,新版本的RR有一个一键关闭i915的选项,如果是新版就一键取消就可以了。
选择配置引导configure loader
:
输入menu.sh
并回车:
选择模块Modules menu
:
选择第一个Show/Select modules
:
取消勾选evbug、i915-compat、i915、dmabuf、drm_kms_helper、drm、drm_mipi_dsi、drm_panel_orientation_quirks、mei-gsc、mei_hdcp、mei_iaf、mei、mei-me、mei_pxp、mei_txe
这么多选项:
注:后期RR引导适配了dg1后,这些选项务必进行重新勾选,就不再需要单独安装驱动了。
一路OK
后返回重新编译引导:
完成后启动设备:
开始群晖系统的初始化设置。。。。
开启SSH:
使用ssh工具如mobaXterm、xshell、finalshell
等连接群晖:
驱动安装步骤:
# 1. 下载i915_debug.tar.gz,这里我放到docker目录
cd /volume1/docker/
# 注意,下面这行适用群晖DSM7.2的用户,如果你是7.1,建议使用`i915_debug_7.1_pdbear.tar.gz`这个文件。
curl https://blog.kkk.rs/upload/i915_debug_7.2_pdbear.tar.gz -o i915_debug.tar.gz
# 注意,如果你是死守群晖DSM 7.1的用户,这里皮蛋熊也编译了一份7.1可使用的驱动,将上面命令改为下面这行执行即可
curl https://blog.kkk.rs/upload/i915_debug_7.1_pdbear.tar.gz -o i915_debug.tar.gz
# 注意,如果你是喜欢RR自定义内核的用户,这里皮蛋熊也编译了一份custom内核可用的驱动,将上面命令改为下面这行执行即可
curl https://blog.kkk.rs/upload/i915_debug_custom_pdbear.tar.gz -o i915_debug.tar.gz
# 2. 以普通用户解压
tar -xf i915_debug.tar.gz
# 3. 切换root用户
sudo -i
# 4. 切换到驱动目录
cd /volume1/docker/i915_debug
# 5. 安装驱动
./install.sh
上面所有执行完毕后,应该在ssh窗口中有如下信息输出表示一切正常:
HuC firmware: i915/dg1_huc_7.9.3.bin
status: RUNNING
version: found 7.9.3
uCode: 589504 bytes
RSA: 256 bytes
HuC status: 0x00090001
此时可参考本博客中的其他教程,创建支持intel显卡的docker来使用显卡的解码能力。
注:因为docker或者套件启动时间比驱动加载更前,其加载时系统中并不存在驱动;所以驱动加载后,请按需重启一下相关套件或者docker容器(该问题在后续将代码合并到RR后会修复)。
七、附件
- PVE 5.15内核:https://blog.kkk.rs/upload/5.15.131-pve-pdbear.tar.gz
- PVE8 6.8.4内核:https://blog.kkk.rs/upload/pve_8.2_kernel_6.8.4_dg1_dg2.zip
- dg1 SA6400 7.2驱动:https://blog.kkk.rs/upload/i915_debug_7.2_pdbear.tar.gz
- dg1 SA6400 7.1驱动:https://blog.kkk.rs/upload/i915_debug_7.1_pdbear.tar.gz
- dg1 SA6400 Custom驱动: https://blog.kkk.rs/upload/i915_debug_custom_pdbear.tar.gz
- 解码能力测试视频:https://cloud.189.cn/t/vUJjQrmuMZzi (访问码:2rjc)
八、错误排查
因为DG1的PCIe IP质量非常糟糕,导致其兼容性堪忧,下面是一些常见的排错手段:
8.1 如果我无法点亮DG1应该怎么办?
- 检查BIOS选项是否设置了上述步骤中的选项
- 根据网友反馈,可以尝试升级或者降级BIOS
- 某些服务器平台R730XD/R730无法过PCIe检测,暂无可解选项
8.2 我可以成功点亮,但是驱动工作看起来不太正常,没有找到DRM
设备的card/renderD
节点应该怎么办?
- 检查
dmesg
信息中是否存在PCI错误或AER错误
,如果你确定已经关闭ASPM
选项,仍然出现这个错误,表示你的主板和DG1不太兼容,目前没有很好的办法。 - 检查
dmesg | grep i915
,查看是否存在什么错误,可将错误发到群里,以便进一步排查。
8.3 我有一个视频是H.264 8K的,发现DG1无法编解码?
- 是的,DG1对于H.264只支持4K分辨率,对于H265等格式则支持8K。
8.4 为什么同样的配置看别人都成功了,我为什么不行?
- 检查下各个组件的硬件是否损坏
- 检查下是否和别人使用了同样的PCIe插槽,有时候不同的插槽的IP不同,兼容性也不一样。
8.5 为什么我的解码正常,但是速度很慢,通过intel_gpu_top
发现没有跑满?
- 检查下文件是不是网络存储的,存在读取瓶颈。
- 检查下DG1的PCIe插槽,是不是带宽不够?PCIE 什么X1大概率是不够。
8.6 我直通的时候PVE会卡住,界面输出snd_hda_intel
等信息
- 修改
/etc/modprobe.d/blacklist.conf
,添加blacklist snd_hda_intel
,并输入update-initramfs -u -k all
更新ramfs后重启。 - 直通给群晖使用的DG1请不要插入HDMI/DP等输出接口。
- 同时建议所有直通显卡类的设备,host一定要屏蔽对应的驱动,并不要在host中使用该接口进行显示输出。
8.7 我第一次启动的时候安装驱动正常,重启后驱动掉了需要重新安装才可以使用,这是为什么?
目前驱动暂未提交到RR引导中,所以请先设置开机计划任务,在用户定义脚本框中填入cd /volume1/docker/i915_debug && ./install.sh
即可,开机计划任务设置可参考群晖NAS:利用任务计划执行开机重启frp脚本
8.8 我安装了N大的jellyfin无法硬解是怎么回事?
如果上面所描述的问题你都没有遇到,且安装驱动时候输出和我一样,ssh中输入dmesg
也没有发现任何i915或者aer错误,那应该就是你创建docker时候没有通过相关的DRM设备了,比如下面的命令行中--device='/dev/dri/'
就是关键:
docker run \
-d \
--name='jellyfin' \
-e TZ="Asia/Shanghai" \
-p '8096:8096/tcp' \
-p '7359:7359/udp' \
-p '1900:1900/udp' \
-v '/media/nas/':'/media/':'rw' \
-v '/home/tomo/docker/jellyfin':'/config':'rw' \
-v '/home/tomo/cache':'/cache':'rw' \
--device='/dev/dri/' \
--restart=always \
'nyanmisaka/jellyfin:latest'
或者你在群晖中创建docker的时候勾选上使用高权限执行容器
,这样子DRM
设备会被直接通入容器中。
8.9 我确定我所有都是按照教程走的,没有发现任何错误,已经确定DRM设备已经通入容器中,上面但是就是硬解有问题。
请直接奔向,日志环节,这里就请自己解决了,这种一般是自己环境问题。皮蛋熊平时时间有限,很难有一对一辅导时间,不是大家都遇到的问题可能优先级会大幅降低。
一些思路:
- Jellyfin设置,确保是QSV,打开
低电压264 hevc编码
,关闭允许AV1格式编码
。 - 后续遇到相关案例再更新......
8.10 提示下面这种错误
这是你没有在引导中取消相关i915模块导致的!
- 如果是老引导,请按照上面教程进行取消
- 如果是新引导,在引导配置界面的 模块 -> 一键取消 i915 附属模块 enter一下即可。
九、致谢
非常感谢群里的大熊猫贡贡
、卡布达
、刕圐圙
、长凤大侠
、jim大佬
、不浮不躁
、佳芯
等多位大佬的鼎立支持。更感谢小黄鱼老板南唐乖乖的角瓜
的鼎立支持赠送的2张个测试卡,老板承诺三个月内不会因为我适配驱动而涨价(后续因为PC市场原因涨跌属于不可控因素,也非群晖用户炒起来的,皮蛋熊已经尽力了),同时会给报皮蛋熊的网友多送几个SATA
线,非常感谢老板的慷慨。
最后,非常感谢MoetaYuko
对于SA6400的intel BP驱动贡献,本代码的fix基于萌佬的修改,再次感谢wjz304
大佬开辟的RR引导对于所有群晖用户的贡献。
十、写在最后
非常感谢你能看到这里,皮蛋熊已经尽力把东西做的完善,如果你觉得皮蛋熊的努力值得肯定,皮蛋熊非常感谢你的支持。
如果你想交流心得,欢迎来 新QQ群 或者 TG群 一起吹水~(老Q群因不明原因被封,所以只加Q群有概率迷路)
如果皮蛋熊的努力解决了你的问题,不妨请皮蛋熊喝杯咖啡犒劳一下。
如果远方的朋友实力雄厚,知道皮蛋熊更喜欢吃烤鸭,想要犒劳皮蛋熊吃烤鸭:
or paypal: https://www.paypal.com/paypalme/pdbearme
在此,无比感谢愿意请皮蛋熊吃烤鸭超过88R的朋友,请凭记录直接加皮蛋熊Q好友([email protected]) 或者 TG好友(@dpawsbearr),皮蛋熊将会邀请你到体验/测试群中,你将获得额外的支持包括但不限于:
- 皮蛋熊将会尽力抽出时间解决你使用显卡的疑惑,问题等。
- 额外获得vGPU/GPU AI监控驱动的技术支持: 详见此网站
- 优先支持你提出的特性适配、问题修复等。
- 你有什么好玩的设备需要某些内核驱动级别的支持,皮蛋熊也会优先挤出时间进行学习适配。
- 不同厂家显卡的探索支持。
评论区