侧边栏壁纸
博主头像
蔚然小站博主等级

未来会有的,不要辜负了梦想

  • 累计撰写 35 篇文章
  • 累计创建 14 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

PVE直通DG1/DG2并使用SA6400驱动DG1/DG2教程

皮蛋熊
2023-12-23 / 3 评论 / 43 点赞 / 13069 阅读 / 15124 字
温馨提示:
本文最后更新于 2024-04-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

一、前言

Intel DG1显卡的编解码性能非常的强悍,将其用于NAS中的编解码任务是一个非常好的选择,本文旨在介绍Intel DG1独立显卡在群晖SA6400系统下的编解码安装。但由于DG1的硬件兼容性非常差,如果你没有DG1这张显卡,请先尝试下咨询网友自己的硬件平台是否兼容再决定是否购买尝试,切不可在不知兼容性的情况下直接购买。

注意:未经驱动源代码版权方Intel公司许可,不得将上述内容用于商业用途或侵犯版权行为。使用本驱动所产生的一切后果由用户自行承担,与提供者无关,本内容仅供学习研究使用。

介绍视频:

如果是ESXi作为底层请移步到ESXi处理办法

本驱动同时支持DG1/DG2(A380/A750/A770等),本文中的内核只处理了DG1的直通部分,DG2的直通本文中提供的内核无关。

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并保存等。 需要修改的选项如下:

  1. 打开above4G选项。
  2. 打开UEFI引导,关闭CSM兼容模式。
  3. 打开resizableBAR选项(如果有),没有也不强求,该选项打开会增强一定兼容性,如果你未能成功点亮DG1,可尝试打开该选项再试试。
  4. 关闭PCIe子选项中的ASPM,由于DG1的PCIe IP兼容性非常差,且不太符合规范,所以很多高阶PCIe的特性请务必关闭这些经常变换PCIe工作状态的特性。

此时请尝试插入DG1,尝试是否可以点亮系统,如果不可以请多尝试诸如更新BIOS,检查bios设备等选项。

有些企业级平台对于PCIe的规范性要求比较严格,DG1极有可能无法通过其PCIe的测试,比如R730/R730XD明确无法通过,所以也无法点亮。

三、PVE系统安装

PVE系统安装时,请不要插入DG1,首先我们需要准备下载两套软件:

  1. 官方pve-7.4下载点我
  2. 官方rufus 写入软件下载点我

这里我们教程演示基于PVE7.4,系统足够稳定是NAS长久稳定运行的前提,这里我们选择非常稳定的PVE7.4,不选PVE8也是基于稳定的考量。

下载好上面两个软件后,我们在一台已经开机的windows电脑中,插入预先准备的优盘,打开rufus,选择你要写入的U盘PVE镜像,一切默认即可,可参考下面图片依次选择,

dg1_ (2).png

写入镜像过程中:

dg1_ (2).png

镜像写入完毕:

dg1_ (2).png

此时启动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

卸载后我们进行安装,这里皮蛋熊使用的目录是/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"

上面的选项解释如下:

  1. intel_iommu=on 开启intel的iommu,这里如果是amd的处理需要修改为:amd_iommu=on
  2. spectre_v2=off spectre_v1=off两个CPU BUG的修补,是侧信道攻击,安全类BUG,但修复会导致CPU性能下降,这里我选择不修补,可根据自己情况进行选择。
  3. pcie_acs_override=downstream IOMMU分组补丁,用于将设备分组分的更开一点,如果使用这段代码仍然无法分开iommu组,可以尝试使用这段:pcie_acs_override=downstream,multifunction
  4. 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

dg1_ (2).png

填入NameSA6400,其中VM ID是自动生成的:

dg1_ (2).png

dg1_ (2).png

dg1_ (2).png

至少给200G的空间:

dg1_ (2).png

选择Host和核心数:

dg1_ (2).png

设置分配内存大小:

dg1_ (2).png

网络选择半虚拟化即可:

dg1_ (2).png

点击完成:

dg1_ (2).png

建立完成后:

dg1_ (2).png

删除CD/DVD Driver

dg1_ (2).png

添加直通的DG1设备,仅添加显卡就可以了,不用管声卡和周边设备:

dg1_ (2).png

下载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_ (2).png 其中直通了DG1,这里该设备的BDF是0000:05:00.0,这里选择Q35还是i440fx都可以,没有任何问题。

六、RR配置

注意:以下教程裸机或者虚拟群晖通用: 选择配置引导configure loader

dg1_ (2).png

输入menu.sh并回车:

dg1_ (2).png

选择模块Modules menu:

dg1_ (2).png

选择第一个Show/Select modules

dg1_ (2).png

取消勾选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这么多选项:

dg1_ (2).png

dg1_ (2).png

dg1_ (2).png

:后期RR引导适配了dg1后,这些选项务必进行重新勾选,就不再需要单独安装驱动了。

一路OK后返回重新编译引导:

dg1_ (2).png

完成后启动设备:

dg1_ (2).png

开始群晖系统的初始化设置。。。。

开启SSH:

dg1_ (2).png

使用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后会修复)。

七、附件

八、错误排查

因为DG1的PCIe IP质量非常糟糕,导致其兼容性堪忧,下面是一些常见的排错手段:

8.1 如果我无法点亮DG1应该怎么办?

  1. 检查BIOS选项是否设置了上述步骤中的选项
  2. 根据网友反馈,可以尝试升级或者降级BIOS
  3. 某些服务器平台R730XD/R730无法过PCIe检测,暂无可解选项

8.2 我可以成功点亮,但是驱动工作看起来不太正常,没有找到DRM设备的card/renderD节点应该怎么办?

  1. 检查dmesg信息中是否存在PCI错误或AER错误,如果你确定已经关闭ASPM选项,仍然出现这个错误,表示你的主板和DG1不太兼容,目前没有很好的办法。
  2. 检查dmesg | grep i915,查看是否存在什么错误,可将错误发到群里,以便进一步排查。

8.3 我有一个视频是H.264 8K的,发现DG1无法编解码?

  • 是的,DG1对于H.264只支持4K分辨率,对于H265等格式则支持8K。

8.4 为什么同样的配置看别人都成功了,我为什么不行?

  • 检查下各个组件的硬件是否损坏
  • 检查下是否和别人使用了同样的PCIe插槽,有时候不同的插槽的IP不同,兼容性也不一样。

8.5 为什么我的解码正常,但是速度很慢,通过intel_gpu_top发现没有跑满?

  1. 检查下文件是不是网络存储的,存在读取瓶颈。
  2. 检查下DG1的PCIe插槽,是不是带宽不够?PCIE 什么X1大概率是不够。

8.6 我直通的时候PVE会卡住,界面输出snd_hda_intel等信息

  1. 修改/etc/modprobe.d/blacklist.conf,添加blacklist snd_hda_intel,并输入update-initramfs -u -k all更新ramfs后重启。
  2. 直通给群晖使用的DG1请不要插入HDMI/DP等输出接口。
  3. 同时建议所有直通显卡类的设备,host一定要屏蔽对应的驱动,并不要在host中使用该接口进行显示输出。

8.7 我第一次启动的时候安装驱动正常,重启后驱动掉了需要重新安装才可以使用,这是为什么?

目前驱动暂未提交到RR引导中,所以请先设置开机计划任务,在用户定义脚本框中填入cd /volume1/docker/i915_debug && ./install.sh即可,开机计划任务设置可参考群晖NAS:利用任务计划执行开机重启frp脚本

九、致谢

非常感谢群里的大熊猫贡贡卡布达刕圐圙长凤大侠jim大佬不浮不躁佳芯等多位大佬的鼎立支持。更感谢小黄鱼老板南唐乖乖的角瓜的鼎立支持赠送的2张个测试卡,老板承诺三个月内不会因为我适配驱动而涨价(后续因为PC市场原因涨跌属于不可控因素,也非群晖用户炒起来的,皮蛋熊已经尽力了),同时会给报皮蛋熊的网友多送几个SATA线,非常感谢老板的慷慨。

最后,非常感谢MoetaYuko对于SA6400的intel BP驱动贡献,本代码的fix基于萌佬的修改,再次感谢wjz304大佬开辟的RR引导对于所有群晖用户的贡献。

十、写在最后

非常感谢你能看到这里,皮蛋熊已经尽力把东西做的完善,如果你觉得皮蛋熊的努力值得肯定,皮蛋熊非常感谢你的支持。


如果皮蛋熊的努力解决了你的问题,不妨请皮蛋熊喝杯咖啡犒劳一下。

wechat-caffe.png


如果远方的朋友实力雄厚,知道皮蛋熊更喜欢吃烤鸭,想要犒劳皮蛋熊吃烤鸭wechat-kaoyano88.png

在此,无比感谢愿意请皮蛋熊吃烤鸭超过88R的朋友,请凭记录直接加皮蛋熊Q好友([email protected]),皮蛋熊将会邀请你到体验/测试群中,你将获得额外的支持包括但不限于:

  1. 皮蛋熊将会尽力抽出时间解决你使用显卡的疑惑,问题等。
  2. 额外获得vGPU/GPU AI监控驱动的技术支持: 详见此网站
  3. 优先支持你提出的特性适配、问题修复等。
  4. 你有什么好玩的设备需要某些内核驱动级别的支持,皮蛋熊也会优先挤出时间进行学习适配。
  5. 不同厂家显卡的探索支持。

43

评论区