SOにも同様の質問があります。 @ephemient によって現在受け入れられている回答では、 ioctl
の使用が提案されています fiemap
と呼ばれる linux/Documentation/filesystems/fiemap.txt
に記載されています .そのファイルからの引用:
fiemap ioctl は、ユーザー空間がファイルエクステント マッピングを取得するための効率的な方法です。ブロックごとのマッピング (bmap など) の代わりに、fiemap はエクステントのリストを返します。
これがあなたが探している情報の種類のようです。ファイルシステムによるサポートは再びオプションです:
<ブロック引用>
fiemap をサポートするファイル システムは、->fiemap
を実装する必要があります。 inode_operations
のコールバック
SEEK_DATA
のサポート と SEEK_HOLE
lseek
への引数 あなたがSolarisから言及したのは、manページによるとLinux 3.1に追加されたので、それも使用できます。 fiemap ioctl
lseek
より古いように見えるので、現時点では異なる Linux バージョン間での移植性が高い可能性があります。 Solaris に同じ機能がある場合、オペレーティング システム間での移植性が向上する可能性があります。
SEEK_HOLE
を使用する sparseutils と呼ばれる Python プログラムのコレクションがあります。 と 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