之前的一片文章讲述了如何优化视频流的加载速度,但是另一个问题还没有解决,即在打开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}"就可以仅拷贝图片和元数据文件。
1 | #创建upper_dir目录 |
挂载overlayfs文件系统
挂载overlayfs文件系统非常简单,仅需一行命令即可:
1 | # lowerdir是云盘的挂载目录,upperdir是上一步创建的文件夹,workdir在任意位置创建一个空文件夹即可,最后加上需要挂载的最终目录。注意确保lowerdir和upperdir文件结构一致!!! |
进入最终挂载的目录检查目录结构是否正确,最后将docker挂载的目录更改为通过overlayfs挂载的目录位置即可(我是通过docker部署的emby)。
最后,享受如本地盘的丝滑加载体验,enjoy
若没有本文 Issue,您可以使用 Comment 模版新建。