Unraid安装Jellyfin并开启Nvidia独显硬解

linken 2,645 2022-05-06

硬件及部署方式的选择

Unraid显卡建议使用P400或GTX1050以上,或从Nvidia官方显卡编码解码页面[点击查询]查看对应型号显卡的功能范围,编码解码能力太差的显卡不建议作为视频硬解的工作卡。

我的Unraid硬件是HPE Gen10+,服务器本身屏蔽集显,并且由于电源和显卡空间的限制只能选择低功耗的半高刀卡,所以我使用的是P400,这也是作为视频工作卡的最佳选择之一。

关于Jellyfin的部署方式,我按照网上查询到的教程[Jellyfin官方教程]试着通过Unraid的应用商店,使用docker的方式安装,但很可惜的是明明在docker容器中执行nvidia-smi命令可以看到已经正常加载了Nvidia显卡,但实际转码的时候仍然提示“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”。

为解决这个问题,我尝试在【启用硬件解码】的勾选项中减少部分选项进行测试,而后发现实际效果欠佳,部分视频可以正常播放但少部分仍然报错,且未找到原因。

因此,我选择放弃docker的部署方式,将显卡直通给虚拟机,并将Jellyfin直接安装在虚拟机内。

配置Unraid显卡直通给虚拟机

在Unraid的管理后台中,打开【设置】-【虚拟机管理器】-【高级视图】,确认配置【PCIe ACS 覆盖:已禁用】、【VFIO 允许不安全的中断:否】。如上述配置有修改,则重启生效。

在Unraid的管理后台中,打开【工具】-【系统设备】,找到Nvidia显卡对应的项,勾选后选择下方的【在引导时对VFIO选择了绑定】,然后重启Unraid。

添加虚拟机,我选择的CentOS系统[镜像下载],创建虚拟机时其余选项自行发挥,主要在显卡和声卡上需要注意。第一个显卡选择“VNC”默认不变,然后点左下角加号增加第二个显卡,在下拉选项中选择显示了具体型号的Nvidia显卡,下面的附加项保持默认不填;声卡则直接选择Nvidia对应的声卡。然后进行系统安装。

虚拟机安装显卡驱动及Jellyfin程序

1、系统初始化及依赖环境安装

系统安装完毕后需要进行简单配置,如家中使用可关闭防火墙、关闭Selinux等,这些不详细缀述。

另外系统还需要安装如vim、wget、gcc等工具和环境,考虑到后面安装显卡驱动以及Jellyfin程序时需要用到的各种工具和环境以及软件源,我们在此统一进行配置:

#软件包更新
yum -y update
#安装开发工具,即所需依赖环境(N)
yum -y groupinstall "Development Tools"
#安装系统基础工具以及EPEL软件源
yum -y install vim wget curl net-tools nfs-utils epel-release
#安装依赖包(N)
yum -y install kernel-devel dkms
#安装依赖包(J)
yum -y install libicu fontconfig ffmpeg
#下载安装包(J)
wget https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
#rpm安装依赖包(J)
rpm -ihv rpmfusion-free-release-7.noarch.rpm

以上是全部需要安装的环境与工具,为进行区分,(N)标志为安装Nvidia显卡驱动所需,(J)标志为安装Jellyfin所需,无标志为系统基础工具。

2、禁用默认驱动

安装显卡驱动前,需要禁用系统默认的nouveau开源驱动,具体操作如下:

新建配置文件:

vim /etc/modprobe.d/blacklist-nouveau.conf

内容为:

blacklist nouveau
options nouveau modeset=0

备份当前镜像:

mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak

建立新镜像:

dracut /boot/initramfs-$(uname -r).img $(uname -r)

完成上述操作后重启虚拟机。

3、安装Nvidia官方驱动

去Nvidia官方驱动下载页面[页面地址]选择对应的显卡和系统型号,并下载检索出的相应驱动,将下载好的驱动文件保存在虚拟机上备用,这里我们使用NVIDIA-Linux-X86_64-version.run来指代此安装文件。

安装驱动前需要安装系统依赖包,这里参考上面的初始化中的相应内容。

其中dkms是可选的但建议安装,另外需对比命令uname -rrpm -q kernel-devel的输出中内核版本是否一致,如果不一致则需使用命令yum -y upgrade kernel kernel-devel升级然后重启后重新检查版本,直到两个命令输出的版本一致后可进行正式安装。

需要进到存放文件的目录下,执行安装命令:

chmod +x NVIDIA-Linux-X86_64-version.run
./NVIDIA-Linux-X86_64-version.run

安装时大部分选项默认或选择允许即可,安装成功后可用命令nvidia-smi查看显卡状态,输出正常即为安装成功。

4、安装Jellyfin并配置硬件解码

上面在初始化步骤中已经配置好了依赖环境,此时可直接去官方库[Jellyfin官方源]中下载相应版本的安装文件。安装文件有三个,具体见下图:
jellyfin_install_download

然后安装rpm包:

rpm -Uvh --nodeps jellyfin-web-10.7.7-1.el7.noarch.rpm
rpm -Uvh --nodeps jellyfin-server-10.7.7-1.el7.x86_64.rpm
rpm -Uvh --nodeps jellyfin-10.7.7-1.el7.x86_64.rpm

安装完成后启动Jellyfin并配置为开机启动:

systemctl start jellyfin && systemctl enable jellyfin

接下来访问http://虚拟机IP:8096即可打开Jellyfin的页面并完成初始化。

但在这之前由于媒体文件存放在Unraid或者其他存储而不是虚拟机上,所以需要将媒体文件夹通过SMB或NFS共享给虚拟机,虚拟机配置好挂载后在Jellyfin的控制界面才可以看到媒体文件夹。我建议使用NFS挂载,并应在确认正常后将此项添加到开机自动挂载。由于初始化时已经安装了nfs-utils,所以可以直接执行挂载命令:

mkdir /mnt/media
mount -t nfs 存储设备IP:/media文件夹路径 /mnt/media

配置开机自动挂载(必须确认挂载正常后才可配置此选项,若挂载不可用会导致开机失败):

echo "存储设备IP:/media文件夹路径 /mnt/media nfs defaults  0 0" >> /etc/fstab

接下来在浏览器中打开Jellyfin的控制界面进行初始化配置。在基础配置调整完毕后:

  • 打开【控制台】-【播放】;
  • 在【硬件加速】选项中选择【Nvidia NVENC】;
  • 在【启用硬件解码】中勾选与显卡型号对应的解码项,此内容在Nvidia官方显卡编码解码页面[点击查询]可以查询;
  • 【启用色调映射】选项可以勾选,若播放有异常可以尝试取消勾选;
  • 点击最下方保存。

设置完毕后,你的Jellyfin应该就可以正常对视频进行解码转码了,使用Docker安装Jellyfin时出现的问题也都不复存在,转码时CPU使用率仍保持极低的状态。


# unraid