ファイルのコピーを1つだけ保持し、他のコピーは単なる参照であるファイルシステムはありますか?


18

質問は不正確かもしれないので、私はそれをより詳細に説明しようとします。

さまざまな理由で、Linuxファイルシステムに同じファイルのコピーがたくさんあります。それらの多くは非常に大きいです。

私が持っていると言う/path/to/some.fileと、このファイルのコピー/other/path/file.name/yet/another/path/third.copy。文字通りこれらのファイルのうち2つをオリジナルへの参照として機能させるファイルシステムがあるのだろうか。当然、ユーザーがそれらの1つを変更すると、そのときだけ、それらは独立したファイルになります。

PS。これは、リンクを使用することで(部分的に)達成できることを知っています。しかし、上記で説明しようとしたこの機能は、ファイルシステムによって透過的に処理されます。


完全な答えはまだないようですので、ファイルをハードリンク(または、一部のリンクが安全な場合はシンボリックリンク)に置き換えるスクリプト(おそらくcronから実行する)を作成してみませんか?いずれにしても、すべての重複がどこにあるかまだわからない場合は、fdupes code.google.com/p/fdupesをチェックしてください
ジョー

1
一部のユーザーが重複のいずれかのデータを変更すると、変更後のコンテンツが異なるため、独立したファイルになるはずです...シンボリックリンクを作成すると、変更により実際に元のファイルが変更されます。元のファイルを関数型プログラミング言語の値と考えてください。ファイルを変更すると、文字通り新しいオブジェクトとその参照が取得されます。
DejanLekic

OK。いくつかのアイデア:ユーザーとこれらのファイルの間でやり取りできる方法はありますか?可能であれば、リンク(symまたはhard)から始めて、ファイルに何かを書き込むとリンクを解除できます。また、diffのようなものを使用して差分を保存するだけで、バージョン管理システムのように多くのスペースを節約できます。それらのいずれかにファイルを配置すると、違いを管理できます。私はvcsシステムをあまり使用していないので、詳細はわかりません。
ジョー

回答:


17

この機能は重複排除と呼ばれます。一般的なLinuxファイルシステム(ext *)はどれもサポートしていませんが、ZFSは部分的にサポートしています。重複排除などのファイルシステムの一覧もありますが、一般的な選択肢はないようです-Btrfsの予定されている機能です。

ファイルシステムを定期的にチェックし、適切なハードリンクを作成することが現時点でできる最善の方法だと思いますが、コピーオンライトを意味するわけではありません。


私はBTRFSがそれを賞賛することを望んでいました。彼らがこの機能を持っているとは知らなかった-良いニュースだ!ありがとう!
-DejanLekic

10

探したい主なキーワードは「書き込み時コピー」です。BTRFSにはcp --reflink、システムに十分な最新のカーネルとcoreutils 7.5が搭載されていれば、まさに必要なことを行うクローン操作があり、探していることを実行します。 Wikiソースまた、bedupは、ボリューム全体の重複をマージするツールです。CoWは、btrfsのスナップショットテクノロジーであるIIRCの駆動機能でもあります。


私は知っていますがcp --reflink、実際にFSがクローンを検出し、代わりに参照を透過的に使用したいことに注意してください。また、私はbedupツールから離れています。
DejanLekic

ユーザーレベルのプロセスが1つのファイルから読み取り、別のファイルに書き込む場合、FSレイヤーは、それが変更されたコピーではなく正確なコピーであることをどのように知るのですか?そのため、クローン作成と読み取りと書き込みを別々に行うioctlがあります。ファイルのクローンを作成し、CoWを使用するアプリケーションは、使用可能な場合はそのようなものを使用し、それ以外の場合はフォールバックする必要があります。FSレイヤーがコピーの発生を検出し、代わりにCoWを実行できる信頼性の高い魔法の方法はありません。アプリは、ジョブの適切な呼び出し(cp --reflink/ clone)または別のツールを使用して、後でジョブを終了する(ベッドアップ)必要があります。
afrazier

ハッシュ(より安全)またはcrc + timestamp値を比較します。書き込みにより、FSはファイルの独立したコピーを作成します。さらに、このシステムはページレベルで実装できます
...-DejanLekic

そして、それは正確にカーネルのどこで行われますか?あなたが話しているのは単純な問題ではありません。ページレベルで実行することも可能ですが、インラインで実行するには大量のRAMが必要です-ZFSはデータTBあたり20 GBを超えるRAM [ソース ]であり、OpenDedupはデータTBあたり8 GBのRAMを必要としますw / 4kページ[ソース ]。ZFSの要件は、パフォーマンスを犠牲にしてL2ARCで削減できます。
フレイジャー

1
バックアップストアについて説明していない限り、WHSは重複除去を行いません。バックアップソフトウェアの場合、クライアントはほとんどの作業を実行し、書き込むデータを送信する前にサーバーでハッシュをチェックできます。バックアップサービスは、ファイルシステムとは非常に異なる獣です。ある人にとって有効な戦略は、別の人にとっては実行できない場合があります。
フレイジャー


0

Zfs、btrfs、ext3cow、bcachefs(ただし、まだ実装されていない可能性があります)。Microsoftには開発中のものがありましたが、不明な理由で停止しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.