LXC安装jellyfin并开启硬件转码

2021-01-27 19:10:08 26点赞 134收藏 19评论

创作立场声明:需要一台安装有proxmox的机器,安装教程在社区有很多大佬写过。用于容器硬解的显卡是intel核显。安装过程需要一点点linux的知识。

前言

如果你是一个proxmox用户又恰好装了群晖,想让群晖里的docker里装的jellyfin使用硬件转码是一件十分复杂的事情。另外,如果为了使用显卡硬件转码而安装一个虚拟机也会十分复杂,主要原因是intel显卡直通的配置十分复杂而且成功与否因板而异,docker挂载显卡设备比较麻烦。

最简单的方法莫过于直接将jellyfin安装到宿主机的debian系统中,可惜这样做不是很优雅。jellyfin侵入了proxmox的环境,如果对linux不是非常熟悉,在管理jellyfin时可能会影响到其他软件。LXC提供了一套很好的解决方案,在保留了proxmox优秀的管理能力的同时,又让配置不是很复杂。

最直观的感受就是在安卓手机使用proxmon管理虚拟机,可以看到虚拟机的性能曲线,可以方便地扩缩容,还可以直接在手机上进入某个系统的控制台。摸索LXC挂载显卡花了不少时间,写个文章让更多人避免掉坑。

创建支持挂载显卡的容器

创建 CT时注意取消选中非特权容器。访问硬件需要特权容器,我创建的容器ID为109 (记住这个ID后文要用)

创建109容器创建109容器

系统我选择了ubuntu18.04,其他系统操作也一样

使用ubuntu1804模板使用ubuntu1804模板

网络设置一个 ip,注意 ip 需要加上 netmask 也就是后面的`/24`

网络网络

配置完成后直接启动容器。

在容器中安装jellyfin

启动容器以后先配置一下软件源,具体操作可以参考阿里云镜像源。

这一步可以选做,用默认镜像源在国内只是下载速度会慢一些。

然后把软件都升级一下

apt update

apt upgrade

接着根据官方教程安装

顺便搬运一下官网的安装流程

sudo apt install apt-transport-https software-properties-common

sudo add-apt-repository universe

wget -O - https://repo.jellyfin.org/ubuntu/jellyfin_team.gpg.key | sudo apt-key add -

echo "deb [arch=$( dpkg --print-architecture )] https://repo.jellyfin.org/ubuntu $( lsb_release -c -s ) main" | sudo tee /etc/apt/sources.list.d/jellyfin.list

sudo apt update

sudo apt install jellyfin

安装完后执行 service jellyfin status,显示状态为 running 说明安装成功。

jellyfin服务状态jellyfin服务状态

在浏览器中输入 http://容器ip:8096 就可以进入jellyfin,对显卡硬解没有需求的值友来说,再把nas的电影目录挂载到容器中,已经可以开始用了。如果希望jellyfin能进行实时转码,cpu又不太好可以接着配置显卡硬解。


重头戏,配置显卡挂载

第一步 安装宿主机的显卡驱动

以下操作在宿主机执行

以下操作在宿主机执行

以下操作在宿主机执行

1. 进入宿主机的shell,常规操作先更新一下。

apt update

2. 安装驱动和检测工具。

apt install i965-va-driver vainfo

3. 检查显卡编解码是否正常

执行vainfo,如果显示出支持的各种编解码信息(Supported profile and entrypoints)说明驱动安装成功。

vainfo

会输出以下内容:

root@pve:~# vainfo

error: can't connect to X server!

libva info: VA-API version 1.4.0

libva info: va_getDriverName() returns 0

libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so

libva info: Found init function __vaDriverInit_1_4

libva info: va_openDriver() returns 0

vainfo: VA-API version: 1.4 (libva 2.4.0)

vainfo: Driver version: Intel i965 driver for Intel(R) Coffee Lake - 2.3.0

vainfo: Supported profile and entrypoints

VAProfileMPEG2Simple : VAEntrypointVLD

VAProfileMPEG2Simple : VAEntrypointEncSlice

VAProfileMPEG2Main : VAEntrypointVLD

VAProfileMPEG2Main : VAEntrypointEncSlice

VAProfileH264ConstrainedBaseline: VAEntrypointVLD

VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice

VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP

VAProfileH264Main : VAEntrypointVLD

VAProfileH264Main : VAEntrypointEncSlice

VAProfileH264Main : VAEntrypointEncSliceLP

VAProfileH264High : VAEntrypointVLD

VAProfileH264High : VAEntrypointEncSlice

VAProfileH264High : VAEntrypointEncSliceLP

VAProfileH264MultiviewHigh : VAEntrypointVLD

VAProfileH264StereoHigh : VAEntrypointVLD

VAProfileVC1Simple : VAEntrypointVLD

VAProfileVC1Main : VAEntrypointVLD

VAProfileVC1Advanced : VAEntrypointVLD

VAProfileNone : VAEntrypointVideoProc

VAProfileJPEGBaseline : VAEntrypointVLD

VAProfileJPEGBaseline : VAEntrypointEncPicture

VAProfileVP8Version0_3 : VAEntrypointVLD

VAProfileHEVCMain : VAEntrypointVLD

VAProfileHEVCMain10 : VAEntrypointVLD

VAProfileVP9Profile0 : VAEntrypointVLD

VAProfileVP9Profile2 : VAEntrypointVLD

如果执行报错或者没有正确试别解码配置,检查是否阻止了模块加载。(比如配置显卡直通的时候会配置驱动黑名单,让宿主机不要加载显卡的驱动,让位给vfio。后续会有显卡直通的文章发布,篇幅比较长现在还在进行重新排版,张大妈的文章编辑器不能直接用markdown还是有点麻烦)

如果有问题欢迎在评论区留言。写这篇文章的时候用于演示的CPU是G5400,核心显卡型号为hd600。


第二步 让容器可以使用显卡

1. 获取显卡分组信息

这部分操作仍然需要在宿主机执行,输入命令:

ls -l /etc/dri

输出如下:

root@pve:~# ls -l /dev/dri/

total 0

drwxr-xr-x 2 root root 80 Oct 13 12:39 by-path

crw-rw---- 1 root video 226, 0 Oct 13 12:39 card0

crw-rw---- 1 root render 226, 128 Oct 13 12:39 renderD128

这里的操作是挂载显卡的关键。先找到card0,可以看到设备号"226,0",再找到renderD128,可以看到设备号为"226,128"。记下card0的设备号为226:0,renderD128的设备号为226:128。

2. 将显卡挂载到虚拟机

proxmox的每个lxc都有一个配置文件,这些容器配置文件放在`/etc/pve/lxc`下,命名为 "虚拟机ID.conf"。下面的所有109都是指容器ID,如果你的容器ID不是109需要自行替换命令中的109。

编辑109号容器配置,命令:

nano /etc/pve/lxc/109.conf

在配置文件末尾加入下面几行

lxc.cgroup.devices.allow: c 226:0 rwm

lxc.cgroup.devices.allow: c 226:128 rwm

lxc.cgroup.devices.allow: c 29:0 rwm

lxc.autodev: 1

lxc.hook.autodev: /var/lib/lxc/109/mount_hook.sh

其中226:0和226:128是上一步获得的`设备号`。

使用nano创建mount_hook.sh。命令:

nano /var/lib/lxc/109/mount_hook.sh

在文件中加入

mkdir -p ${LXC_ROOTFS_MOUNT}/dev/dri

mknod -m 666 ${LXC_ROOTFS_MOUNT}/dev/dri/card0 c 226 0

mknod -m 666 ${LXC_ROOTFS_MOUNT}/dev/dri/renderD128 c 226 128

mknod -m 666 ${LXC_ROOTFS_MOUNT}/dev/fb0 c 29 0

以上这些配置的目的是让容器拥有访问显卡设备的权限。

第三步 验证容器是否可以进行硬解

以下操作全部在容器的控制台中完成。接下来进入容器控制台。

1. 检查显卡设备是否存在,命令:

ls /dev/dri

应该存在两个设备,分别是 card0 renderD128,说明容器成功挂载了这两个设备。

2. 检查容器中解码是否正常

vainfo

如果与刚才宿主机执行这条命令输出内容相似说明解码正常。

3. 启用jellyfin硬件转码

在jellyfin中硬件转码的设置在控制台->服务器->播放

进入控制台进入控制台

把硬件加速改为VAAPI,在下面的VAAPI设备里输入/dev/dri/renderD128。此时只要打开的视频编码是显卡支持硬解的编码类型,转码就会使用显卡完成,大幅度降低cpu的压力。

配置硬件加速配置硬件加速

配置硬件加速配置硬件加速

如果在看电影过程中发现黑屏或者花屏,可以适当关闭一部分编码的硬件编码。

总结

LXC安装jellyfin搭配手机控制软件proxmon可以直观地监视容器与虚拟机的状态,让家庭影音系统的搭建更加方便灵活。配合硬解可以很好地利用上因为安装了proxmox而闲置的核显资源。

proxmonproxmon

目前已经发布了两篇关于proxmox的文章,All in One计划成功启航,欢迎关注,这篇文章是我半年前突发奇想在LXC中安装jellyfin的流程的记录,为了发到社区对原来的博客进行了重新排版和内容优化。现在我正在All in One设备完成这篇文章,如果你对All in One感兴趣请多多点赞评论,后续还会更新更多教程文章。

展开 收起
19评论

  • 精彩
  • 最新
  • 你好,有博客吗?发现你的一些教程我之前也碰到过类似的坑,后来摸索自己解决了一些。 [高兴] 想去你博客看看更多文章,看看有没有更多的内容,学习一下。

    校验提示文案

    提交
    blog.timzhong.top欢迎关注,也欢迎加好友,这几天会更新博客添加建议方式

    校验提示文案

    提交
    *联系方式

    校验提示文案

    提交
    还有2条回复
    收起所有回复
  • 请问jellyfin如何读取nas的影音资源?纯小白一个,按照楼主的教程搭建了jellyfin,却不知道如果在媒体库中连到黑裙的文件夹

    校验提示文案

    提交
    挂载nfs或者smb

    校验提示文案

    提交
    收起所有回复
  • 小白求教这样搞完之后可以实现pve宿主设备hdmi直接输出图像声音吗,想搞win10核显直通折腾半个月都没成功 [喜极而泣]

    校验提示文案

    提交
    去看看
    e3 1265l v3也是折腾了很久不能直通,按这个教程核显直通成功。总结踩坑经验:1 安装旧版驱动时断掉外网,防止win10自动安装驱动;并且,关闭数字强制签名验证,测试旧版驱动,可能要测试很多版本。2 vga:none模式不能成功,可以用vga:std试试,成功后禁用显示器1 只用直通的显示器2 就行。3 可能直通成功后声卡无输出,这又要试win10的版本,实测21h2可用。

    校验提示文案

    提交
    🐮🐮🐮我不搞了

    校验提示文案

    提交
    还有1条回复
    收起所有回复
  • lxc安装jellyfin后转码会占用硬盘,满了之后就没法转码了,怎么解决?

    校验提示文案

    提交
    容量给大一点?

    校验提示文案

    提交
    这样好像不太行,我查了一下,其他人也有这个问题,但是只有网页端播放的时候才会出现。现在给了25G,还是不够用。有空试试别的客户端播放有没有问题。但是很奇怪,你们都没碰见这个问题吗?而且磁盘满了之后lxc就完蛋了,重启也不行。

    校验提示文案

    提交
    收起所有回复
  • 第二步 让容器可以使用显卡
    1. 获取显卡分组信息
    下面的
    ls -l /etc/dri
    写错了
    应该是ls -l /dev/dri

    校验提示文案

    提交
  • 行文清晰通顺,点赞

    校验提示文案

    提交
  • 不知道问题在哪儿,LTC加载宿主驱动文件目录失败,感觉就是没加载上

    校验提示文案

    提交
    问题出在lxc.cgroup.devices.allow这里,网上都是抄来抄去,但在较新版本里,参数已改成了cgroup2

    校验提示文案

    提交
    收起所有回复
  • 请问 "lxc.cgroup.devices.allow: c 29:0 rwm" 中 " 29:0" 代表什么设备?

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
134
扫一下,分享更方便,购买更轻松