跳转到内容

Btrfs:多盘、快照与数据校验 ​

读完这一篇,你能在 OMV 里创建单盘或多盘的 Btrfs,知道创建表单里默认选中的是无冗余的 RAID0,并且清楚 OMV 替你做了哪些事:把新共享文件夹建成子卷、给 Samba 加快照支持、每月自动 scrub、每天检查错误计数。

Btrfs 能给你什么 ​

  • 数据校验:数据和元数据都有校验和,静默损坏能被发现。有冗余副本(例如 RAID1)时,scrub 会自动用好的那份修复坏的那份;单副本只能发现,不能修复。
  • 子卷与快照:共享文件夹可以建成子卷,对它做快照。
  • 多盘支持:创建时可以选 Single、DUP、RAID0、RAID1、RAID10,不必另外配软件 RAID。

代价:功能更复杂,空间统计不直观,出问题时的修复手段也比 EXT4 更需要经验。快照和校验都在同一套硬盘上,不能替代独立备份。 选 Btrfs 还是别的,见选择文件系统。

创建时怎么选配置 ​

在 存储器 → 文件系统(Storage → File Systems)点加号,选 BTRFS,表单有三个字段:类型(只读)、介绍(Profile,官方中文把它译成了「介绍」)、设备(可多选)。配置选项在界面里显示英文原文:

配置最少盘数说明
Single1数据只存一份,元数据自动用 DUP(存两份)。单盘选这个。多块盘选 Single 没有任何冗余,坏一块通常就无法正常挂载,不推荐
DUP1数据和元数据都在同一块盘上存两份,只防局部坏扇区,不防整块盘坏,容量减半
RAID02条带,没有冗余,任何一块盘坏了全部数据都没了
RAID12每份数据存两个副本,放在不同的盘上,能承受一块盘坏,容量约为总量的一半
RAID104镜像加条带,界面要求至少 4 块盘

数据和元数据用同一种配置(Single 例外)。没有 RAID5/6:Btrfs 官方文档把 RAID5/6 标为不稳定,只建议用于测试,所以界面不提供。

创建 Btrfs 会清空所有选中的盘,而且「介绍」默认选中的是 RAID0

影响范围:你在设备里选中的每一块盘都会被整块擦除,Btrfs 直接建在整块盘上,不分区。

RAID0 是表单的默认值:如果你只看到「设备」就点了保存,建出来的是没有冗余的条带,坏一块盘全部数据都没了。每次创建都先看一眼「介绍」选的是什么。

前置条件:

  • 按型号、序号和容量核对过每一块盘,不是靠设备名。
  • 盘上没有需要保留的数据。
  • 两块盘以上建 RAID1 时,之后有独立备份。

怎么回退:不能。创建后原数据视为丢失。第一次做,先用测试盘演练。

操作步骤 ​

  1. 在 存储器 → 磁盘(Storage → Disks)对每块成员盘做快速擦除,并记下型号、序号和容量。盘上有旧标记时,它不会出现在候选列表里。
  2. 打开 存储器 → 文件系统,点加号,选 BTRFS。
  3. 选好介绍,在设备里勾选成员盘。盘数不够时表单会提示,例如选 RAID1 少于两块会显示「至少需要两台设备」。
  4. 点保存,等任务窗口完成,关闭后会跳到挂载页。
  5. 在挂载页文件系统下拉框里选它。多块盘组成的 Btrfs 只出现一项,不是每块盘一项。保存,再点页面顶部黄色提示条上的应用。

OMV 对 Btrfs 做了什么 ​

项目行为
挂载选项defaults,nofail,盘是固态盘时自动加 ssd。压缩、自动碎片整理默认都不开,界面里也没有开关
新建共享文件夹在 Btrfs 上新建共享文件夹,且那个目录还不存在时,OMV 把它建成子卷。已经存在的普通目录不会被转成子卷
共享文件夹快照只有子卷形式的共享文件夹才能快照,入口在 存储器 → 共享文件夹(Storage → Shared Folders)的工具栏,教程见共享文件夹快照
SambaBtrfs 上的共享自动启用 btrfs 和 shadow_copy2 模块(让 Windows 的「以前的版本」能列出快照),容量统计用 omv-btrfs-dfree(按 Btrfs 的数据副本比例折算),设置了 Time Machine 容量上限时除外
每月 scrubcron.monthly 里的 omv-btrfs-scrub 对每个已挂载的 Btrfs 做一次 scrub
每日错误检查cron.daily 里运行 btrfs device stats --check --reset,有非零的错误计数就写系统日志并发邮件。--reset 会在读取后清零计数器,同一批错误只会提醒一次
配额OMV 界面不支持 Btrfs 的配额,见磁盘配额

Scrub 会通读整个文件系统,核对所有数据和元数据的校验和,是一次很吃磁盘 I/O 的任务,期间 NAS 的读写会变慢,大容量盘上可能持续数小时。scrub 的邮件报告和错误计数告警,要求系统邮件通知已开启,并且 系统 → 通知 → 事件(System → Notification → Events)里的「杂项」打开。

想把 scrub 改成每周,或者关掉自动执行,用环境变量,不用改 cron:

环境变量默认作用
OMV_BTRFS_SCRUB_ENABLEDyes设成 no 关闭自动 scrub
OMV_BTRFS_SCRUB_PERIODmonthly设成 weekly 改为每周
OMV_BTRFS_ERROR_CHECK_ENABLEDyes每日错误计数检查

设置方法见环境变量。

查看状态 ​

选中 Btrfs 文件系统,点显示详情,页面依次给出 btrfs filesystem show、btrfs filesystem df、btrfs device stats(I/O 错误统计)和 btrfs scrub status 四段输出。

想手动 scrub 并读结果,在 OMV 的 shell(SSH 或本机控制台,以 root 身份)执行:

sh
omv-btrfs-scrub
btrfs scrub status /srv/dev-disk-by-uuid-<UUID>

omv-btrfs-scrub 是 OMV 自带的脚本,会按顺序对每个已挂载的 Btrfs 做 scrub 并输出报告。更多维护操作见 Btrfs 维护。

检查结果 ​

  1. 文件系统 页里,这一项的类型是 BTRFS,已挂载打勾,状态是「可用」。
  2. 在 OMV 的 shell 里确认配置和空间,两条都是只读的:
sh
btrfs filesystem usage /srv/dev-disk-by-uuid-<UUID>
btrfs device stats /srv/dev-disk-by-uuid-<UUID>

第一条里 Data 和 Metadata 行显示的配置,应当是你选的;第二条的各项计数都应该是 0。

  1. 新建一个共享文件夹,在 Btrfs 上建一个全新的目录名。之后在 shell 里用 btrfs subvolume list /srv/dev-disk-by-uuid-<UUID> 应该能看到对应的子卷。

常见问题 ​

Windows 里看到的剩余空间和 df 不一样。 Btrfs 的剩余空间受数据副本比例影响,df 本来就不准。OMV 给 Btrfs 的共享用 omv-btrfs-dfree 折算,想看精确值用 btrfs filesystem usage。

能在 Btrfs 上直接开压缩吗。 可以,但需要通过挂载选项(例如 compress=zstd)设置,OMV 界面没有这个开关。压缩要消耗 CPU,对已经压缩过的视频和照片收益很小。见文件系统挂载选项与 fstab。

Btrfs 建在了 md 阵列上,scrub 发现了校验错误却修不了。 md 阵列对 Btrfs 来说是单个设备,它只有一份数据,无法自愈。见选择文件系统里的说明。

多盘 Btrfs 坏了一块盘,重启后文件系统没有挂载上。 默认挂载选项下,缺盘的多盘 Btrfs 不会正常挂载(degraded 选项默认关闭),换盘要走降级挂载和 btrfs replace,界面做不到。先读 Btrfs 维护,不要急着重建或重新创建。

能不能把已有的 EXT4 转成 Btrfs。 OMV 不支持就地转换,见选择文件系统。

参考资料 ​

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