一部のブロックのみが割り当てられたスパースファイルがあります。
~% 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が同じオペレーティングシステムを使用している場合は、異なるオペレーティングシステム間で移植性が高くなる可能性があります。