LXC安装jellyfin并开启硬件转码
创作立场声明:需要一台安装有proxmox的机器,安装教程在社区有很多大佬写过。用于容器硬解的显卡是intel核显。安装过程需要一点点linux的知识。
前言
如果你是一个proxmox用户又恰好装了群晖,想让群晖里的docker里装的jellyfin使用硬件转码是一件十分复杂的事情。另外,如果为了使用显卡硬件转码而安装一个虚拟机也会十分复杂,主要原因是intel显卡直通的配置十分复杂而且成功与否因板而异,docker挂载显卡设备比较麻烦。
最简单的方法莫过于直接将jellyfin安装到宿主机的debian系统中,可惜这样做不是很优雅。jellyfin侵入了proxmox的环境,如果对linux不是非常熟悉,在管理jellyfin时可能会影响到其他软件。LXC提供了一套很好的解决方案,在保留了proxmox优秀的管理能力的同时,又让配置不是很复杂。
最直观的感受就是在安卓手机使用proxmon管理虚拟机,可以看到虚拟机的性能曲线,可以方便地扩缩容,还可以直接在手机上进入某个系统的控制台。摸索LXC挂载显卡花了不少时间,写个文章让更多人避免掉坑。
创建支持挂载显卡的容器
创建 CT时注意取消选中非特权容器。访问硬件需要特权容器,我创建的容器ID为109 (记住这个ID后文要用)
系统我选择了ubuntu18.04,其他系统操作也一样
网络设置一个 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 说明安装成功。
在浏览器中输入 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而闲置的核显资源。
目前已经发布了两篇关于proxmox的文章,All in One计划成功启航,欢迎关注,这篇文章是我半年前突发奇想在LXC中安装jellyfin的流程的记录,为了发到社区对原来的博客进行了重新排版和内容优化。现在我正在All in One设备完成这篇文章,如果你对All in One感兴趣请多多点赞评论,后续还会更新更多教程文章。
梦晓生
校验提示文案
yuluo
校验提示文案
值友4865003158
校验提示文案
pdd083051
校验提示文案
值友6292714151
1. 获取显卡分组信息
下面的
ls -l /etc/dri
写错了
应该是ls -l /dev/dri
校验提示文案
你不买-我不买
校验提示文案
奈依左特
校验提示文案
值友1425624953
校验提示文案
pdd083051
校验提示文案
值友6292714151
1. 获取显卡分组信息
下面的
ls -l /etc/dri
写错了
应该是ls -l /dev/dri
校验提示文案
值友1425624953
校验提示文案
奈依左特
校验提示文案
你不买-我不买
校验提示文案
值友4865003158
校验提示文案
yuluo
校验提示文案
梦晓生
校验提示文案