任意のファイルシステムがCPのコピーオンライトメカニズムを実装していますか


16

プロセスをフォークするときに、OSがコピーオンライトの最適化を実行するのを見てきました。ほとんどの場合、フォークはexecによって処理されるため、ページ割り当てのコストが発生したり、呼び出し元のアドレススペースからデータを不必要にコピーしたりする必要はありません。

これは、ext4またはxfs(ジャーナリング)ファイルシステムを使用するLinuxでCPを実行するときにも発生します。発生しない場合、なぜ発生しないのですか?


誰かがこの興味深い質問に答えることを願っています
カリムマナウイル

しかし、たとえば、大きなファイルをコピーすると、かなり長い時間がかかる(データを新しいブロックにコピーする)ので、そうは思いません。そのようなファイルシステム(少なくともext3 / ext4)にCOWがあった場合、待ち時間は気付かないでしょう(そのような場合、データブロックへのポインターなしでiノードを複製し、COWフラグをマークするだけかもしれません)。
カリムマナウイル

Copy-on-WriteはZFSに実装されており、実際には非常に安価なファイルシステム/ボリュームクローンがあります。ext4の/ XFSは、それをサポートするために、私は信じて、あまりにも原始的なディスク上のフォーマットを持っている
myaut

回答:


7

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

編集:XFS実装は当初、実験的とマークされていました。この警告は、上記を書いてから数か月後のカーネルリリース4.16で削除されました:-)。


11

cp manページから:

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

これは、現時点では主にBTRFSであるコピーオンライトreflink)をサポートするファイルシステムで機能します。XFS reflinkの実装は開発中です[1] [2]


1
NFS、CIFS、OCFS2などの一部のネットワークファイルシステムは、それらをサーバーに渡すこともできます。
ステファンシャゼル

2

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

これは、cp --reflinkによって使用され、ファイルシステムがこれをサポートしているコピーを作成します。


1

cp(少なくともブロックをコピーするために)syscallを導入しない限り、OSは、cpプログラムが書き込むデータが別のブロックから読み取ったデータと同じであると判断するのに苦労します。その上、「いくつかのファイルが同じブロックを共有する」シナリオを管理するための追加のオーバーヘッドがあります。少数のブロックでのみ異なる大きな類似ファイルはめったに発生しません。したがって、これらのブロックをコピーするだけで全体のコストが安くなり、すべてのファイルにこの管理オーバーヘッドが追加されます。

たとえば、BTRFSにファイルシステムの別のクローン/スナップショットを追加してファイル(ファイルの多く)を「コピー」すると、状況は異なります。ファイルシステム内のすべてのファイルを「コピー」し、それらはコピーオンライトになります。これは存在しますが、ext4にはありません。

「ジャーナリング」はそれとは完全に独立した概念であり、重要なファイルの管理構造です。


他の非常にまれな時間のバイナリコピーである大きなファイルは、1ビットで異なり、エラーが原因で発生します。
bitifet

コピーのシステムコールが導入されました(私の回答を参照)。
Qカモノハシ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.