2011-02-20 6 views
1

私はfileAを持っています。これは200 MBのサイズです。今度は、fileBという名前のfileAへのハードリンクを作成したいが、私はこのファイルが最初の100MBのfileAを指すようにしたい。ですから、基本的には同じデータブロックを指すようにfileBが必要ですが、長さは異なります。必ずしも実際のハードリンクである必要はありませんが、それはコンテンツをプロキシする仮想ファイルである可能性があります。linuxの部分ファイルの内容へのハードリンクの作成

私は何とかInodeを複製して長さを変更することを考えていましたが、これはファイルシステムの一貫性の問題を引き起こす可能性があります(データブロックの移動など)。私にこれをさせることができるLinuxツールやユーザレベルのシステムコールはありますか?

+0

私はあなたに良い答えを与えましたが、この質問は実際にここではなく、serverfaultに属しています。 – Omnifarious

+0

@Omnifarious私はこれがサーバーの障害のために何かであることに同意しません。これはプログラミングの質問(例えば「私は何のシステムコールをするのですか?」)と解釈することができます。 – asveikau

+0

頭がおかげで、灰色の領域に質問を編集しました。 – gopice

答えて

1

あなたが記述しているものは、ハードリンクではありません。ハードリンクは本質的には、パス名によるinodeへの参照です。 (ソフトリンクは、パス名のパス名への参照です。)「このinodeは欲しいけど、やや異なっていますが、最初のkブロックのみ」と言うメカニズムはありません。コピーオンライトのファイルシステムは、あなたのためにカバーすることができます。あなたは、このようなファイルシステムを使用していた場合、あなたは、単にもちろん

cp fileA fileB && truncate -s 200M fileB 

言うと、これは、非コピー・オン・ライトのファイルシステム上で動作しますが、それだけで、ファイルシステムのオーバーヘッドの代わりに余分な200メガバイトを占めます。

は、FUSEを使用してLinux上で簡単にこのようなことを実現できます。あなたは、いくつかのターゲットディレクトリをミラーリングするファイルシステムを実装することができますが、人為的に最大長(たとえば200 MB)をファイルに設定するだけです。

FUSE

FUSE Hello World

+0

FUSEが仕事をしているようです、ありがとう。 – gopice

3

あなたが話しているように直接行うことはできません。これを行うファイルシステムがあります。たとえば、LessFSとすることができます。私はまた、基礎となる構造btrfsがこれをサポートしていると信じています。だから誰かがフックを入れると、ユーザーレベルでアクセスできるようになります。

しかし、これをextファイルシステムで行う方法はありません。私はそれがLessFSで暗黙的に起こると信じています。

btrfsでそれを行うのは本当に醜い方法があります。スナップショットを作成してスナップショットファイルを100Mに切り捨てると、効果的に目標を達成できます。

これはbtrfsと十分に最新のバージョンのcpでも動作すると思いますが、cpでファイルをコピーして1つのコピーを切り捨てることができます。 cpのバージョンには--reflinkオプションが必要です。これについてさらに詳しく知りたい場合は、--reflink=alwaysオプションを指定してください。 Omnifariousの答えを@に追加

0

たぶん、あなたはChunkFSを確認することができます。私はこれがあなたが必要とするものだと思う(私はそれを試していない)。

関連する問題