跳转到内容

共享文件夹快照(Btrfs) ​

完成后,你能在几秒内给一个共享文件夹拍一张「瞬间照片」,也能让 OMV 每小时、每天自动拍;误删、误改之后,从快照里把文件找回来。快照采用写时复制,只占变化部分的空间。

但快照和源数据在同一个文件系统里:硬盘坏了、文件系统损坏了,快照一起没。它是快速回滚的手段,不是备份。

哪些共享文件夹能拍快照 ​

条件说明
文件系统是 BtrfsEXT4、XFS 等没有这个功能,ZFS 请看 ZFS 插件
共享文件夹本身是 Btrfs 子卷在 Btrfs 上新建共享文件夹时,如果相对路径还不存在,OMV 会把它建成子卷;已经存在的普通目录不是子卷
它自己不是快照由快照创建出来的共享文件夹不能再拍快照

判断方法:打开 存储器 → 共享文件夹(Storage → Shared Folders),选中一个共享文件夹,工具栏里的快照(Snapshots,相机图标)能点,就说明支持。灰色就是不满足上面的条件。Btrfs 的创建与特性见 Btrfs:多盘、快照与数据校验。

快照存在哪里 ​

快照保存在这块 Btrfs 文件系统挂载点下的 .snapshots 目录里,挂载点形如 /srv/dev-disk-by-uuid-<UUID>。它在文件系统根上,不在共享文件夹里面,所以 SMB 客户端看不到它。命名规则:

来源名称
手动创建<共享文件夹名>_<日期>T<时间>,例如 photos_20261023T210500
计划任务创建<共享文件夹名>@<hourly、daily、weekly、monthly 或 yearly>_<日期>T<时间>

自动清理靠这个命名规则识别快照的类型。不要手工改名,也不要在 .snapshots 里放别的东西。

手动拍快照 ​

  1. 在 存储器 → 共享文件夹 选中共享文件夹,点 快照。
  2. 在 快照(Snapshots)标签页点 创建(Create),列表里出现一条新快照,名称和创建时间都在表里。

列表里默认还有 引用(Referenced)列,表示这个快照是否被当作共享文件夹使用。ID、UUID、路径等列默认隐藏。

计划快照 ​

  1. 在同一个页面切到 计划任务(Scheduled Tasks)标签页。
  2. 点创建按钮,在菜单里选 每小时、每天、每周、每月 或 每年。
  3. OMV 会生成一条 root 用户的计划任务,命令是 btrfs subvolume snapshot,开启邮件通知,标签形如 Snapshot,Daily,<共享文件夹名>。它也会出现在 系统 → 计划任务(System → Scheduled Tasks)里,可以在那里编辑或删除,见计划任务。

这些任务用的是 cron 的 @hourly、@daily 之类的固定时刻。机器在那个时刻是关着的,这次就不会拍。不是 24 小时开机的 NAS 请注意这一点,或者用 omv-extras 的 anacron 插件,见小工具合集。

自动清理 ​

不清理的话,快照会一直增加,写入和删除会越来越占空间。清理设置在 存储器 → 共享文件夹 工具栏分隔线之后的 所有快照(All Snapshots)页面,设置(Settings)标签页:

字段新装系统显示的值含义
启用自动快照清理以界面为准见下面的说明
保留时段(Retention period)1800 秒刚创建的快照在这段时间内不会被清理
限制自定义10保留最新的 10 个手动快照
限制每小时24保留最新的 24 个 hourly 快照
限制每天7保留最新的 7 个 daily 快照
限制每周4保留最新的 4 个 weekly 快照
限制每月12保留最新的 12 个 monthly 快照
限制每年1保留最新的 1 个 yearly 快照

清理由 /etc/cron.hourly/openmediavault-cleanup_sf_snapshots 每小时调用一次 omv-sfsnapadm cleanup。规则按每个共享文件夹、每一类分别计算:每类只保留最新的 N 个,更旧的删除;正被当作共享文件夹使用的快照会跳过。某一类设为 0,表示这一类超过保留时段的快照一个都不留。

「启用」的默认值有两种说法:全新安装时数据库模板里它是启用的,从 OMV 6.4 之前升级上来的系统里迁移脚本把它设为关闭,所以以你界面上的显示为准。

快照不是备份,手动快照也会被自动清理

  • 影响范围:快照和源数据在同一个文件系统里,硬盘坏、文件系统损坏、误格式化、整机丢失时快照一起消失。自动清理打开时,手动快照也算「自定义」一类,超过 10 个之后最旧的会被删掉,不是你想留多久就留多久。大量删除或改写数据后,被快照引用的空间不会释放,文件系统可能比你预想的更快写满。
  • 前置条件:快照要和独立备份配合,把重要数据另外复制出去,见备份策略。想长期保留某个时间点的数据,别靠手动快照,把它复制到另一个文件系统,或者交给备份工具。
  • 怎么回退:删掉的快照无法恢复。清理前可以先预演:在 OMV 的 shell 里以 root 身份执行 omv-sfsnapadm -v cleanup --simulate,它只列出会删哪些,不会真的删。自动清理处于关闭状态时,它只会提示已停用。

从快照找回文件 ​

OMV 没有提供一键「回滚整个共享文件夹」。官方有意没有实现,原因是回滚前要先让所有服务取消对这个共享文件夹的引用,容易出错;官方的做法是用快照创建一个新的共享文件夹。常用的找回方式有三种。

方式一:Windows 的「以前的版本」 ​

共享文件夹在 Btrfs 上时,OMV 生成的 Samba 配置会启用 shadow_copy2,识别 .snapshots 里符合命名规则的快照。在 Windows 资源管理器里对文件或文件夹右键,打开属性里的以前的版本,应该能看到各个快照时间点,可以打开、复制或还原。macOS 和 Linux 客户端没有这个功能。这一点依据 OMV 的更新记录和 Samba 配置模板,本站未在实机上验证。

方式二:把快照「分享」出来 ​

  1. 在快照列表里选中一个快照,点 分享(Share)。已被引用的快照这个按钮是灰的。
  2. OMV 用这个快照创建一个新的共享文件夹,名称就是快照名,备注是 Snapshot,<原共享文件夹名>,<创建时间>,权限沿用原共享文件夹。
  3. 给它开 SMB 共享,或在 shell 里直接复制,把需要的文件取回。快照是可写的,要防止误改,可以在 SMB 共享里勾选只读。
  4. 用完之后,先在所有引用它的服务里取消引用,再删除这个共享文件夹,最后在快照列表里按需删除快照。

方式三:在 OMV 的 shell 里复制 ​

以 root 身份,在 OMV 的 shell 执行。先看有哪些快照:

sh
ls /srv/dev-disk-by-uuid-<UUID>/.snapshots/

再把需要的文件复制到另一个目录,核对无误后再放回原处,不要直接覆盖现有文件:

sh
cp -a /srv/dev-disk-by-uuid-<UUID>/.snapshots/<快照名>/<共享内的相对路径> <临时目录>/

omv-sfsnapadm list 可以列出所有快照的 ID、共享文件夹、名称、类型和创建时间,是只读命令。

注意:Btrfs 快照不包含嵌套的子卷,快照里这些位置会是空目录。

删除快照 ​

在快照列表选中后点删除。被当作共享文件夹使用的快照不能删,先取消引用。Btrfs 回收空间是后台进行的,删除后 df 不一定立刻回落。

检查结果 ​

用一个测试共享文件夹走一遍,不要拿真实数据试:

  1. 在 Btrfs 文件系统上新建一个共享文件夹(相对路径用一个还不存在的名字),确认 快照 按钮可点。
  2. 从电脑往里放一个测试文件,手动创建快照。
  3. 删掉测试文件,用上面任意一种方式把它从快照里取回,打开确认内容完整。
  4. 再建一个计划任务,到 系统 → 计划任务 里确认它出现了,选中点 运行 手动执行一次,快照列表里应该多出一个 @daily 之类名称的快照。
  5. 清理测试用的快照、计划任务和共享文件夹。

常见问题 ​

快照按钮是灰的。 文件系统不是 Btrfs,或者共享文件夹不是子卷(路径在建共享之前就已经存在),或者它本身是个快照。解决办法是在 Btrfs 上用一个新路径重新建共享文件夹,再把数据复制进去。

计划快照没有生成。 机器在计划时刻是关机状态;或者任务没有启用;到 系统 → 计划任务 里选中任务手动运行,看输出里的错误。

文件系统快满了,但文件没有那么多。 快照还引用着已删除的数据。在 存储器 → 共享文件夹 → 所有快照 里看有多少快照,调小保留数量或手动删除旧快照。在 OMV 的 shell 里以 root 身份运行只读的 btrfs filesystem usage /srv/dev-disk-by-uuid-<UUID> 查看。

「以前的版本」里没有快照。 确认共享文件夹在 Btrfs 上,快照名称符合上面的命名规则,并且已经应用了 SMB 的配置更改。

参考资料 ​

  • OMV 源码:omv-sfsnapadm,共享文件夹快照的 RPC 在 engined/rpc/sharemgmt.inc。
  • OMV 更新记录(debian/changelog)中关于子卷、快照管理界面、SMB 影子副本的条目。

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