ReFS 上的块克隆

适用范围:Windows Server 2022、Windows Server 2019、Windows Server 2016

块克隆将指示文件系统代表应用程序复制一系列文件字节,其中目标文件可能与源文件相同或不同。 遗憾的是,复制操作成本高昂,因为它们会触发对基础物理数据的昂贵读取和写入。

但是,ReFS 中的块克隆可将复制作为一种低成本的元数据操作,而不是在文件数据中读取和写入数据。 由于 ReFS 支持多个文件共享相同的逻辑群集(卷上的物理位置),因此复制操作只需将文件所在区域重新映射到单独的物理位置,从而将昂贵的物理操作转换为快速的逻辑操作。 这样可以更快地完成复制,并减少对基础存储的输入/输出。 这种改进还能使虚拟化工作负载受益,因为使用块克隆操作时,.vhdx 检查点合并操作会大幅加速。 此外,由于多个文件可以共享相同的逻辑群集,因此不会多次以物理方式存储相同的数据,从而提高存储容量。

工作原理

ReFS 上的块克隆会将文件数据操作转换为元数据操作。 为了进行此优化,ReFS 会将引用计数引入其复制区域的元数据中。 此引用计数将记录引用相同物理区域的不同文件区域数。 这样,多个文件就可以共享相同的物理数据:

Show reference count updates when multiple files reference same region

通过保留每个逻辑群集的引用计数,ReFS 不会打破文件之间的隔离:对共享区域的写入会触发写入分配机制,此时 ReFS 将为传入的写入分配一个新区域。 此机制可保留共享逻辑群集的完整性。

示例

假设有两个文件 X 和 Y,其中每个文件由三个区域组成,每个区域映射到单独的逻辑群集。

Two files each with three distinct regions which all map to regions that have ref count 1

现在,假设应用程序发出一个从文件 X 到文件 Y 的块克隆操作,将区域 A 和 B 复制到区域 E 和 F。将产生以下文件系统状态:

Reference count shows 2 for blocked clone region

此文件系统状态表明成功复制了块克隆区域。 由于 ReFS 仅通过将 VCN 更新到 LCN 映射来执行此复制操作,因此未读取任何物理数据,也不会覆盖文件 Y 中的物理数据。 文件 X 和 Y 现在共享逻辑群集,如表中的引用计数所示。 由于没有以物理方式复制任何数据,ReFS 可减少卷上的容量消耗。

现在,假设应用程序尝试覆盖文件 X 中的区域 A。ReFS 将复制该共享区域,相应地更新引用计数,并对新复制的区域执行传入写入。 这可确保保留文件之间的隔离。

Isolation preserved by writing to a new region G and updating ref counts

在修改写入后,区域 B 仍由两个文件共享。 请注意,如果区域 A 大于群集,则仅复制修改后的群集,其余部分将保持共享状态。

功能限制和备注

  • 源和目标区域必须在某个群集边界开始和结束。
  • 克隆区域的长度必须小于 4GB。
  • 可映射到同一物理区域的文件区域的最大数目为 8175。
  • 目标区域不得超过文件的末尾。 如果应用程序希望扩展具有克隆数据的目标,则它必须首先调用 SetEndOfFile
  • 如果源区域和目标区域位于同一文件中,则它们不得重叠。 (应用程序或许可通过将块克隆操作拆分为多个不再重叠的块克隆来继续操作)。
  • 源文件和目标文件必须位于同一 ReFS 卷上。
  • 源文件和目标文件必须具有相同的完整性流设置。
  • 如果源文件为稀疏文件,则目标文件也必须为稀疏文件。
  • 块克隆操作将破坏共享机会锁(也称作 2 级机会锁)。
  • ReFS 卷必须已使用 Windows Server 2016 进行了格式化;此外,如果正在使用故障转移群集,则在格式化时群集功能级别必须已是 Windows Server 2016 或更高版本。

其他参考