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