外观
影音仓库:mergerfs + SnapRAID
目标:把几块容量不一的旧硬盘合成一个大目录,专门放电影、剧集、音乐这类「写一次、读很多次」的数据。用一块校验盘保护它们,坏一块数据盘不丢数据,媒体服务器以只读方式使用。
适合谁
- 数据是冷数据:很少修改,主要是新增和读取。
- 手上有不同容量的硬盘,想全部用起来,扩容时一次加一块盘。
- 能接受「同步之后才受保护」,不要求实时冗余。
- 不适合:频繁变动的数据(照片库编辑、数据库、虚拟机镜像、Docker 数据),要求实时冗余的,或要求单盘速度之外性能的。这些场景用软件 RAID或 Btrfs,见多块硬盘怎么组。
SnapRAID 的保护只到「上一次同步」
- 影响范围:同步(Sync)之后,同步之前被删除或修改的文件就无法恢复了。修复(Fix)会把所有已删除、已修改的文件恢复成上次同步时的样子,是个「霰弹枪」,不是按文件挑着恢复。
- 前置条件:校验盘的容量必须不小于最大的数据盘,这是硬性要求;校验盘只做校验,不能挪作他用;内存要健康,内存故障是用 SnapRAID 时丢数据的已知原因;先配好通知邮件。
- 怎么回退:没有回退。同步之前没发现的误删就找不回来,所以要设删除阈值,并且重要数据另有独立备份,见下面的「备份方案」。
先搞清三件事
| 层 | 负责什么 | 不提供什么 |
|---|---|---|
| mergerfs | 把多块盘的目录合成一个目录视图,按策略决定新文件落在哪块盘,扩容方便 | 不提供冗余。一块成员盘坏了,只丢这块盘上的数据,其余盘不受影响 |
| SnapRAID | 给多块独立的盘加奇偶校验,坏盘后能恢复,scrub 能发现静默损坏 | 不是实时的,同步后才受保护;不防同步之后的误删 |
| 备份 | 独立的另一份副本,防误删、勒索和整机损坏 | 要单独做 |
mergerfs 和 SnapRAID 是两个独立的插件,互不依赖,但常常搭配使用:mergerfs 管「看起来是一个目录」,SnapRAID 管「坏盘能救」。
磁盘规划
| 角色 | 数量 | 要求 |
|---|---|---|
| 系统盘 | 1 块小 SSD | OMV 独占,不放数据 |
| 数据盘 | 若干块,容量可以不同 | 每块单独建 EXT4,不要组 RAID。优先 CMR 盘,SMR 盘在同步和重建时可能长时间卡住 |
| 校验盘 | 1 块 | 容量不小于最大的数据盘,专用,同样建 EXT4 |
| 应用盘 | 1 块 SSD | 放 Jellyfin 的配置和元数据缓存,不要放进 mergerfs 池 |
每块数据盘单独建文件系统有个好处:任意一块都可以拔下来,接到别的 Linux 机器上直接读。
分步路线
| 步骤 | 做什么 | 教程 |
|---|---|---|
| 1. 选型与采购 | 确认冷数据场景,避开 SMR,新盘先做 SMART 长测 | 多块硬盘怎么组、数据盘怎么选 |
| 2. 装系统 | 装 OMV,装完改默认密码,配好邮件通知 | 用 ISO 安装 OMV、配置邮件通知 |
| 3. 准备每块盘 | 按序列号确认磁盘,擦除新盘,建 EXT4 并挂载 | 磁盘管理、S.M.A.R.T.、创建并挂载文件系统 |
| 4. 装插件 | 先装 omv-extras,再装 openmediavault-mergerfs 和 openmediavault-snapraid | 安装 omv-extras、安装、更新与卸载插件 |
| 5. 创建 mergerfs 池 | 在 存储器 → mergerfs(Storage → mergerfs)里选各块数据盘,先用默认的创建策略 pfrd | mergerfs |
| 6. 在池上建共享 | 给池建共享文件夹,开 SMB,媒体库设成只读给大多数人 | 共享文件夹、常见权限方案、SMB/CIFS 共享 |
| 7. 配置 SnapRAID | 在 服务 → SnapRAID(Services → SnapRAID)里建阵列,在磁盘页给每块数据盘勾选数据和内容,给校验盘勾选校验,然后做第一次同步,可能要几个小时 | SnapRAID |
| 8. 自动化 | 选内置的 diff 脚本,或 snapraid-aio,二选一,并设好通知 | SnapRAID、计划任务 |
| 9. 跑媒体服务 | Jellyfin 以只读方式挂载媒体库,配置和元数据放在应用盘 | 安装 Docker 与 Compose 插件、容器权限、Jellyfin |
| 10. 演练与备份 | 在测试数据上演练恢复,不可替代的数据另做备份 | 备份策略、恢复演练 |
在界面里保存任何设置之后,都要点页面顶部黄色提示条上的应用(Apply),配置才会真正生效。
几个关键点:
- mergerfs 池不要放数据库和 Docker 数据。 omv-extras wiki 明确说 mergerfs 不应该用于关系型数据库或 Docker 的 overlay 数据,Docker 目录也别放进池里。
- 插件内置的 diff 脚本和 snapraid-aio 不能同时启用。 AIO 是内置脚本的完整替代品,启用前先关掉内置脚本的定时任务;AIO 也要求先手动做过一次初始同步。
- 不要卸载
openmediavault-sharerootfs。 snapraid 依赖它,卸载会把 snapraid 一起卸掉,见 sharerootfs。 - 编辑 mergerfs 池之后可能需要重启才能完全生效。
日常节奏
| 任务 | 频率 | 说明 |
|---|---|---|
| diff | 每天,夜间 | 先看有没有大批量的删除或变更,没有异常再同步。同步期间避免增删文件,数据盘上的容器要暂停 |
| 同步 | diff 正常时,每天夜间 | 更新校验。首次同步最慢 |
| scrub | 每周一部分 | 通读并校验,发现静默损坏。内置脚本默认每 7 天跑一次、百分比 100,盘大时耗时很长,按你的夜间窗口调低百分比 |
| SMART 短测 | 每周 | 开启 SMART 并排计划任务,见 S.M.A.R.T. |
内置 diff 脚本的删除阈值和更新阈值默认都是 0,也就是不检查、总是同步。建议把删除阈值设成一个非 0 的值,这样一次大批量的误删会让同步停下来发邮件,而不是被写进校验。
备份方案
校验盘和数据盘在同一台机器里,SnapRAID 是冗余,不是备份:
| 风险 | SnapRAID | 怎么办 |
|---|---|---|
| 一块盘坏了 | 能恢复到上次同步时的状态 | 这正是它的用途 |
| 同步之后才发现的误删 | 不能 | 靠删除阈值提前拦截,靠备份兜底 |
| 勒索软件、整机损坏、被盗、断电损坏多块盘 | 不能 | 不可替代的数据(自己拍的视频、重要的收藏)另做一份独立备份,见插上 USB 硬盘自动备份、异地与云端备份 |
能重新下载的影视,不一定值得备份;买不回来的,一定要备份。
验收清单
- [ ] 每块数据盘和校验盘的 SMART 都正常,通知邮件能收到。
- [ ] mergerfs 池挂载后,通过共享能正常读写,看起来是一个目录。
- [ ] 首次同步完成,没有报错。
- [ ] 收到过一次 diff 的报告邮件。
- [ ] Jellyfin 能播放媒体库,并且是只读挂载,在容器里删文件会失败。
- [ ] 删除阈值已设置,用测试文件试过会停下同步。
- [ ] 在测试数据上演练过「删除文件、修复」的流程,并确认没有其他未同步的变更被一并回退。
- [ ] Docker 目录和 Jellyfin 的配置不在 mergerfs 池里。
- [ ] 不可替代的数据另有一份独立备份。
常见问题
想加一块新盘怎么办? 新盘建好 EXT4,加进 mergerfs 池和 SnapRAID 的磁盘列表。如果新盘比校验盘还大,校验盘就不够了,要换更大的校验盘,这是硬性要求。
mergerfs 的创建策略选哪个? OMV 8 的表单默认是 pfrd(按剩余空间百分比随机分布),OMV 7 的文档里写的默认是 epmfs,别把旧文档里的默认值直接套用。先保持默认,需要时再调,见 mergerfs。
为什么要把媒体库设成只读? 防止应用、误操作或被入侵的容器改动媒体文件,也减少同步期间的变动。