本文最后更新于 8 个月前,文中所描述的信息可能已发生改变。
WARNING注意
2024-03-29 更新:新版 Emby 在媒体库选项中增加了一个 在服务器的元数据文件夹中保留图像的缓存副本
的选项,可以图片加速的类似效果,但具体未作测试,由于该文章的主要目的是为解决视频列表加载缓慢,而不是图片加载缓慢,所以该文章中的方法依然具备参考价值。
之前的一篇文章讲述了如何优化视频流的加载速度,但是另一个问题还没有解决,即在打开 Emby 时海报加载需要多次从云盘下载,拖慢了海报加载速度,并且在加载有大量集数的电视剧/动漫的播放列表的时候较为缓慢。其中以老友记为例,每一季仅有二十多集的情况下点击某一集需要等待20-50秒才能完全加载出视频列表。本文将介绍如何使用Overlayfs
自建缓存,将图片和元数据保存在本地,以提高海报和视频列表的加载速度。
原理分析
OverlayFS
,顾名思义是一种堆叠文件系统,可以将多个目录的内容叠加到另一个目录上。其中有三个目录,分别为 lower_dir
(下层目录,是处于最底层的目录,作为只读层,通过overlayfs
挂载后无法被读写)、upper_dir
(上层目录,处于最顶层的目录,任何读写的操作都只会在此目录进行)和work_dir
(作为缓存目录)。
进程读写overlayfs
文件规则:
当进程“读取”文件时,
overlayfs
文件系统驱动将优先在上层目录upperdir
中查找并从该目录中读取文件,找不到则在下层目录lowerdir
中查找。当进程"写入"文件时,
overlayfs
会将其写入上层目录upperdir
。当进程“删除”文件时,如果
upperdir
存在此文件则直接删除,如果是lowerdir
中的目录则不会真正删除,而是会在upperdir
中标注此文件已删除。
至此,根据进程读取文件会优先从上层目录读取的原理,我们只要将云盘中的图片和nfo文件按照目录结构拷贝到本地,作为“上层目录”,并且将云盘挂载到本地的目录作为“下层目录”,即可做到Emby在读取图片和nfo元数据的时候从本地读取,只有在读取视频文件的时候从云盘获取了。这样会大大减少图片和视频列表的加载速度,从最直观的老友记来说,从之前加载视频列表所需要的几十秒,到现在几乎秒加载,体验还是非常不错的。
不过这里有一个问题,如果我们将图片和元数据保留在本地即可大幅度优化加载体验,那为什么不在 Emby 扫库的时候不勾选**“将媒体图片和资料信息保存到媒体所在文件夹”和“存储 nfo 文件”**呢?这样的话图片和 nfo 也将保存在本地,加载速度也会很快。我认为不这么做的理由有几个:
- 如果由 Emby 保存图片和nfo到本地,并不能自定义文件存储位置,并且在对 Emby 配置进行备份的时候备份包也会非常大;
- 如果出现了特殊情况(如Emby配置文件丢失或更改媒体服务器程序)需要重新扫库的时候不需要从头挂削元数据,只需要扫描本地nfo即可。
具体实现
创建Upper_dir用于存储图片和元数据
Rclone 在拷贝文件的时候有一个非常好用的参数:--include
,所以我们如果只需要加上--include "*.{png,jpg,nfo}"
就可以仅拷贝图片和元数据文件。
# 创建 upper_dir 目录
mkdir -p Overlayfs/media_uppper
# 创建 workdir 目录
mkdir -p Overlayfs/workdir
# 第一次运行建议加上--dry-run确保指令没有出错,同时可以查看图片和nfo总共的文件大小方便分配空间
rclone copy Cloud\ drive:/movie ./Overlayfs/media_upper/movie --include "*.{png,jpg,nfo}" -P -v --dry-run
rclone copy Cloud\ drive:/anime ./Overlayfs/media_upper/anime --include "*.{png,jpg,nfo}" -P -v --dry-run
挂载 Overlayfs 文件系统
挂载 Overlayfs 文件系统非常简单,仅需一行命令即可:
# lowerdir是云盘的挂载目录,upperdir是上一步创建的文件夹,workdir在任意位置创建一个空文件夹即可,最后加上需要挂载的最终目录。注意确保lowerdir和upperdir文件结构一致!!!
mount -t overlay overlay -o lowerdir=/mnt/drive/anime,upperdir=/root/Overlayfs/media_upper/anime,workdir=/root/Overlayfs/workdir/anime /media/anime
# 我挂载了第二个目录
mount -t overlay overlay -o lowerdir=/mnt/drive/movie,upperdir=/root/Overlayfs/media_upper/movie,workdir=/root/Overlayfs/workdir/movie /media/movie
进入最终挂载的目录检查目录结构是否正确,最后将docker挂载的目录更改为通过 Overlayfs
挂载的目录位置即可(我是通过docker部署)。
最后,享受如本地盘的丝滑加载体验,enjoy