ReFS 上的块克隆
块克隆将指示文件系统代表应用程序复制一系列文件字节,其中目标文件可能与源文件相同或不同。 遗憾的是,传统的复制操作成本高昂,因为它们会触发对基础物理数据的昂贵读取和写入。
但是,ReFS 中的块克隆可将复制作为一种低成本的元数据操作,而不是在文件数据中读取和写入数据。 由于 ReFS 支持多个文件共享相同的逻辑群集(卷上的物理位置),因此复制操作只需将文件所在区域重新映射到单独的物理位置,从而将昂贵的物理操作转换为快速的逻辑操作。 这样可以更快地完成复制,并减少对基础存储的输入/输出。 这一改进也有利于虚拟化工作负载,因为使用块克隆操作时,.vhdx
检查点合并操作会大大加速。 此外,由于多个文件可以共享相同的逻辑群集,因此不会多次以物理方式存储相同的数据,从而提高存储容量。
工作原理
ReFS 上的块克隆会将文件数据操作转换为元数据操作。 为了进行此优化,ReFS 会将引用计数引入其复制区域的元数据中。 此引用计数将记录引用相同物理区域的不同文件区域数。 这样,多个文件就可以共享相同的物理数据:
通过保留每个逻辑群集的引用计数,ReFS 不会打破文件之间的隔离:对共享区域的写入会触发写入分配机制,此时 ReFS 将为传入的写入分配一个新区域。 此机制可保留共享逻辑群集的完整性。
示例
假设有两个文件 X 和 Y,其中每个文件由三个区域组成,每个区域映射到单独的逻辑群集。
现在,假设应用程序发出一个从文件 X 到文件 Y 的块克隆操作,将区域 A 和 B 复制到区域 E 和 F。将产生以下文件系统状态:
此文件系统状态表明成功复制了块克隆区域。 由于 ReFS 仅通过将 VCN 更新到 LCN 映射来执行此复制操作,因此未读取任何物理数据,也不会覆盖文件 Y 中的物理数据。 文件 X 和 Y 现在共享逻辑群集,如表中的引用计数所示。 由于没有以物理方式复制任何数据,ReFS 可减少卷上的容量消耗。
现在假设应用程序尝试覆盖文件 X 中的区域 A。ReFS 复制共享区域,适当地更新引用计数,并对新复制的区域执行传入写入。 这可确保保留文件之间的隔离。
在修改写入后,区域 B 仍由两个文件共享。 如果区域 A 大于群集,则仅复制修改后的群集,其余部分将保持共享状态。
功能限制和备注
- 源和目标区域必须在某个群集边界开始和结束。
- 克隆区域的长度必须小于 4 GB。
- 可映射到同一物理区域的文件区域的最大数目为 8175。
- 目标区域不得超过文件的末尾。 如果应用程序希望扩展具有克隆数据的目标,则它必须首先调用 SetEndOfFile。
- 如果源区域和目标区域位于同一文件中,则它们不得重叠。 (应用程序或许可通过将块克隆操作拆分为多个不再重叠的块克隆来继续操作)。
- 源文件和目标文件必须位于同一 ReFS 卷上。
- 源文件和目标文件必须具有相同的完整性流设置。
- 如果源文件为稀疏文件,则目标文件也必须为稀疏文件。
- 块克隆操作会破坏共享机会锁(也称为 2 级机会锁)。
- ReFS 卷必须已使用 Windows Server 2016 进行格式化;如果正在使用故障转移群集,则群集功能级别在格式化时必须为 Windows Server 2016 或更高版本。
- 从 Windows 11 24H2 和 Windows Server 2025 内部版本开始,块克隆在受支持的 Windows 复制操作中本机发生。