block clone 操作は、アプリケーションの代わりにファイル バイトの範囲をコピーするようにファイル システムに指示します。 宛先ファイルは、ソース ファイルと同じでも、異なるものでもかまいません。
ファイル システムは、 クラスターとエクステントのマッピングを管理し、基になるファイル データの読み取りと書き込みではなく、仮想クラスター番号 (VCN) を低コストのメタデータ操作として論理クラスター番号 (LCN) マッピングに変更することでコピーを実行できます。 これにより、コピーをより高速に完了でき、基になるストレージへの I/O が少なくなります。 さらに、ブロッククローンの後に複数のファイルが論理クラスターを共有できるようになり、同じクラスターをディスクに複数回保存しないことで容量を節約できます。
ブロック複製操作は、ファイル間で提供される分離を中断しません。 ブロック複製が完了すると、ソース ファイルへの書き込みがコピー先に表示されず、その逆も同様になります。
ブロックの複製は、Windows Server 2016 以降の ReFS ファイル システム の種類でのみ使用できます。 Windows クライアントおよび Windows Server ビルドの Windows 11 Moment 5 更新プログラム (KB5034848) 以降、ブロックの複製は、サポートされている Windows コピー操作でネイティブに行われます。
ReFS でのブロック複製
Windows Server 2016 以降、ReFS では、ソース リージョンから宛先リージョンに論理クラスター (つまり、ボリューム上の物理的な場所) を再マップすることによってブロック複製が実装されます。 次に、書き込み時の割り当てメカニズムを使用して、これらのリージョン間の分離を確保します。 ソースリージョンとコピー先リージョンは、同じファイルまたは異なるファイル内にある場合があります。
この実装では、開始ファイルと終了ファイルのオフセットをクラスターの境界に合わせる必要があります。 Windows Server 2016 以降の ReFS では、クラスターのサイズは既定で 4 KB ですが、必要に応じて 64 KB に設定できます。 クラスター サイズは、フォーマット時に設定されるボリューム全体のパラメーターです。
クラスターのサイズとパフォーマンスへの影響
ReFS ボリュームのクラスター サイズは、ブロックの複製動作とパフォーマンス特性に直接影響します。
- 既定のクラスター サイズ: 4 KB (ほとんどのワークロードに推奨)
- 代替クラスター サイズ: 64 KB (大規模な順次 I/O ワークロードに適)
クラスター サイズによって、ブロックの複製と書き込み時のコピー操作が行われる粒度が決まります。 クラスターを別のファイルと共有するファイル領域に書き込みが行われると (ブロッククローンの後)、ReFS はクラスター レベルで動作する書き込み時の割り当てメカニズムを使用します。
- 変更されたクラスターのみが複製され、新しい物理的な場所に書き込まれます
- 同じリージョン内の変更されていないクラスターは共有されたままになります
- この動作は、ブロックの複製が FSCTL_DUPLICATE_EXTENTS_TO_FILE 経由で明示的に開始されたか、システムによって自動的に開始されたかに関係なく適用されます (Windows 11 Moment 5 以降)
パフォーマンスに関する考慮事項
クラスター サイズの選択は、パフォーマンスと領域の消費に重要な影響を与えます。
- 4 KB クラスター: 変更されたクラスターごとに 4 KB のみが複製されるため、小規模でランダムな書き込み (KB から MB の範囲) でワークロードの領域効率が向上します。 ただし、その結果、書き込み時のコピー操作が頻繁に行われる可能性があります。
- 64 KB クラスター: メタデータのオーバーヘッドを削減し、順次 I/O パフォーマンスを向上させますが、書き込みが 64 KB より小さい場合でも、共有リージョンへの書き込みごとに最大 64 KB が重複する可能性があります。
クラスターサイズはフォーマット時に決定され、ボリュームを再フォーマットしないと変更できません。 ReFS ボリュームの現在のクラスター サイズを確認するには、次のコマンドを使用します。
fsutil fsinfo refsinfo <volume>
Windows によって自動的にフォーマットされたボリューム (ブロックの複製が既定で有効になっている場合など) の場合、システムはボリュームの作成時に明示的に構成しない限り、4 KB の既定のクラスター サイズを使用します。
制限事項と備考
- ソースリージョンと移行先リージョンは、クラスター境界で開始および終了する必要があります。
- 複製される領域は、4 GB 未満の長さにする必要があります。
- コピー先のリージョンは、ファイルの末尾を超えて拡張することはできません。 アプリケーションで複製されるデータのコピー先を拡張する必要がある場合は、最初に SetEndOfFile を呼び出す必要があります。
- コピー元とコピー先の領域が同じファイルに含まれている場合、それらの領域は重複してコピーされません (アプリケーションでは、ブロック複製操作を、重複しなくなった複数のブロック クローンに分割することで続行できる場合があります)。
- コピー元とコピー先のファイルは、同じ ReFS ボリューム上にある必要があります。
- ソース ファイルと変換先ファイルの 整合性ストリーム 設定は同じである必要があります (つまり、両方のファイルで整合性ストリームを有効にするか、両方のファイルで無効にする必要があります)。
- コピー元のファイルがスパース ファイルである場合は、コピー先のファイルもスパース ファイルであることが必要です。
- ブロック複製操作は、共有日和見ロック ( Level 2 Opportunistic Locks とも呼ばれます) を解除します。
- ReFS ボリュームは Windows Server 2016 以降でフォーマットされている必要があります。また、Windows フェールオーバー クラスタリングが使用されている場合、クラスタリング機能レベルはフォーマット時に Windows Server 2016 以降である必要があります。
例
X と Y という 2 つのファイルがあり、各ファイルは 3 つの異なる領域で構成されるとします。 各ファイル領域は、ボリュームの個別のリージョンに格納されます。 ファイル システムは、これらの各ボリューム領域が 1 つのファイル領域で参照されるという知識を格納します。
次に、アプリケーションがファイル X からファイル領域 A と B に対してブロック複製操作を、現在の E のオフセットにあるファイル Y に発行したとします。 次のファイル システムの状態が発生します。
リージョン 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 バイトも) により、クラスター全体が複製されます。 既定の 4 KB クラスター サイズでは、共有リージョンに 1 KB の書き込みが行われると、4 KB がコピーされます。
- 複数のクラスターにまたがる書き込み: 書き込みが複数のクラスターにまたがる場合、変更されたクラスターのみが複製されます。 たとえば、4 KB クラスターを含む 8 KB の書き込みでは 2 つのクラスター (合計 8 KB) が重複し、同じ 8 KB の書き込みでは 64 KB クラスターが 1 つのクラスター (合計 64 KB) が重複します。
- 大規模なシーケンシャル書き込み: 複製後に大規模な連続したリージョンを頻繁に変更するワークロードの場合、クラスター サイズ (64 KB) を大きくすると、書き込み時のコピー操作の数が最小限に抑えられ、オーバーヘッドが削減される可能性があります。
このクラスター レベルの粒度は、Windows 11 Moment 5 以降がコピー操作中にブロックの複製を自動的に実行するシナリオを含め、ブロックの複製後のすべての書き込みに適用されます。