块克隆操作指示文件系统代表应用程序复制一系列文件字节。 目标文件可能与源文件相同或不同。
文件系统管理群集和盘区的映射,并且通过将虚拟群集号(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。 群集大小是在格式时设置的卷范围参数。
群集大小和性能影响
ReFS 卷的群集大小直接影响块克隆行为和性能特征:
- 默认群集大小:4KB(建议用于大多数工作负荷)
- 备用群集大小:64KB(适用于大型顺序 I/O 工作负荷)
群集大小决定块级克隆和写时复制操作发生的粒度。 对与另一个文件共享群集的文件区域(在块克隆后)进行写入时,ReFS 使用在群集级别运行的分配写入机制:
- 仅复制修改后的群集并将其写入到新的物理位置
- 同一区域中未修改的群集仍保持共享状态
- 无论块克隆是通过 FSCTL_DUPLICATE_EXTENTS_TO_FILE 显式启动还是由系统自动启动(Windows 11 Moment 5 及更高版本),此行为都适用。
性能注意事项
选择群集大小对性能和空间消耗有重要影响:
- 4KB 群集:为具有小型随机写入(KB 到 MB 范围)的工作负荷提供更好的空间效率,因为每个修改的群集仅复制 4KB。 但是,这可能会导致写时复制操作更频繁。
- 64KB 群集:减少元数据开销并提高顺序 I/O 性能,但即使写入小于 64KB,每次写入共享区域都可能导致最多复制 64KB。
群集大小在格式化时确定,且无法在不重新格式化该卷的情况下进行更改。 若要检查 ReFS 卷的当前群集大小,请使用以下命令:
fsutil fsinfo refsinfo <volume>
对于由 Windows 自动格式化的卷(例如默认启用块克隆功能的情况),系统将使用4KB的默认群集大小,除非在创建卷时有其他明确的设置。
限制和备注
- 源区域和目标区域必须在群集边界处开始和结束。
- 克隆区域的长度必须小于 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 大于群集,则仅复制修改后的群集,其余部分将保持共享状态。
写入时复制行为
分配写入机制在群集级别运行,这对性能和空间消耗具有重要影响:
- 写入小于群集大小:向共享群集写入任何大小的数据(甚至 1 字节)都会导致整个群集被复制。 使用默认的 4KB 群集大小,对共享区域的 1KB 写入会导致复制 4KB。
- 跨越多个群集的写入:如果写入跨越多个群集,则仅复制修改的群集。 例如,包含 4KB 群集的 8KB 写入将重复 2 个群集(共 8KB),而 64KB 群集的 8KB 写入将重复 1 个群集(总计 64KB)。
- 大型顺序写入:对于在克隆后经常修改大型连续区域的工作负载,较大的簇大小(64KB)可能通过减少写时复制操作的数量来降低开销。
此集群级别的粒度适用于块克隆后的所有写入,包括在 Windows 11 Moment 5 及更高版本中,在复制作业期间自动执行块克隆的场景。