web-dev-qa-db-ja.com

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

OSがプロセスをフォークするときにCopy on Write最適化を実行するのを見てきました。理由は、ほとんどの場合forkがexecによって処理されるため、ページ割り当てのコストが発生したり、呼び出し元のアドレス空間から不必要にデータがコピーされたりしたくないからです。

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

16
Mridul Verma

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

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

7
sourcejedi

cpから man page

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

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

12
sebasth

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

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

2
Q the Platypus

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

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

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

1
dirkt