在 Jellyfin 中,视频刮削下载的元数据通常有两种存放方式。
一种是分散存储在视频同目录下,如:
Movies/
**── Avatar (2009).mkv
**── Avatar (2009).nfo
**── poster.jpg
**── backdrop.jpg
Jellyfin 需要读取这些元数据以显示信息,使用机械硬盘(HDD)作为视频的仓库盘时,由于 HDD 随机读写性能极差,大量零碎的 .nfo 元数据将会导致性能变慢。
另一种是集中存储到 Jellyfin 管理的数据目录,在 Docker 中常见位置为:
/config/metadata/
元数据储存在固态硬盘(SSD)中可以提高读取速度,但是由于 Jellyfin 通过哈希结构储存元数据,这样就无法控制元数据的目录结构,无法通过 .nfo 文件进行手动管理。
如果希望元数据既能够存储在随机读写性能更高大的 SSD 中,又能够通过目录结构管理 .nfo 文件,可以通过 mergerfs 来实现。
mergerfs 是一种“把多个硬盘目录合并成一个目录显示”的 Linux 联合文件系统。视频储存在 HDD 目录中,元数据储存在 SSD 目录中,通过 mergerfs 结合它们创建虚拟目录,将这个虚拟目录作为媒体库文件夹,在 Jellyfin 眼中,元数据和视频就好像在同一个目录下。
安装 mergerfs:
# 更新包列表
sudo apt update
# 安装 mergerfs
sudo apt install mergerfs -y
# 验证安装是否成功
mergerfs -v
创建 SSD 下的目录 /Test_SSD 和 /Test_Mergerfs,HDD 下的目录 /Test_HDD。
接下来要做的,就是通过 mergerfs 把目录 /Test_SSD 和 /Test_HDD 合并成统一的虚拟目录 /Test_Mergerfs。
编辑 fstab,开机后会自动挂载:
# 备份
sudo cp /etc/fstab /etc/fstab.bak
# 编辑
sudo nano /etc/fstab
在文件最底部添加一行:
/vol1/1000/Test_SSD:/vol2/1000/Test_HDD /vol1/1000/Test_Mergerfs fuse.mergerfs defaults,allow_other,use_ino,cache.files=off,dropcacheonclose=true,minfreespace=1G,category.create=ff,category.action=epall,nonempty,fsname=mergerfs-media 0 0
关键参数解释:
/vol1/1000/Test_SSD:/vol2/1000/Test_HDD:分支列表(要合并的目录)。
/vol1/1000/Test_Mergerfs:挂载点(目标目录)。
defaults:使用 mergerfs 默认选项。
fuse.mergerfs:让系统识别为 mergerfs。
allow_other:允许其他用户(如 Docker 中的 Jellyfin)访问。
use_ino:让 mergerfs 使用底层文件系统的真实 inode 值,而不是自己生成。
cache.files=off:关闭文件缓存,减少内存占用(大库推荐)。
dropcacheonclose=true:关闭文件时丢弃缓存,进一步减少内存占用。
minfreespace=1G:当某个分支剩余空间少于 1GB 时不再写入该分支(可以根据实际情况调整)。
category.create=ff:新建文件/目录时,找到分支顺序中第一个符合条件的分支就写入(First Found)。
category.action=epall:删除、改权限、重命名等操作时,在所有存在该路径的分支上执行,避免在“没有这个路径”的分支上无谓操作。
nonempty:允许挂载到非空目录,如果挂载点目录 /Test_Mergerfs 已有文件,不会报错。
fsname=mergerfs-media:自定义文件系统名称,方便识别。
分支列表 /Test_SSD 在 /Test_HDD 之前,这样读取时会优先读取 /Test_SSD 中的文件。使用 category.create=ff 策略,当我们在 /Test_Mergerfs 中写入文件时,会优先写入 /Test_SSD。
保存后执行:
sudo systemctl daemon-reload
sudo mount -a
执行后,访问 /Test_Mergerfs 时,看到的内容是 /Test_SSD 和 /Test_HDD 上文件的“并集”。这正是这套方案的核心:让 Jellyfin 只看到一个路径,却能同时利用 HDD(存视频大文件)和 SSD(存元数据小文件)。
验证挂载是否成功:
# 查看 /Test_SSD + /Test_HDD 合并后的联合容量视图
df -h | grep Test_Mergerfs
mergerfs-media 15T 5.9T 8.9T 40% /vol1/1000/Test_Mergerfs
如果想要将 /Test_HDD 原有的元数据移动到 /Test_SSD 下,可以通过 rsync:
rsync -avh --max-size=10M --remove-source-files --info=STATS,NAME,PROGRESS /Test_HDD/ /Test_SSD/
这样一来,只需要在 Jellyfin 媒体库设置中使用 /Test_Mergerfs 文件夹,元数据储存方式选择 NFO,勾选 将媒体图像保存到媒体所在文件夹,刮削的元数据就会自动储存在 /Test_SSD,目录结构与 /Test_HDD 中的视频保持一致,可以很方便的进行管理,同时充分利用了 HDD 和 SSD 的特性,将 HDD 作为视频仓库盘的同时利用 SSD 加速元数据的读写。