HomeLab | 4 GPU 硬解新境界:LXC 环境下玩转 JellyFin 核显硬解转码


请注意!!!

本系列的文章是断断续续写的,本文大部分内容最早写于2023年1月,可能有些信息已经过时!

别问,问就是写了一半然后放草稿箱里长草了。

0x00 引言

HomeLab 系列回顾:

HomeLab | 1 Proxmox Virtual Environment(PVE) 安装及配置

HomeLab | 2 OpenMediaVault 安装 & 硬盘直通 & 相关配置

HomeLab | 3 下载观影一条龙:NASTool/JellyFin/qBittorrent 半自动化家庭影院搭建指北

上一篇博客中,我们介绍了 JellyFin,这是一个免费开源的媒体中心软件,可以用来管理和播放您的个人媒体库,实现方便快捷灵活的观影体验。

其中,JellyFin 串流播放如果编码不适配等情况的话可能涉及转码,需要吃 CPU 的资源,而 GPU 硬件加速可以显着提高 JellyFin 的性能,这对于播放高分辨率视频或转码媒体文件尤其有用。

你说你没有独显,核显行不行?说得对,喵喵 没钱买独显 也这么想,这就来试试呗!

那为什么要使用 LXC 安装 JellyFin 呢?

LXC 是一种轻量级的虚拟化技术,可以让我们在同一台物理服务器上运行多个虚拟机,从而隔离不同的应用程序和服务,便于资源控制和管理。另外,直接使用 LXC 不涉及复杂的显卡直通操作,直接将显卡共享到 LXC 里使用,对于系统的兼容性较好。

这篇博客就来填一下之前挖的坑,介绍一下如何在 PVE 环境中使用 LXC 安装 JellyFin,并实现 GPU 核显硬件加速。

顺便还提了一下 PVE 中 openvswitch 的配置方法。

(头图由 AI 参与创作

0x01 宿主机上的配置

升级内核

首先升级下宿主机的内核和 PVE 版本!

apt update
apt upgrade

比如咱把内核和 PVE 管理器升级到了目前最新的版本。

手动装了下 pve-kernel 和 pve-headers

pve-kernel

pve-headers

(这些文字写的比较早但是放在草稿箱里吃灰了, 你看到文章的时候已经不是最新的了,建议还是装你这时候最新的

apt install pve-kernel-6.1.0-1-pve pve-headers-6.1.0-1-pve

然后保存好你的配置,重启 PVE

内核版本 Linux 6.1.0-1-pve #1 SMP PREEMPT_DYNAMIC PVE 6.1.0-1 (Tue, 13 Dec 2022 15:08:53 +0
PVE管理器版本 pve-manager/7.3-4/d69b70d4

开启 GuC 和 HuC

然后配下显卡的内核选项,开启 i915 GuC 和 HuC

根据 JellyFin 文档,Intel Gen9 and Gen11+ iGPUs 必须开启 Guc/Huc firmware

GuC and HuC 固件是由 linux-firmware 提供的。

submission and power management is enabled by setting the kernel module parameter: i915.enable_guc=1

HuC authentication only is enabled by setting the kernel module parameter: i915.enable_guc=2

Combine for both features together: i915.enable_guc=3

Please note that prior to kernel 4.16, HuC authentication was enabled by setting: i915.enable_guc_loading=1

Please see kernel documentation at https://www.kernel.org/doc/html/latest/gpu/i915.html#guc for more details.

nano /etc/modprobe.d/i915.conf

写入

options i915 enable_guc=3

然后更新内核模块,重启

update-initramfs -u -k all
reboot

请注意保存好工作,尽量先把 VM 手动关闭了,不然此处会等待所有 VM 和 LXC 都关了 PVE 才会真正重启,默认的 VM 关闭超时为 180s,超时才会强制关机。

重启后验证低功耗编码 HuC 和 GuC 是否开启

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

0x02 配置 PVE 中的内网(openvswitch)

这是一个可选步骤,只是懒得单独写一篇博客了,就顺便放在这里了吧

(以后群友问到的话,直接甩一个链接好了,多好

基于 Open vSwitch (openvswitch, OVS),可以在 PVE 中构建一个虚拟化万兆网卡,从而实现 PVE 上的 VM / LXC 之间高速互联。

apt update
apt install openvswitch-switch

依次点击

创建 OVS Bridge,可以直接默认配置然后点击 Create

然后创建 OVS IntPort,名字比如 internal,IPv4/CIDR 填个你喜欢的私网网段,比如 192.168.200.1/24,OVS Bridge 选择刚刚创建的 vmbr1,其他没有需要的话可以不填

然后 PVE 宿主机端的配置就完成了,如果有需要就另外给 VM / LXC 添加网卡,指定 Bridge: vmbr1 即可

VM添加内网网卡

下面的 LXC 配置里还会提到的。

0x03 挂载 NAS NFS

喵喵这里的存储是在 VM 的 omv 里的,通过 NFS 共享出来给 JellyFin 用,你的情景很有可能是挂载另一台机器(比如专门一台存储设备 / NAS)的存储,也是一个道理的。

噢对了,如果你是直接 PVE host 上的文件系统,那这一步就不用配置了,直接往下面一节看。

咱这里先挂载到 PVE 宿主机上,进而在后续步骤 map 到 LXC 里。

这么做是因为 NFS 是内核相关的行为,如果要在 LXC 里安装 NFS 并挂载的话,需要开启特权容器并在选项里勾选 NFS 才行。

按图添加 NFS 存储

Export 是 omv 上 NFS server 配置的,正常来说填了服务器 IP 就会自动出来下拉框可以选了。

配置好了之后会挂载到 /mnt/pve/media 目录下

0x04 LXC 配置

下载 Debian 11 的 CT 模板

如果这里半天下载不下来,可以手动下载到目录下,喵喵这里直接用 USTC 的镜像加速下载

cd /var/lib/vz/template/cache
wget https://mirrors.ustc.edu.cn/proxmox/images/system/debian-11-standard_11.6-1_amd64.tar.zst

新建 LXC 容器

为了后续安装 docker,这里勾选 嵌套

这里咱还是试试勾选 无特权的容器,不想给他那么高的权限,但可能需要多点 idmap 的麻烦事(

如果你不想折腾的话这里就把 无特权的容器 这个勾给去掉

注意这里有点坑,如果你是配好了系统了再到 PVE 的配置文件里去改这个 unprivileged 参数的值,比如把勾去掉(当然界面上改不了)也就是把 1 改成 0,那么重新起来之后 /root 等目录的所属者就会变成 100000 而不是 root 所对应的 0。意思就是这个 unprivileged 为了和宿主机做隔离,有个 id mapping 的玩意在里面的

这样的话需要先备份再还原

It is possible to convert an existing CT into an unprivileged CT by doing a backup, then a restore on console:

pct restore 1234 /var/lib/vz/dump/vzdump-lxc-1234-2016_03_02-02_31_03.tar.gz -ignore-unpack-errors 1 -unprivileged

如果没啥数据不想折腾的话,干脆直接删掉 LXC 再重新建个新的就完事了。

选择下载好的 Debian 11 CT template

(你想用其他的系统自己玩自己摸索也行

其他的硬盘啥的自己按心情来就好了。

CPU 可以分2核,内存稍微大点。

网络这里先配个静态的 IP,方便后续访问和连接 JellyFin

创建好之后,来到网络这里,添加咱 PVE 内部的网络。

添加网络设备,桥接 vmbr1,这个看你之前咋配的吧,喵喵这里整了个虚拟路由器(在 0x02 步骤中配置的),在 PVE 里的 VM / LXC 之间可以通过这个网络高速互联。

这里的网关不用填。

注意,创建完先不要启动!

挂载存储

参考官方文档 https://pve.proxmox.com/wiki/Linux_Container#_bind_mount_points ,将 PVE 宿主机上的 NFS 存储给挂载到 LXC 里。

如果你是宿主机上的存储的话,这里也可以照样着配置。

nano /etc/pve/lxc/109.conf

109 是 LXC 的编号,记得改成你自己的。在最下面加入

mp0: /mnt/pve/media,mp=/mnt/media

mp0 是第一个挂载点,如果需要挂载多个的话,按照顺序就是 mp1,mp2,mp3

/mnt/pve/media 就是宿主机上的存储路径,mp=/mnt/media 就是映射到 LXC 里的路径,后续 JellyFin 就是从这个路径去读文件了。

保存文件,在资源这里就能看到挂载点了。

这样挂载的话,在 LXC 里看到的文件和目录所属都被映射到 nobody (uid 65534),如果日常用还是可以的,前提是没有设置目录权限(也就是所有人都能读/写),以及不在乎用特定的 uid/gid 写入文件,因为所有文件都将使用高映射 (100000+) uid 来创建。

有需要的话,可以参考官方文档 Unprivileged LXC containers,配置一下 idmap 来让 LXC 里的用户拥有特定的 uid

咱这里摸了,大不了共享的时候直接 chmod -R 777 . 就行了(((

没想到后面还是要配 id mapping

然后启动 LXC,用户名 root,密码你自己设的,登录控制台,当然也可以直接 ssh 上去

看一下就能发现存储已经挂载上去了。

df -h
ls -al /mnt/media

共享核显

首先继续 在 LXC 里 看看 /etc/group 里的 video 和 render 组 id

# egrep 'video|render' /etc/group
video:x:44:
render:x:105:

然后 在宿主机上看看显卡、group

注意这里权限是 0660 的, 咱就是想办法在不改成 0666 也不开特权容器的情况下让 LXC 里的 docker 里的 JellyFin 能调用咱的 GPU。

(可把喵喵折腾坏了,咱就不信 unprivileged 容器不能用!!!

root@pve1:/etc/pve# lspci | grep -i vga
00:02.0 VGA compatible controller: Intel Corporation Device 4692 (rev 0c)
root@pve1:/etc/pve# ll /dev/dri
total 0
drwxr-xr-x   3 root root        100 Sep 19 05:49 .
drwxr-xr-x  19 root root       4.8K Sep 19 05:49 ..
drwxr-xr-x   2 root root         80 Sep 19 05:49 by-path
crw-rw----+  1 root video  226,   0 Sep 19 05:49 card0
crw-rw----+  1 root render 226, 128 Sep 19 05:49 renderD128
root@pve1:/etc/pve# ll /dev/dri/by-path/
total 0
drwxr-xr-x 2 root root  80 Sep 19 05:49 .
drwxr-xr-x 3 root root 100 Sep 19 05:49 ..
lrwxrwxrwx 1 root root   8 Sep 19 05:49 pci-0000:00:02.0-card -> ../card0
lrwxrwxrwx 1 root root  13 Sep 19 05:49 pci-0000:00:02.0-render -> ../renderD128
root@pve1:/etc/pve# egrep 'video|render' /etc/group
video:x:44:
render:x:103:

找到 card0,可以看到设备号 226,0,再找到 renderD128,可以看到设备号226,128

不同设备可能会不同,记下你的设备号。

然后继续编辑 host 上的 LXC 配置文件

nano /etc/pve/lxc/109.conf

这里为了实现咱的目标,需要配置好 idmap

参考 Unprivileged LXC containers 文档,他这个例子是把 LXC 里的 uid 1005 映射到外面 host 的 1005。他这里的 u 0 100000 1005 是说把 LXC 容器里的 uid 0-1004 这 1005 个 uids 映射到 host 上的 100000-101004,格式也就是 LXC起始uid host起始uid 数量

结合我们需要改一下,顺便把文件共享的 1000:1000 给映射到 host 上了。

这里特地把核显所需的 group 给 id map 了

LXC video 44 -> host video 44

LXC render 105 -> host render 103

这个不同系统可能不同,自己算一下就行了(最终要覆盖 0-65535 范围

在文件最后加入如下内容,注意这里的设备号也要对应上(Intel 核显一般是这个)。

lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
lxc.idmap: u 0 100000 1000
lxc.idmap: u 1000 1000 1
lxc.idmap: u 1001 101001 64535
lxc.idmap: g 0 100000 44
lxc.idmap: g 44 44 1
lxc.idmap: g 45 100045 60
lxc.idmap: g 105 103 1
lxc.idmap: g 106 100106 894
lxc.idmap: g 1000 1000 1
lxc.idmap: g 1001 101001 64535

然后 在 host 上配置 subuid 和 subgid

1000:1 表示允许从 1000 开始的 1 个,注意这里的 id 是 host 上的!(所以是103而不是105)

echo 'root:1000:1' >> /etc/subuid
cat >> /etc/subgid <<EOF
root:44:1
root:103:1
root:1000:1
EOF

如果不配的话,LXC 是启动不来的,会有类似这样的提示

lxc_map_ids: 3672 newuidmap failed to write mapping "newuidmap: uid range [1000-1001) -> [1000-1001) not allowed": xxx

另外,如果 idmap 里的范围没覆盖全的话,有可能出现 ssh 连不上,但控制台能登录的情况,检查并修正 idmap 之后就好了。

如果没问题的话,启动容器,ls -al /dev/dri 看到的对应组就正确了,而且是 0660 权限!

再看文件目录,这里的默认权限也变成 1000:1000 了

下面是一些其他的尝试,就放这参考,不保证可行。

如果你在前面设的是 有特权的容器(把无特权容器的勾去掉了),那这里就很方便了,理论上直接下面这样就行了,不用管这些复杂的 id mapping。

lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir

如果还是 unprivileged 的情况下,你不在乎权限大小,可以 直接给 0666 权限

lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri/card0 dev/dri/card0 none bind,optional,create=file
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
lxc.hook.pre-start: sh -c "chmod 0666 /dev/dri/renderD128 /dev/dri/card0"

这个 pre-start 命令可以进一步改一改,把外面的 gid 改成映射到里面的,但如果有多个容器同时在用的话不确定会不会有影响,或者对 host 上的正常使用不知道有何影响(

lxc.hook.pre-start: sh -c "chown 0:100105 /dev/dri/renderD128 && chown 0:100044 /dev/dri/card0 && chmod 0666 /dev/dri/renderD128 /dev/dri/card0"

还可以用 lxc.hook.autodev 加载脚本

lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.autodev: 1
lxc.hook.autodev: /var/lib/lxc/109/mount_hook.sh

编辑 hook 脚本

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

给个可执行权限

chmod +x /var/lib/lxc/109/mount_hook.sh

当然,如果你不需要把 1000:1000 映射进去,可以改一改 idmap

lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
lxc.idmap = u 0 100000 65536
lxc.idmap = g 0 100000 44
lxc.idmap = g 44 44 1
lxc.idmap = g 45 100045 60
lxc.idmap = g 105 103 1
lxc.idmap = g 106 100106 65430

并且

cat >> /etc/subgid <<EOF
root:44:1
root:103:1
EOF

/etc/subuid 就不用加了。

另外,提一句 NVidia GPU 的配置,这个是 privileged 容器的情况,来自 JellyFin 文档

lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 243:* rwm
lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file

这里可能有亿点点乱,希望你多读几遍能理解(反正喵喵重新配的时候又翻出来看了几遍

安装 vainfo

在 LXC 里安装

apt-get install -y intel-gpu-tools vainfo

测试下驱动是否正常,输出类似于以下的内容则正常

root@jellyfin:~# vainfo
error: can't connect to X server!
libva info: VA-API version 1.15.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_10
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.15 (libva 2.10.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 21.1.1 ()
vainfo: Supported profile and entrypoints
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileNone                   : VAEntrypointStats
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSliceLP
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSliceLP
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointEncPicture
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
      VAProfileHEVCMain               : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointEncSliceLP
      VAProfileHEVCMain10             : VAEntrypointVLD
      VAProfileHEVCMain10             : VAEntrypointEncSliceLP
      VAProfileVP9Profile0            : VAEntrypointVLD
      VAProfileVP9Profile0            : VAEntrypointEncSliceLP
      VAProfileVP9Profile1            : VAEntrypointVLD
      VAProfileVP9Profile1            : VAEntrypointEncSliceLP
      VAProfileVP9Profile2            : VAEntrypointVLD
      VAProfileVP9Profile2            : VAEntrypointEncSliceLP
      VAProfileVP9Profile3            : VAEntrypointVLD
      VAProfileVP9Profile3            : VAEntrypointEncSliceLP
      VAProfileHEVCMain12             : VAEntrypointVLD
      VAProfileHEVCMain422_10         : VAEntrypointVLD
      VAProfileHEVCMain422_12         : VAEntrypointVLD
      VAProfileHEVCMain444            : VAEntrypointVLD
      VAProfileHEVCMain444            : VAEntrypointEncSliceLP
      VAProfileHEVCMain444_10         : VAEntrypointVLD
      VAProfileHEVCMain444_10         : VAEntrypointEncSliceLP
      VAProfileHEVCMain444_12         : VAEntrypointVLD
      VAProfileHEVCSccMain            : VAEntrypointVLD
      VAProfileHEVCSccMain            : VAEntrypointEncSliceLP
      VAProfileHEVCSccMain10          : VAEntrypointVLD
      VAProfileHEVCSccMain10          : VAEntrypointEncSliceLP
      VAProfileHEVCSccMain444         : VAEntrypointVLD
      VAProfileHEVCSccMain444         : VAEntrypointEncSliceLP
      VAProfileAV1Profile0            : VAEntrypointVLD
      VAProfileHEVCSccMain444_10      : VAEntrypointVLD
      VAProfileHEVCSccMain444_10      : VAEntrypointEncSliceLP

jellyfin-ffmpeg version 4.4.1-2 及以上版本已经包含了 iHD 驱动,所以不用再安装 intel-media-va-driver-non-free 了。

0x05 JellyFin 安装及配置

进入 LXC 控制台,登录,或者 ssh 上去也行

换源

apt 源

sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
sed -i 's|security.debian.org|mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list
apt update
apt upgrade -y

修改语言和时区

nano /etc/default/locale

修改为以下内容

LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
localectl

设置时区为上海时区 / CST,并开启 NTP 时钟同步

timedatectl set-timezone Asia/Shanghai
timedatectl set-ntp true
timedatectl

安装 docker 及 docker compose

哈哈,喵喵就是喜欢再套一层 docker,而且 JellyFin 拿 docker 镜像来装感觉更方便

apt-get update
apt-get install -y ca-certificates curl gnupg lsb-release
mkdir -p /etc/apt/keyrings
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.ustc.edu.cn/docker-ce/linux/debian \
  $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
systemctl start docker

拉取 JellyFin docker 镜像

咱这里根据自己需要改了下,供参考。

据说 nyanmisaka/jellyfin 这个镜像对驱动、硬解码等做了不少优化,这里试一试。用官方的 jellyfin/jellyfin 镜像也是可行的,咱都试过了。

VA-API 需要把 render 组加到 docker 权限中,记得改成你系统里对应的 gid

version: '3.5'
services:
  jellyfin:
    image: nyanmisaka/jellyfin:latest
    # image: jellyfin/jellyfin
    container_name: jellyfin
    user: 1000:1000
    group_add:
      - "105"  # render group id can be discovered in /etc/group
    network_mode: 'host'
    volumes:
      - /mnt/media/config/jellyfin:/config
      - /mnt/media/cache:/cache
      - /mnt/media/transcodes:/config/transcodes  # ffmpeg转码的缓存目录
      - /mnt/media/links:/media
      # - /path/to/media2:/media2:ro
    restart: 'unless-stopped'
    # Optional - alternative address used for autodiscovery
    environment:
      - TZ=Asia/Shanghai
      # - JELLYFIN_PublishedServerUrl=http://example.com
    # Optional - may be necessary for docker healthcheck to pass if running in host network mode
    extra_hosts:
      - "host.docker.internal:host-gateway"
    devices:
      - /dev/dri:/dev/dri

注意这里记得加上 devices,不然调用不了 GPU 的,别问了,问就是喵喵调了老半天才发现……

然后,JellyFin,启动!

docker compose up -d

转码相关配置

访问 http://ip:8096/ ,登录

控制台-播放-转码,这里可以选择 Intel QuickSync (QSV) 或者 Video Acceleration API (VAAPI),然后把下面的启用硬件解码都勾上

再把 启用低电压模式的 Intel H.264 硬件编码器、启用低电压模式的 Intel HEVC 硬件编码器 勾上,这个就是在宿主机上配的内核参数起作用的地方了(

建议还是用 QSV网友 测试如下

另外,参考网上的建议,不要开启 VPP 色调映射,否则 HDR 转 SDR 后颜色会比较暗淡。

拉到最下面,保存。

然后找个电影放一放,看一下播放信息,如果需要转码的话,播放方式这里就会显示出来了。

可以看下 jellyfin 日志,如果用 QSV:

QSV

如果用 VAAPI:

VAAPI

另外在宿主机上可以看到已经调用了 igpu 进行解码,如果渲染字幕的话这里的 Render 也会有占用。

现在拖进度条就舒服多了呀!

喵呜,好耶!!!

当然还有一些其他问题顺便解决一下。

解决中文显示框框的问题

封面图里的中文、ASS 中文字幕显示方框

这里下载个字体文件:微软雅黑

当然如果你不喜欢的话还可以用别的字体,最好是 woff2 网页字体格式,比如 Noto Subset Font(简体中文应该是 NotoSansCJKsc-hinted,或者 得意黑 Smiley Sans (如果你喜欢的话

如果您的网站公开使用,请注意字体的版权问题。

mkdir -p /mnt/media/config/jellyfin/fonts

把字体文件上传到这个文件夹

进入控制台进行设置,控制台 - 播放 - 备用字体文件路径,设置为 /config/fonts,勾选 启用备用字体

最下面,保存

然后重启 JellyFin docker,在媒体库右键 修改图片 - 删除图片,重新刷新元数据

然后进入控制台-计划任务,触发 提取章节图片、扫描媒体库,重新生成封面图

这样封面图和字幕就正常了。

0x06 小结

喵呜!终于把坑填完了。

在这篇博客中,喵喵介绍了如何在 PVE 环境中基于 LXC 安装 JellyFin 并配置 GPU 核显实现硬件加速。

希望这对您有所帮助!

欢迎点击下面的 给喵喵打钱!(饿饿饭饭.gif

0xFF References

JellyFin 官方文档: Hardware Acceleration

Arch Wiki: Enable GuC / HuC firmware loading

LXC: Idmaps for user namespace

PVE: Linux Container

Proxmox VE(PVE) 7.x中,使用LXC安装Jellyfin,开启硬解码等

LXC安装jellyfin并开启硬件转码

群晖 Docker 安装 Jellyfin 媒体服务器并开启 Intel Quick Sync 提升性能

(PVE教程)12代核显在LXC容器实现jellyfin硬解码

PVE 中虚拟化万兆网卡


还有一些 GPU 共享的挺有意思:

通过LXD搭建实验室共享GPU服务器

为实验室建立公用GPU服务器

利用LXD容器构建共享的GPU服务器

(溜了溜了喵~


文章作者: MiaoTony
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 MiaoTony !
评论
 上一篇
CTF | 2023 强网杯 S7 线上赛 WriteUp CTF | 2023 强网杯 S7 线上赛 WriteUp
大概是喵喵的最后一届强网杯,今年继续和校队的师傅们一起打了下,感觉这比赛越来越卷了,而且py过于严重最后还是只能水个强网先锋,摸了。
2023-12-30
下一篇 
CTF | 2023 USTC Hackergame WriteUp CTF | 2023 USTC Hackergame WriteUp
又是一年Hackergame,今年题目难度整体偏基础好入门,给这周增添了点娱乐气息,和往年一样比赛中也学到了许多。
2023-11-05
  目录