瞬间抓取文件系统状态、既能快速恢复又近乎零成本的机制

ZFS 快照给文件系统一个回退键

ZFS 快照就是给某个数据集在某个 transaction group 上的块树起的一个名字。它不复制任何东西、不冻结任何东西,代价只是几个元数据块:zfs snapshot tank/data@before-upgrade 会在 shell 提示符重画完之前就返回。由于 ZFS 从不原地覆盖仍在使用的块,旧块树在磁盘上一直有效,直到最后一个引用消失——而快照就是这个引用。 正是这一点让“一墙的每日历史”变得可行,也正是本文标题最危险的地方。快照给你数据的许多个版本,却不给你“池不会丢”这件事的保障。tank/data 的每一份快照都住在 tank 里,所以带走池的那次故障,会在同一瞬间带走数据集和它的全部历史。多版本与多版本安全是两种不同的性质,后者只能由复制来提供。 为一个一致的树命名 快照建立在 transaction group 边界上,所以它捕获的树内部自洽——数据库的文件与元数据冻结在同一瞬间,而不是相差几微秒。-r 会连同所有后代数据集一起打快照,凡是有子数据集的地方都该这么用;否则一个递归布局会在不同层级留下时间不同的快照,层与层之间的增量复制就变得别扭。 名字由你决定,而它是保留策略唯一的抓手:tank/data@daily-2026-09-16 可以按模式清理,自动生成的名字则需要额外记账。zfs list -t snapshot -o name,used,refer,creation -s creation 列出整个快照集以及每一份钉住的空间。 空间在哪里:zfs list -o space ZFS 用一组列来回答唯一重要的问题:这是谁的数据?zfs list -o space tank/data 会给出 USED、USEDSNAP、USEDDS、USEDREFRESERV、USEDCHILD、REFER 与 AVAIL。REFER 是数据集自身需要的量,USEDSNAP 是快照钉住的量,USED 是二者之和。USEDSNAP 持续上涨而 REFER 保持不变,说明吃掉池子的是快照,不是数据。具体到某一份快照,used 是它单独钉住的块,refer 是它能引用到的全部块,两者之差正是与其他版本共用的那部分。 ...

三月 21, 2028 · 1 分钟 · XB Field Notes