Linuxでのスパースファイルの詳細情報


11

いくつかのブロックのみが割り当てられているスパースファイルがあります。

~% du -h --apparent-size example
100K    example
~% du -h example
52K     example

ファイルのどのブロックが実際に割り当てられているのか知りたいのですが。割り当てまたはファイルのホールのリストを取得するために使用できるシステムコールまたはカーネルインターフェイスはありますか?

ゼロの十分に長い文字列をチェックするだけでは(GNU cp、rsyncなどで使用されるアプローチ)正しく動作しません。

~% cp example example1  
~% du -h example1 
32K     example1

実際に割り当てられたゼロの他のシーケンスを検出しました。

回答:


7

SOについても同様の質問があります。現在受け入れ答えによって@ephemientが使用することを提案しているioctlと呼ばれるfiemapに記載されているがlinux/Documentation/filesystems/fiemap.txt。そのファイルから引用:

fiemap ioctlは、ユーザー空間がファイルエクステントマッピングを取得するための効率的な方法です。ブロックごとのマッピング(bmapなど)の代わりに、fiemapはエクステントのリストを返します。

このような音はあなたが探している種類の情報です。ファイルシステムによるサポートは再びオプションです:

fiemapをサポートするファイルシステム->fiemap は、そのinode_operations構造にコールバックを実装する必要があります。

サポートSEEK_DATASEEK_HOLEの引数lseekあなたはSolarisのから言及によるLinuxの3.1で追加されたmanページあなたにもそれを使用する場合がありますので、。はfiemap ioctlより古いように見えるため、現時点では、異なるLinuxバージョン間でlseek移植性が高い可能性がありますが、Solarisが同じであれば、オペレーティングシステム間で移植性が高くなる可能性があります。


2
あなたは使用して、このFIEMAP情報を得ることができる--fibmaphdparm有用性を。マニュアルを参照してください。
2013

2

sparseutilsと呼ばれるPythonプログラムのコレクションがあり、これを使用SEEK_HOLESEEK_DATAて、ファイルのどのセクションがホールとして表され、どのセクションがデータであるかを判別します。使い方は非常に簡単です。mksparse特定のレイアウトに応じてスパースファイルを生成するために使用できます。

 $ echo hole,data,hole | mksparse --hole-size 4096 --data-size 4096 example
 $ du -sh example
 4.0K   example

sparsemapプログラムは、stdoutにレイアウトを印刷するために使用することができます。

 $ sparsemap example
 HOLE 4096
 DATA 4096
 HOLE 4096

1

それはファイルシステムに依存します。多くのツールがスパースファイルのコピーをうまく処理できないのは、そのためと思われます。GNUツールチェーンでは、未使用の割り当てられたブロックを削除できるゼロの大きなブロックの検索を使用します。多くのコピーツールは、スパースファイルをすべてのブロックが割り当てられたファイルに変換します。

おそらくiノードを開いて、結果を解析する必要があります。iノードのフォーマットはファイルシステムに依存します。一部のファイルシステムでは、iノード自体にデータの一部がある場合があります。


1
この情報を取得するには、FSに依存しない方法が必要です。iノードから直接読み取ることは間違いなくオプションではありません。Solaris にあるようなSEEK_DATAとのようなSEEK_HOLEパラメータを探していましたlseek()opensolarisforum.org/man/man2/lseek.html
Juliano

@Juliano Linuxのlseekオプションを見ると、これらのオプションはありません。Solarisがサポートするファイルシステムはほとんどないため、比較的簡単にサポートできます。Linuxはさまざまなファイルシステムをサポートしていますが、その一部はスパースファイルをサポートしていません。SEEK_DATA / SEEK_HOLEのサポートは、すべてのファイルシステムのコードでサポートを課します。これらのメソッドは期待どおりに動作しない場合があります。Sun側からの詳細データについては、blogs.sun.com / bonwick / entry / seek_hole_and_seek_dataを参照してください。
BillThor

1
ファイルシステムはlseek()インターフェースで何もサポートする必要はありません。カーネルは、モジュールプロパティを通じてSEEK_DATA / SEEK_HOLEをサポートするファイルシステムモジュールをワイトリスト化します。これはマンページ自体とリンクされたブログにあります:「ホー​​ルに関する情報を提供しないファイルシステムの場合、ファイルは1つのデータ領域全体として表されます。」
ジュリアーノ

@Julianoには、カーネルMODとlseekの変更が必要です。ブログのエントリによると、これはSunのかなり新しい機能です。これを機能させるには、ファイルシステムコードも変更する必要があります。カーネルフックを提供するには、スパースファイルをサポートするすべてのファイルシステムを変更する必要があります。
BillThor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.