ブロックの複製

ブロック複製操作は、アプリケーションの代わりにファイル バイトの範囲をコピーするようにファイル システムに指示します。 宛先ファイルは、ソース ファイルと同じでも、異なるものでもかまいません。

ファイル システムはクラスターとエクステントのマッピングを管理し、基になるファイル データの読み取りと書き込みではなく、仮想クラスター番号 (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 に設定できます。 クラスター サイズは、フォーマット時に設定されるボリューム全体のパラメーターです。

制限事項と備考

  • ソースリージョンと移行先リージョンは、クラスター境界で開始および終了する必要があります。
  • 複製される領域は、4 GB 未満の長さにする必要があります。
  • コピー先のリージョンは、ファイルの末尾を超えて拡張することはできません。 アプリケーションで複製されるデータのコピー先を拡張する必要がある場合は、最初に SetEndOfFile を呼び出す必要があります。
  • コピー元とコピー先の領域が同じファイルに含まれている場合、それらの領域は重複してコピーされません (アプリケーションでは、ブロック複製操作を、重複しなくなった複数のブロック クローンに分割することで続行できる場合があります)。
  • コピー元とコピー先のファイルは、同じ ReFS ボリューム上にある必要があります。
  • ソース ファイルと変換先ファイルの整合性ストリーム設定は同じである必要があります (つまり、両方のファイルで整合性ストリームを有効にするか、両方のファイルで無効にする必要があります)。
  • コピー元のファイルがスパース ファイルである場合は、コピー先のファイルもスパース ファイルであることが必要です。
  • ブロック複製操作は、共有日和見ロック (レベル 2 の日和見ロックとも呼ばれます ) を中断します
  • 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 がクラスターよりも大きい場合、変更されたクラスターのみが複製され、残りの部分は共有されたままになることに注意してください。

DUPLICATE_EXTENTS_DATA

FSCTL_DUPLICATE_EXTENTS_TO_FILE