跳转到内容

影音仓库:mergerfs + SnapRAID ​

目标:把几块容量不一的旧硬盘合成一个大目录,专门放电影、剧集、音乐这类「写一次、读很多次」的数据。用一块校验盘保护它们,坏一块数据盘不丢数据,媒体服务器以只读方式使用。

适合谁 ​

  • 数据是冷数据:很少修改,主要是新增和读取。
  • 手上有不同容量的硬盘,想全部用起来,扩容时一次加一块盘。
  • 能接受「同步之后才受保护」,不要求实时冗余。
  • 不适合:频繁变动的数据(照片库编辑、数据库、虚拟机镜像、Docker 数据),要求实时冗余的,或要求单盘速度之外性能的。这些场景用软件 RAID或 Btrfs,见多块硬盘怎么组。

SnapRAID 的保护只到「上一次同步」

  • 影响范围:同步(Sync)之后,同步之前被删除或修改的文件就无法恢复了。修复(Fix)会把所有已删除、已修改的文件恢复成上次同步时的样子,是个「霰弹枪」,不是按文件挑着恢复。
  • 前置条件:校验盘的容量必须不小于最大的数据盘,这是硬性要求;校验盘只做校验,不能挪作他用;内存要健康,内存故障是用 SnapRAID 时丢数据的已知原因;先配好通知邮件。
  • 怎么回退:没有回退。同步之前没发现的误删就找不回来,所以要设删除阈值,并且重要数据另有独立备份,见下面的「备份方案」。

先搞清三件事 ​

层负责什么不提供什么
mergerfs把多块盘的目录合成一个目录视图,按策略决定新文件落在哪块盘,扩容方便不提供冗余。一块成员盘坏了,只丢这块盘上的数据,其余盘不受影响
SnapRAID给多块独立的盘加奇偶校验,坏盘后能恢复,scrub 能发现静默损坏不是实时的,同步后才受保护;不防同步之后的误删
备份独立的另一份副本,防误删、勒索和整机损坏要单独做

mergerfs 和 SnapRAID 是两个独立的插件,互不依赖,但常常搭配使用:mergerfs 管「看起来是一个目录」,SnapRAID 管「坏盘能救」。

磁盘规划 ​

角色数量要求
系统盘1 块小 SSDOMV 独占,不放数据
数据盘若干块,容量可以不同每块单独建 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)里选各块数据盘,先用默认的创建策略 pfrdmergerfs
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。

为什么要把媒体库设成只读? 防止应用、误操作或被入侵的容器改动媒体文件,也减少同步期间的变动。

继续浏览 ​

OpenMediaVault 非官方中文使用指南,与 openmediavault 项目及其开发者无隶属关系。