N5105 Jellyfin 硬件加速

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. 检查HOST是否成功驱动显卡。
1
2
3
4
5
6
7
8
9
10
11
12
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 去掉网卡,这个需要进一步获取
1
2
3
4
5
6
7
8
9
10
11
#获取显卡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
  • 验证显卡是否正确驱动,并开启,如果没有,再看看是不是漏了啥。
1
2
root@pve:~# ls /dev/dri
by-path card0 renderD128
    1. 使用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

1
2
3
4
5
#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

- 重启LXC,进入容器验证时候直通
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 注意 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

1
apt upgrade jellyfin-ffmpeg

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

1
2
3
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开启状态。


三、扩展阅读

评论