CPのCopy on Writeメカニズムを実装するファイルシステムはありますか?

CPのCopy on Writeメカニズムを実装するファイルシステムはありますか?

私たちは、プロセスを分岐するときに、オペレーティングシステムが書き込み中にコピー最適化を実行するのを見ました。これは、ほとんどの場合、execがフォークの前に来るため、不要なページ割り当てや呼び出し元のアドレス空間でデータコピーコストが発生したくないためです。

もしそうなら、ext4またはxfs(ジャーナリング)ファイルシステムを使用してLinuxでCPを実行しても、これは起こりますか?もしそのようなことが起こらないとしたら、なぜできないのでしょうか?

答え1

~からcp マニュアルページ:

--reflink [= always]を指定すると、変更されたときにのみデータブロックがコピーされる軽量コピーが実行されます。これが不可能な場合は、コピーが失敗するか、--reflink = autoが指定されている場合は標準コピーに置き換えられます。

これはサポートされているファイルシステムで機能します。書き込み中のコピーフォワードリンク)、現在は主にBTRFSです。 XFSリフリンク実装が開発中です。 [1][2]

答え2

検索するキーワードはですreflink。最近、XFSで実装されました。

編集:XFS実装はもともと実験的なものとしてマークされました。上記の内容を書いてから数ヶ月後、この警告はカーネルバージョン4.16から削除されました:-)。

答え3

Linuxには、ユーザースペースプロセスがファイルを書き込むときにファイルのコピーを作成するようにカーネルに指示できるシステムコールがあります。 FICLONERANGEおよびFICLONEは、書き込み中にファイルとファイル内の範囲をコピーできるようにするioctlオプションとして使用されます。

cp --reflinkこれを使用してファイルシステムベースのコピーを作成します。

答え4

システムコールを導入しない限り(または少なくともブロックをコピーしない限り)、オペレーティングシステムは、プログラムが書き込んでいるデータが他のブロックから読み取ったばかりのデータと等しいかどうかをcp判断するのは困難です。cpさらに、「同じブロックを共有する複数のファイル」シナリオを管理するには、追加のオーバーヘッドが必要です。ほんの数ブロックだけで、大きくて類似したファイルはほとんど発生しません。したがって、全体的にこれらのチャンクをコピーして管理オーバーヘッドみんな文書。

BTRFSにファイルシステムの別のレプリカ/スナップショットを追加してファイル(多くのファイル)を「コピー」すると、状況が異なります。今「コピー」されています。みんなファイルシステムのファイルとそのファイルに対するすべての変更は、書き込み時にコピーされます。これは存在しますが、ext4にはありません。

「日記」は完全に独立した概念で、重要なのはファイルの管理構造です。

関連情報