N5105 Jellyfin 硬件加速

先说结论,显卡受限于驱动原因,暂时有Ubuntu 21.04+ 以上系统可以实现,直通Windows 10绝无可能(2022/05/19)。
回到主题,最近流行各种小主机做软路由、家庭影音、Nas等系统。这些主机的CPU主要有J4125(10gen)、N5105(11gen)、N6005,其中前两款为Intel® Celeron®,后面这个款为Intel® Pentium®,10代采用14nm工艺,11代采用10nm工艺,N5105和N6005相对J4125有不错的性能提升。在性能相差不大的情况N5105要经济一些,这也是很多人被坑的主要原因,N5105有各种直通方案的折腾。

重点,本人对硬件其实不熟悉,通过几番折腾紧紧对Intel低功耗CPU有个粗浅的了解,错误地方就当放屁吧。


一、不折腾,怎么最简单直直通到虚拟机?

不折腾
翻遍了中文互联网社区,除了部分LXC方案最简单而且是可靠的,其他大部分不靠谱。大部分方案或者勉强叫教程,最后没有验证过程,按照实施步骤基本可以认定最后是失败的。尤其是直通Win10虚拟机,不可能成功,除非他自己写了驱动。

1. 缘起:Jellyfin硬件加速。

Jellyfin最为一套可靠的穷人家庭影音系统,做到了一个长视频网站所有该做的功能,视频不是从存储直出要经过一次转码(好像也有直出方案,稍后看下文档补充),甚至还有各种码率的选择。
众所周知转码这活CPU也能干,但我们这次专门说的是N5105。做为穷人家庭服务器,机器上必然有个OpwnWRT+NAS+Jeellyfin,我们也不好把算力用在转码上。毕竟这个CPU上还有个集成显卡不是吗?用起来,加速!

Jellyfin 转码设置支持如下几如下几种加速方案:

2. 方案选择

  • Intel QuickSync(QSV): 当前Linux环境下需要Intel提供的驱动,编解码支持比较差,具体可参看 https://github.com/intel/media-driver , N5105的显卡代号为 JasperLake [UHD Graphics]
  • VA-API: 紧支持Intel iGPUs、AMD GPU。

考虑到QSV方案里,Intel® iGPUs支持比较差,我们选择VA-API,当然这也是最简单的方案。

3. 实施

1) 开启Huc和GuC

这不是必须的操作, 只有HEVC硬解,开启低电压解码器需要本单元操作。

HuC是Intel显卡的HEVC/H.265微处理器,如果需要HEVC的硬解功能才需要开启。9代以后的intel CPU支持此功能。
GuC图形微控制器(Graphics micro (μ) Controller),控制上下提交,电源关闭等方面控制功能。开启低电压转码模式必须要开启。
PVE7.x 某些版本采用的内核是是5.15.x,这些版本的内核开启GuC可能会失败(BUG),所以需要更换内核。

  • 内核升级

    升级内核到5.19
    #确认内核版本,如果是5.15  可以升级内核
    uname -a
    #查看可安装内核版本
    apt search pve-kernel|grep pve-kernel-
    #这里建议安装稳定版内核
    apt install pve-kernel-5.19.17-2-pve/stable
    #选择启动内核版本
    proxmox-boot-tool kernel pin 5.19.17-2-pve
    #验证内核状态
    root@pn41:~# /usr/sbin/proxmox-boot-tool kernel list
    Manually selected kernels:
    None.

    Automatically selected kernels:
    5.15.102-1-pve
    5.19.17-2-pve

    Pinned kernel:
    5.19.17-2-pve
  • 开始GuC

    /etc/modprobe.d/i915.conf
    echo "options i915 enable_guc=3" >> nano  /etc/modprobe.d/i915.conf

    如果非N5105可参照下图确认guc支持情况,3代表同时开始GuC和HuC。更多可参照下文Enable GuC链接。

  • 重启验证GuC状态,如果没有成功信息,需要更新固件 https://archlinux.org/packages/?name=linux-firmware

    dmesg | grep -iE "guc|huc"
    [ 5.767306] Setting dangerous option enable_guc - tainting kernel
    [ 6.014137] i915 0000:00:02.0: [drm] GuC firmware i915/ehl_guc_70.1.1.bin version 70.1
    [ 6.014143] i915 0000:00:02.0: [drm] HuC firmware i915/ehl_huc_9.0.0.bin version 9.0
    [ 6.029614] i915 0000:00:02.0: [drm] HuC authenticated
    [ 6.030103] i915 0000:00:02.0: [drm] GuC submission enabled
    [ 6.030183] i915 0000:00:02.0: [drm] GuC SLPC disabled
2) 检查HOST是否成功驱动显卡。
root@pve:~# ls /dev/dri
ls: cannot access '/dev/dri': No such file or directory
#显卡状态
root@pve:~# lspci -k
...
00:02.0 VGA compatible controller: Intel Corporation JasperLake [UHD Graphics] (rev 01)
DeviceName: Onboard - Video
Subsystem: ASUSTeK Computer Inc. Device 8813
Kernel driver in use: vfio-pci
Kernel modules: i915
...

上面就是失败案例,原因是尝试虚拟化开启了,解决步骤如下:

  • /etc/modprobe.d/pve-blacklist.conf 注释掉 blacklist i915,当然如果不需要其他设备直通可以全部注释掉。
  • /etc/default/grub 去掉 video=efifb:off,vesafb:off
  • /etc/modprobe.d/vfio.conf 去掉网卡,这个需要进一步获取
#获取显卡IDs
root@pve:~# lspci -n -s 00:02
00:02.0 0300: 8086:4e61 (rev 01)
删掉vfio.conf 8086:4e61 这个设备

#重做grub
root@pve:~# update-grub
#更新initramfs
root@pve:~# update-initramfs -u
#重启pve
root@pve:~# reboot

验证显卡是否正确驱动,并开启,如果没有,再看看是不是漏了啥。

查看LXC直通
root@pve:~# ls /dev/dri
by-path card0 renderD128
3) 使用LXC安装Jellyfin

LXC是RedHat?发起的容器化技术。与云原生领域常用的Docker、Podman类似,都是通过cgroups ns实现了进程隔离;保持相对独立的运行环境,做到了进程隔离,资源相对隔离。
本质上LUX容器还是在HOST上跑的,所以能直接使用硬件。

下面开始Jellyfin调用显卡部分操作:

  • 安装LXC容器,系统要求Ubuntu不能低于21:05,Debain与PVE版本一致应该都没问题,pve7 用的是Debain 11,建议使用Ubuntu 22:04.
  • 编辑 lxc 配置文件 /etc/pve/lxc/.conf
编辑LXC直通
#Intel iGPU:
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
3)重启LXC,进入容器验证时候直通
验证直通
# 注意 226,128 两个数字
root@jellyfin:~# ls -all /dev/dri/
total 0
drwxr-xr-x 2 root root 80 May 19 12:36 .
drwxr-xr-x 8 root root 540 May 19 12:36 ..
crw-rw---- 1 root video 226, 0 May 19 12:33 card0
crw-rw---- 1 root syslog 226, 128 May 19 12:33 renderD128
# 打开视频执行观察下
root@jellyfin:~# ps aux | grep ffmpeg | grep accel
# 或者直接看下 转码日志
root@jellyfin:~# tail -f /var/log/jellyfin/FFmpeg.Transcode-*
[AVHWDeviceContext @ 0x564c672489c0] No VA display found for device /dev/dri/renderD128.
Device creation failed: -22.
Failed to set value 'vaapi=va:/dev/dri/renderD128' for option 'init_hw_device': Invalid argument
Error parsing global options: Invalid argument

哈哈,依旧失败,我们是不是白干了呢?不是,人家都说了嘛jellyfin-ffmpeg version 4.4.1-2 or higher is required

升级ffmpeg
apt upgrade jellyfin-ffmpeg

如果更新失败,可以去jellyfin网站下载,手动安装一下 https://repo.jellyfin.org/releases/server/ubuntu/versions/jellyfin-ffmpeg/
更新完务必确认一下ffmpeg 版本

检查ffmpeg版本
root@jellyfin:~# /usr/lib/jellyfin-ffmpeg/ffmpeg -version
ffmpeg version 5.0.1-Jellyfin Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)

二、 总结

整片文章其实没有提供真正意义上的直通。次实验机器为一台华硕PN41,真正实现了直通的设备是AX201 Wifi6, N5105核显直通到Win10不能驱动,Linux理论上可以做到虚拟机直通,使用PCI方案,网上尝试直通Win10虚拟机(直通后不能驱动,显卡代码43)的也都是这种方案。另外据称Win11可以直通,希望有老哥尝试一把。

请注意!!!!Kernel5.15 GuC 开启有问题,具体参照⬇️ Kernel BUG, 其他内核暂无问题。其他问题请参照扩展链接开启 确认GuC开启状态。


三、扩展阅读