
一部のブロックのみが割り当てられたスパースファイルがあります。
~% du -h --apparent-size example
100K example
~% du -h example
52K example
ファイルのどのブロックが実際に割り当てられたかを知りたいです。割り当てリストまたはファイルの脆弱性リストを取得するために使用できるシステムコールまたはカーネルインターフェイスはありますか?
単にゼロからなる十分に長い文字列(GNU cp、rsyncなどで使用する方法)をチェックするだけでは機能しません。
~% cp example example1
~% du -h example1
32K example1
実際に割り当てられた他のゼロシーケンスを検出します。
答え1
持つSOに同様の質問があります。これ現在承認されている回答渡す@ephemientioctl
以下を使用することをお勧めfiemap
します。linux/Documentation/filesystems/fiemap.txt
。文書の引用:
fiemap ioctl は、ユーザー空間がファイル範囲マッピングを取得する効率的な方法です。 fiemapは、ブロック固有のマップ(bmapなど)ではなく範囲のリストを返します。
これがあなたが探している情報のようです。ファイルシステムのサポートもオプションです。
fiemapをサポートするファイルシステムは、構造体にコールバックを実装する必要があり
->fiemap
ますinode_operations
。
あなたのための支持SEEK_DATA
とSEEK_HOLE
主張lseek
ソラリスで言及Linux 3.1に従って追加されましたマニュアルページだから、あなたもそれを使用することができます。このバージョンはfiemap ioctl
古いように見えるため、現在は異なるLinuxバージョン間でより移植性が高くなる可能性があり、lseek
Solarisが同じオペレーティングシステムを使用している場合は、異なるオペレーティングシステム間で移植性が高くなる可能性があります。
答え2
Pythonプログラムのコレクションがあります。希薄なツールSEEK_HOLE
とを使用して、SEEK_DATA
ファイルのどの部分が穴としてマークされ、どの部分がデータであるかを確認します。使い方はとても簡単です。mksparse
特定のレイアウトに基づいてスパースファイルを生成するために使用できます。
$ echo hole,data,hole | mksparse --hole-size 4096 --data-size 4096 example
$ du -sh example
4.0K example
このsparsemap
プログラムは、レイアウトを標準出力として印刷するために使用できます。
$ sparsemap example
HOLE 4096
DATA 4096
HOLE 4096
答え3
ファイルシステムによって異なります。私はそれが1つの呼び出しであるとは信じていません。おそらく、多くのツールがまれなファイルのコピーをうまく処理できない理由です。 GNUツールチェーンは、未使用の割り当てブロックを削除するために大きなゼロブロック検索を使用します。多くのコピーツールは、スパースファイルをすべてのブロックが割り当てられたファイルに変換します。
inodeを開いて結果を解析する必要があるかもしれません。 inode形式はファイルシステムによって異なります。一部のファイルシステム inode には、独自の一部のデータを含めることができます。