上一部分,我们介绍了自建NAS的硬件配置及相关的虚拟化系统ESXi,这一部分我们在虚拟层之上构建我们的NAS系统群晖及服务器Debian。群晖实际也支持docker以及一些媒体服务如Plex的安装, 但是本着专有的系统做专门的事情,我们使用Debian+docker安装媒体服务,以及通过Debian尝试核显直通硬解码。

黑群晖

黑群晖指在非官方硬件上安装群晖系统。目前这部分比较成熟,有很多教程及工具可以实现,这里我们使用的是arpl工具,地址是https://github.com/fbelavenuto/arpl

首先我们从arpl releases中下载最新的镜像,我们使用ESXi,这里选择vmdk-flat版本。解压下载的压缩包,将压缩包两个文件arpl-flat.vmdkarpl.vmdk上传至ESXi数据存储中。上传成功后数据存储中只显示单个文件,如图

arpl upload

新建虚拟机,操作系统版本注意选择 其他6.x或更高版本Linux(64位) (有些类型在后续选择硬盘直通时无法选择PCI设备)。

create vm

选择CPU及内存配置,2核4G,内存配置 预留所有客户机内存

vm cpu mem

移除默认的硬盘,SCSI控制器以及CD/DVD驱动器。

remove disk scsi and cd/dvd

先添加现有硬盘,选择数据存储中的arpl文件。再添加新标准硬盘。

add disk

找到虚拟机选项->引导选项->启用 UEFI 安全引导,禁用该配置

disable uefi security

检查最终配置,如图

check config

完成后启动虚拟机,等待arpl加载。加载完成后会出现如下信息

arpl load

访问提示的地址,进入配置页面,按步骤操作

  1. Choose a model
    arpl choose a model
  2. Choose a build number
    arpl choose a build number
  3. Generate a random serial number
    arpl generate sn
  4. Build the loader
    arpl build loader
  5. Wait for downloading DS image
    arpl download ds image
  6. Boot the loader
    arpl boot the loader
  7. Booting
    arpl booting

加载完成后,会显示Connection Closed,我们访问同IP下的5000端口,会进入群晖设置页面

config ds

按步骤操作,最后进入进度条

install ds

安装成功后,我们将机器关机,配置硬盘直通(理论上可以在最开始配置)。进入ESXi管理界面,主机-管理-硬件-PCI设备,找到我们的独立存储硬盘,切换直通

toggle passthrough

最后编辑虚拟机,添加PCI设备,选择直通硬盘

vm add pci device

在群晖存储管理器中检测磁盘

ds check storage

至此整个群晖的构建就结束了。后续在群晖的各种设置,可以参考线上资料进行摸索,不再赘述。

Debian

Debian作为主流的Linux发行版,稳定且各个生态支持较好,所以这里尝试用Debian作为媒体服务器等。 Debian的安装这里不再赘述(需要注意的是之后核显也需要在内存配置时勾选 预留所有客户机内存 ), 主要介绍下ESXi+Debian的核显直通能力,然后测试下Jellyfin的硬解码播放视频。

开启核显

  1. 下载最新的内核并安装,重启并检测内核版本

    mkdir kernel && cd kernel
    wget http://ftp.debian.org/debian/pool/main/l/linux-signed-amd64/linux-image-6.1.0-7-amd64_6.1.20-1_amd64.deb
    sudo dpkg -i linux-image-6.1.0-7-amd64_6.1.20-1_amd64.deb
    sudo reboot
    
    # check kernel
    uname -a
    # Linux debian 6.1.0-7-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.20-1 (2023-03-19) x86_64 GNU/Linux
    
  2. 关闭ESXi核显占用

    ESXi配置主机-操作,开启SSH,SSH进入系统运行如下命令esxcli system settings kernel set -s vga -v FALSE

  3. 添加PCI核显设备,禁用Debian虚拟显卡

    编辑虚拟机配置,虚拟硬件-添加其他设备-PCI设备,选择核显

    debian add pci device

    编辑虚拟机配置,虚拟机选项-高级-配置参数-编辑配置,将svga.present值改为FALSE

    debian disable vga

  4. 启动虚拟机,检查核显是否加载,正确加载会看到renderD128设备

    ls -l /dev/dri
    total 0
    drwxr-xr-x 2 root root         80 Mar 27 00:09 by-path
    crw-rw---- 1 root video  226,   0 Mar 27 00:09 card0
    crw-rw---- 1 root render 226, 128 Mar 27 00:09 renderD128
    
  5. 补全缺失的915 guc huc dmc固件

    mkdir -p /lib/firmware/i915 && cd /lib/firmware/i915
    curl -LO https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/i915/ehl_guc_70.1.1.bin
    curl -LO https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/i915/ehl_huc_9.0.0.bin
    curl -LO https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/i915/icl_dmc_ver1_09.bin
    
  6. 开启核显编码,然后重启

    echo "options i915 enable_guc=3" > /etc/modprobe.d/i915.conf
    
  7. 重启后验证是否开启成功

    journalctl -b -o short-monotonic -k | egrep -i "i915|dmr|dmc|guc|huc"
    

测试硬解码

至此核显应该开启成功,我们使用Jellyfin播放视频测试下效果。

挂载群晖网络盘

sudo mkdir -p /media/nas/media
sudo mount -t cifs -o rw,vers=3.0,credentials=/root/.smbcredentials,uid=1000,gid=1000 //192.168.50.102/media /media/nas/media

开机自动挂载可以在/etc/fstab添加如下一行

//192.168.50.102/media /media/nas/media cifs vers=3.0,credentials=/root/.smbcredentials,uid=1000,gid=1000

参考官方文档安装docker服务https://docs.docker.com/engine/install/debian/ 。然后启动Jellyfin服务,这里我们使用的是N大的nyanmisaka/jellyfin镜像, 内置了硬解码相关的依赖和驱动。

docker run \
  -d \
  --name='jellyfin' \
  -e TZ="Asia/Shanghai" \
  -p '8096:8096/tcp' \
  -p '7359:7359/udp' \
  -p '1900:1900/udp' \
  -v '/media/nas/':'/media/':'rw' \
  -v '/home/tomo/docker/jellyfin':'/config':'rw' \
  -v '/home/tomo/cache':'/cache':'rw' \
  --device='/dev/dri/' \
  --restart=always \
  'nyanmisaka/jellyfin:latest'

等待镜像拉取及服务启动,之后我们通过8096端口登录Jellyfin,进行初始化。初始化后,左上角菜单进入控制台,选择播放设置,开启硬解码,我们选择 Intel QuickSync(QSV) 作为硬件加速选项, 完整的配置如下

jellyfin hardware acceleration

我们选择一个4K视频尝试硬解效果。(intel_gpu_top命令在该模式下报错,暂时还没找到原因和解决方案, 可以使用htop命令观察CPU占用情况,结合播放的视频信息判断)

jellyfin play info

可以看到播放信息显示转码,htop命令显示了FFmpeg进程,且CPU占用较为正常。

jellyfin play htop