Es gibt eine ähnliche Frage zu SO. Die derzeit akzeptierte Antwort von @ephemient schlägt die Verwendung eines ioctl
vor genannt fiemap
was in linux/Documentation/filesystems/fiemap.txt
dokumentiert ist . Zitat aus dieser Datei:
Das fiemap ioctl ist eine effiziente Methode für den Userspace, um Dateiumfangszuordnungen zu erhalten. Anstelle einer Block-für-Block-Zuordnung (wie bmap) gibt fiemap eine Liste von Extents zurück.
Klingt so, als ob dies die Art von Informationen ist, nach denen Sie suchen. Die Unterstützung durch Dateisysteme ist wiederum optional:
Dateisysteme, die Fiemap unterstützen möchten, müssen einen ->fiemap
implementieren Rückruf auf ihrem inode_operations
Struktur.
Unterstützung für SEEK_DATA
und SEEK_HOLE
Argumente für lseek
Sie erwähnten von Solaris wurde laut Manpage in Linux 3.1 hinzugefügt, also könnten Sie das auch verwenden. Die fiemap ioctl
scheint älter zu sein, daher ist es vorerst möglicherweise besser auf verschiedene Linux-Versionen übertragbar, während lseek
könnte besser über Betriebssysteme hinweg portierbar sein, wenn Solaris dasselbe hat.
Es gibt eine Sammlung von Python-Programmen namens sparseutils, die SEEK_HOLE
verwenden und SEEK_DATA
um zu bestimmen, welche Abschnitte der Datei als Löcher dargestellt werden und welche Daten sind. Die Nutzung ist recht einfach. mksparse
kann verwendet werden, um eine Sparse-Datei gemäß einem bestimmten Layout zu generieren.
$ echo hole,data,hole | mksparse --hole-size 4096 --data-size 4096 example
$ du -sh example
4.0K example
Die sparsemap
Programm kann verwendet werden, um das Layout auf stdout zu drucken:
$ sparsemap example
HOLE 4096
DATA 4096
HOLE 4096