本地磁盘紧张,媒体文件却越来越多。

答案是 rclone 挂载云盘 + VFS 缓存,媒体服务器直接读挂载点。听起来很简单,实际有一串反直觉的问题。

一、两个挂载不能共用缓存

视频和漫画分了两个挂载,一度想合并成一个缓存池省空间。结论是不行

  • rclone 的 VFS 缓存每个进程各管各的,没有跨进程的全局池,--vfs-cache-max-size 只约束它自己
  • 漫画路径是视频路径的子目录,共用 --cache-dir 会让两棵缓存树重叠,两个进程互相增删同一批文件

就算合并成单挂载也不划算:

视频漫画
读法大文件顺序读 + 拖进度条几百张小图随机读
分块4M × 并行小块、无预读
模式只读可写

调优参数正好相反;而且看一部 4K 片就能把漫画缓存全顶出去。

二、目录缓存不会自己刷新

挂载带 --dir-cache-time 72h。如果你在服务端rclone moveto、网页版)改了文件,挂载进程毫不知情,会继续把旧目录列表喂给上层。

表现是:反复触发扫描,旧条目就是不消失。很容易误判成「扫描器卡住了」。

判断办法很简单——直接 ls 挂载点,看老目录还在不在,别只盯着扫描进度。

三、FUSE 重启会打断容器的挂载点

这是最阴的一个。重启 rclone 挂载之后:

宿主机  ls /data/library   → 正常,一切都在
容器里  ls /library               → Transport endpoint is not connected

容器是用 rslave 把宿主机目录挂进去的,底下的 FUSE 一重启,容器里那个挂载点就断了。宿主机上完全看不出问题,只有进容器才发现。

所以固定动作是:

  1. 先停容器(不然重启挂载就会把它打断)
  2. 重启 rclone 挂载
  3. 起容器
  4. 进容器 ls 确认——一个都不能漏

我漏过一次漫画那个容器,用户点开章节直接报「文件不存在」,而宿主机上一切正常。

四、超时要卡在对的那一层

某些文件会让 ffprobe 无限等待,进程变成 D 状态,kill -9 都杀不掉,整个扫描僵住。

--timeout 没用——那是 HTTP 层的,rclone 日志里一条超时都不会记。

真正管用的是 --daemon-timeout,管的是 FUSE 内核层的挂起。加上之后扫描速度从 10 项/10 分钟涨到 176 项,差了一个数量级。

参数留档

--read-only --dir-cache-time 72h
--vfs-cache-mode full --vfs-cache-max-size 9G
--vfs-read-chunk-size 4M --vfs-read-chunk-streams 4
--buffer-size 4M --vfs-read-ahead 0
--timeout 60s --daemon-timeout 120s --attr-timeout 5s

--vfs-read-chunk-streams 4 是关键:让 rclone 并行抓分块而不是单流顺序拉。单线程从云盘只有 78 Mbps,多线程能跑满端口;更重要的是拖进度条时能快速填满缓冲,不会一直转圈。