前言
2025.3.22更新:unraid7.1.0 beta版本内核为6.12,还是不能成功调用dg1显卡。更新Dockerfile。
2025.3.16更新: 以上内容做了一些修改,实现了运行最新测试版emby。项目地址:https://aur.archlinux.org/packages/emby-server-beta
去年就折腾过dg1,那时候买的是蓝戟DG1,兼容性很差,再加上没精力折腾,没有成功,连屏幕都不亮。最近看到群友在折腾,于是又买了一根华硕DG1,再试试能不能搞定。
网上的教程都比较分散,很多都没有折腾结果,我在这里做一点细致的经验总结。
同时,我还在unraid论坛,emby论坛,github等发起了一些讨论。
https://forums.unraid.net/topic/188030-about-dg1-graphic-card-in-unraid/
https://emby.media/community/index.php?/topic/136926-about-emby-build-in-libva-and-ihd-driver/
https://github.com/thor2002ro/unraid_kernel/issues/26
魔改BIOS
首先,我的bios需要魔改才能点亮dg1,魔改bios参考了:https://github.com/xCuri0/ReBarUEFI。如果你的主板插上dg1能点亮屏幕,就不用魔改bios。
每个人的主板不同,对于我的主板,研域工控q270m这个型号,我找厂家索要了最新的bios。然后按照上述教程修改:
- 开启隐藏的above4g选项。(这步可以按照教程走,一键打开。但是我是手动打开的,效果一样。使用了AMIBCP 5.02.0034软件。手动打开参考了https://www.bilibili.com/opus/864854401661009953,注意需要改两个USER。)
- 修补uefi。
- 修补usb3。
- 重新刷入。(阅读DSDTMod.dsl后发现,我的bios固件不需要修补DSDT,所以跳过这步,直接刷入了。)
魔改bios有风险,请谨慎操作。
修改bios设置
点亮之后,需要 修改bios设置,参考教程为皮蛋熊大佬的博客教程:https://blog.kkk.rs/archives/36
这里做一些摘抄:
1. 开启UEFI引导。
2. Above4G。(必须)
3. ResizebleBAR选项(部分主板没有这个,没有可以忽略)
4. 关闭PCIe ASPM功能。(dg1不兼容低功耗模式,内核日志会疯狂报错)
====================================
文章作者: 皮蛋熊
文章来源: 蔚然小站
文章链接: https://blog.kkk.rs/archives/36
版权声明: 内容遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
成功进入系统后
进入系统需要改一些设置。
1. 替换社区版内核
如果能正常进入unriad系统并启动,就可以准备替换内核了。
关机,然后拔下引导u盘,下载文件后拷贝到u盘即可。(可以把旧文件加个old后缀,以防不能用需要回滚。)
unraid7.0.1使用的是6.6.8版本的linux内核,不支持dg1。所以需要替换为社区版的高版本内核。关于替换unraid内核部分,我使用了此版本内核:https://github.com/thor2002ro/unraid_kernel/releases/tag/20250304。
这个过程中,查了很多资料,了解了关于linux社区对intel显卡的支持发展史:
6.2内核支持了dg2(arc 310 380等)
6.8内核支持了dg1(蓝鲫和华硕的这两款)
6.12 支持了b系列intel显卡(也就是xe2系列)
2. 修改加载的驱动。
此教程的“开启内置Xe驱动”部分很好用,可以直接参考:https://natureblog.net/post/1#%E5%BC%80%E5%90%AF%E5%86%85%E7%BD%AEXe%E9%A9%B1%E5%8A%A8
在此基础上,还参考了:https://blog.kkk.rs/archives/28,添加 pcie_aspm=off 参数。
3. 直通给容器
jellyfin已经支持dg1,可以直接使用,qsv与vaapi都正常。jellyfin的dg1教程很多并且很容易成功,我不再赘述。
plex和emby的容器镜像目前都不支持dg1显卡的识别与编解码,因为镜像内置的qsv驱动与vaapi驱动太旧了。
但是!archlinux版本的emby-server可以,因为这个版本不会内置驱动,需要手动用pacman命令安装。这样我们就能安装到较新版本的驱动程序。
我在unraid上运行archlinux容器,之后也安装了archlinux物理机做了实验,证明的确可行。感谢群友的思路!
构建定制版emby运行环境
我们使用archlinux作为容器的base,自己构建emby运行容器。
FROM archlinux:latest
WORKDIR /config
USER root
RUN mkdir /init2 && mkdir /system
COPY . /init2/
ARG EMBY_V=4.9.0.42
ARG FFMPEG_V=2023_06_25
ENV TZ=Asia/Shanghai
ENV http_proxy="http://10.168.1.192:10810"
ENV https_proxy="http://10.168.1.192:10810"
ENV ftp_proxy="http://10.168.1.192:10810"
ENV FFDETECT=/usr/bin/ffdetect
ENV FFMPEG=/usr/bin/ffmpeg
ENV FFPROBE=/usr/bin/ffprobe
ENV PROGRAM_DATA=/config
ENV LIBVA_DRIVERS_PATH=/usr/lib/dri
ENV LD_LIBRARY_PATH=/usr/lib
ADD https://github.com/just-containers/s6-overlay/releases/download/v2.2.0.3/s6-overlay-amd64-installer /tmp/
RUN chmod +x /tmp/s6-overlay-amd64-installer && /tmp/s6-overlay-amd64-installer /
RUN mkdir -p /etc/services.d/emby-server-s6/ && cp /init2/run /etc/services.d/emby-server-s6 && cp /init2/finish /etc/services.d/emby-server-s6 && chmod u+x /etc/services.d/emby-server-s6/*
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "use_proxy=on" >> /etc/wgetrc && echo "http_proxy=http://10.168.1.192:10810/" >> /etc/wgetrc && echo "https_proxy=http://10.168.1.192:10810/" >> /etc/wgetrc && echo "ftp_proxy=http://10.168.1.192:10810/" >> /etc/wgetrc && echo "wait=10" >> /etc/wgetrc
RUN pacman -Syu --noconfirm && pacman -Sy --noconfirm alsa-lib aom aspnet-runtime-8.0 bzip2 dotnet-runtime-8.0 expat fontconfig fribidi glibc gmp gnutls lame libass chromaprint dav1d libdrm freetype2 libjpeg-turbo libmfx libpng tesseract libtheora libva libvips libvorbis libwebp x264 x265 ocl-icd opus skia-sharp sqlite zvbi zlib
RUN pacman -Sy --noconfirm intel-compute-runtime intel-media-driver onevpl-intel-gpu libva-utils wget unzip nano
# RUN wget https://github.com/MediaBrowser/Emby.Releases/releases/download/${EMBY_V}/embyserver-netcore_${EMBY_V}.zip && unzip -d / embyserver-netcore_${EMBY_V}.zip && chmod -R u+x /system
# RUN wget https://mediabrowser.github.io/embytools/ffmpeg-${FFMPEG_V}-x64.tar.xz && tar xvf ffmpeg-${FFMPEG_V}-x64.tar.xz -C / && chmod -R u+x /bin/ff*
RUN unzip -d / /init2/embyserver-netcore_${EMBY_V}.zip && chmod -R u+x /system
RUN tar xvf /init2/ffmpeg-${FFMPEG_V}-x64.tar.xz -C / && chmod -R u+x /bin/ff*
# ENTRYPOINT ["s6-svscan"]
ENTRYPOINT ["/init"]
# docker build --progress=plain -t harbor.mb6.top/xinjiawei1/embyarch:3.0 .
构建完成后进入容器,挂载 /config目录为配置文件目录。
测试发现,vaapi是正常识别的,qsv因为emby开发者太懒,目前还不能支持。测试版本是emby4.8.11。(archlinux只有4.8.11,没有测试版本的安装包)
其他的细节
- 容器我设置了GIDLIST0,18 ,设置 UID 0,GID 0。给了设备/dev/dri/
- 在unraid的go文件,我依旧设置了
- chown nobody:users /dev/dri
- chmod 0777 /dev/dri/*
- 我也在ubuntu容器中,手动编译了inrel-media-driver https://github.com/intel/media-driver 也能硬解,这种方式安装的用户态驱动是最新的,和最新的内核态驱动对应。但是!!!编译跑了五个小时,输出的驱动四百多M,建议不要轻易尝试。
- 你可能需要在dg1上插好hdmi线,bios才能识别到dg1。如果在开机状态下更换了显示输出接口,可能造成蓝屏或者dg1设备丢失,需要重启才能重新识别到。
用到的文件
一些开源工具可能比较旧了,你可以查看是否有更新的。
bios.7z :魔改q270m的bios用到的文件。
emby-logs.7z :对于emby4.8.10,使用i915内核驱动与xe内核驱动,不同的表现。
embyimage.zip:构建emby的dockerfile。
构建的docker镜像体积太大,就不分享了。
https://cf.mb6.top/tmp/?dir=temp/dg1
可能存在的问题
使用的emby-ffmpeg不是最新的。我在emby-4.9.0.40b中使用了4.8.11版本配套的ffmpeg,这可能存在隐藏问题。 已解决。
参考
https://archlinux.org/packages/extra/x86_64/emby-server
https://aur.archlinux.org/packages/emby-server-beta
以及以上所有列出的链接。
致谢
感谢一群群友 @被遗忘的人 给的思路,使用archlinux构建容器。
感谢一群群友 @皮蛋熊 帮助,参考了正常识别的dg1系统日志。
文章评论