本地磁盘紧张,媒体文件却越来越多。
答案是 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 一重启,容器里那个挂载点就断了。宿主机上完全看不出问题,只有进容器才发现。
所以固定动作是:
- 先停容器(不然重启挂载就会把它打断)
- 重启 rclone 挂载
- 起容器
- 进容器
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,多线程能跑满端口;更重要的是拖进度条时能快速填满缓冲,不会一直转圈。