阻止克隆

块克隆操作指示文件系统代表应用程序复制一系列文件字节。 目标文件可能与源文件相同或不同。

文件系统管理群集和盘区映射,并且通过将虚拟群集号(VCN)更改为逻辑群集号(LCN)映射(LCN),作为低成本的元数据操作,而不是读取和写入基础文件数据,可以执行复制。 这样,副本就可以更快地完成,并将更少的 I/O 生成到基础存储。 此外,多个文件现在可以在块克隆后共享逻辑群集,通过不多次在磁盘上存储相同的群集来节省容量。

块克隆操作不会中断文件之间提供的隔离。 块克隆完成后,写入源文件不会显示在目标中,反之亦然。

块克隆仅适用于从 Windows Server 2016 开始的 ReFS 文件系统 类型。 从 Windows 11 Moment 5 更新(KB5034848)及更高版本的 Windows 客户端和 Windows Server 版本开始,在受支持的 Windows 复制操作中本机发生阻止克隆。

在 ReFS 上阻止克隆

Windows Server 2016 上的 ReFS 通过将逻辑群集(即卷上的物理位置)从源区域重新映射到目标区域来实现块克隆。 然后,它使用分配写入机制来确保这些区域之间的隔离。 源和目标区域可能位于相同或不同的文件中。

此实现要求开始和结束文件偏移量与群集边界对齐。 在 Windows Server 2016 上的 ReFS 中,群集默认大小为 4KB,但可以选择设置为 64KB。 群集大小是在格式时设置的卷范围参数。

限制和备注

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

示例

假设我们有两个文件,即 X 和 Y,其中每个文件由 3 个不同的区域组成。 每个文件区域都存储在卷的不同区域。 文件系统存储其中每个卷区域在一个文件区域中引用的知识:

克隆前

现在,假设应用程序通过文件区域 A 和 B 从文件区域 A 和 B 向文件 Y 发出块克隆操作,该操作位于 E 当前所在的偏移量处。 以下文件系统状态将产生:

克隆后

区域 A 和 B 中的数据通过将 VCN 更改为 ReFS 卷中的 LCN 映射,有效地从文件 X 复制到文件 Y。 磁盘盘区支持区域 A 和 B 未读取,在操作期间,支持旧区域的磁盘盘区 E 和 F 也没有覆盖。

文件 X 和 Y 现在共享磁盘上的逻辑群集。 这反映在表中显示的引用计数中。 与基础卷上复制区域 A 和 B 相比,共享会导致卷容量消耗量降低。

现在,假设应用程序覆盖文件 X 中的区域 A。ReFS 会复制 A 的副本,现在我们将调用 G。ReFS 然后将 G 映射到文件 X,并应用修改。 这可确保保留文件之间的隔离。 引用计数已相应地更新:

修改写入后

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

DUPLICATE_EXTENTS_DATA

FSCTL_DUPLICATE_EXTENTS_TO_FILE