硬件及部署方式的选择
Unraid显卡建议使用P400或GTX1050以上,或从Nvidia官方显卡编码解码页面[[点击查询]](https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new)查看对应型号显卡的功能范围,编码解码能力太差的显卡不建议作为视频硬解的工作卡。
我的Unraid硬件是HPE Gen10+,服务器本身屏蔽集显,并且由于电源和显卡空间的限制只能选择低功耗的半高刀卡,所以我使用的是P400,这也是作为视频工作卡的最佳选择之一。
关于Jellyfin的部署方式,我按照网上查询到的教程[[Jellyfin官方教程]](https://jellyfin.org/docs/general/administration/hardware-acceleration.html#nvidia-hardware-acceleration-on-docker-linux)试着通过Unraid的应用商店,使用docker的方式安装,但很可惜的是明明在docker容器中执行nvidia-smi
命令可以看到已经正常加载了Nvidia显卡,但实际转码的时候仍然提示“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”。
为解决这个问题,我尝试在【启用硬件解码】的勾选项中减少部分选项进行测试,而后发现实际效果欠佳,部分视频可以正常播放但少部分仍然报错,且未找到原因。
因此,我选择放弃docker的部署方式,将显卡直通给虚拟机,并将Jellyfin直接安装在虚拟机内。
配置Unraid显卡直通给虚拟机
在Unraid的管理后台中,打开【设置】-【虚拟机管理器】-【高级视图】,确认配置【PCIe ACS 覆盖:已禁用】、【VFIO 允许不安全的中断:否】。如上述配置有修改,则重启生效。
在Unraid的管理后台中,打开【工具】-【系统设备】,找到Nvidia显卡对应的项,勾选后选择下方的【在引导时对VFIO选择了绑定】,然后重启Unraid。
添加虚拟机,我选择的CentOS系统[[镜像下载]](https://mirrors.tuna.tsinghua.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso),创建虚拟机时其余选项自行发挥,主要在显卡和声卡上需要注意。第一个显卡选择“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官方驱动下载页面[[页面地址]](https://www.nvidia.com/Download/index.aspx)选择对应的显卡和系统型号,并下载检索出的相应驱动,将下载好的驱动文件保存在虚拟机上备用,这里我们使用NVIDIA-Linux-X86_64-version.run
来指代此安装文件。
安装驱动前需要安装系统依赖包,这里参考上面的初始化中的相应内容。
其中dkms是可选的但建议安装,另外需对比命令uname -r
与rpm -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官方源]](https://repo.jellyfin.org/releases/server/centos/)中下载相应版本的安装文件。安装文件有三个,具体见下图:
然后安装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官方显卡编码解码页面[[点击查询]](https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new)可以查询;
- 【启用色调映射】选项可以勾选,若播放有异常可以尝试取消勾选;
- 点击最下方保存。
设置完毕后,你的Jellyfin应该就可以正常对视频进行解码转码了,使用Docker安装Jellyfin时出现的问题也都不复存在,转码时CPU使用率仍保持极低的状态。