2016-08-05 4 views
3

例えば、ext3やext4のように、同じファイルシステム上にある2つの非常に大きなファイルを連結したい場合、linuxは2つのファイルのinode直接/間接ポインタを読み込んで変更することによってプログラムで行うことができます。ファイルサイズとスーパーブロックの値は?もしそうなら、そのためのapi/headerfilesに関するドキュメントはありますか?同じlinuxファイルシステム上の2つのファイルを連結することは、inodeデータ構造とスーパーブロックを変更することで可能ですか?

注:cat、teeなどのLinuxバイナリが組み込まれていることは承知していますが、これはプログラム的にこれを達成するための質問です。

+3

を持っている必要がありますか? – dbush

+0

これは良い質問です。可能であれば、数学を行い、ブロックを書き直すと、通常の連結のようになります。あるいは悪いと思います。ファイルサイズがブロックサイズの倍数の場合はこれが可能ですか? – nohup

+0

私はこの操作がサポートされているとは思わない。それは本当に私を驚かせるだろう。 – fuz

答えて

3

はい、何であるかによってを連結します。は、どのように低レベルで作業を行っているのか、どのようなファイルシステムであるのですか。

  1. 特にext3の & ext4の用の低レベル、非現実的で、困難な、。 cat foo bar | sponge fooに相当する処理を行いたいとしますが、メタデータを読み書きする以外は何もしないとします。この場合、fooは正確なブロックサイズの倍数でなければならず、両方のファイルのinodesとdir構造を取得するのが得意です。rm bar、ファイルシステムのマウントを解除して、を調整してください(ddいくつかのヘキサエディタ)を、他のものを破壊しないようにします。 ファイルシステムによっては、困難な場合があり、他の影響を受けた、または妨げているデータ構造を更新または変更する必要があります。

    fooが正確なブロックサイズの倍数でない場合、連結ファイルの途中にガベージデータがあります。

  2. カンニング。 in-line deduplicationのファイルシステムを使用してください。 Btrfsは、その機能最初のファイルのサイズは、ファイルシステムのブロックサイズの倍数でない場合はどうすればsomeday.

関連する問題