Hay una pregunta similar en SO. La respuesta actualmente aceptada por @ephemient sugiere usar un ioctl
llamado fiemap
que está documentado en linux/Documentation/filesystems/fiemap.txt
. Citando de ese archivo:
El fiemap ioctl es un método eficiente para que el espacio de usuario obtenga asignaciones de extensión de archivo. En lugar del mapeo bloque por bloque (como bmap), fiemap devuelve una lista de extensiones.
Parece que este es el tipo de información que estás buscando. El soporte por sistemas de archivos es nuevamente opcional:
Los sistemas de archivos que deseen admitir fiemap deben implementar un ->fiemap
devolución de llamada en su inode_operations
estructura.
Soporte para el SEEK_DATA
y SEEK_HOLE
argumentos a lseek
que mencionó de Solaris se agregó en Linux 3.1 de acuerdo con la página de manual, por lo que también puede usar eso. El fiemap ioctl
parece ser más antiguo, por lo que podría ser más portátil en diferentes versiones de Linux por ahora, mientras que lseek
podría ser más portátil entre sistemas operativos si Solaris tiene lo mismo.
Hay una colección de programas de Python llamados sparseutils que usan SEEK_HOLE
y SEEK_DATA
para determinar qué secciones del archivo se representan como agujeros y cuáles son datos. El uso es bastante sencillo. mksparse
se puede usar para generar un archivo disperso de acuerdo con un diseño dado.
$ echo hole,data,hole | mksparse --hole-size 4096 --data-size 4096 example
$ du -sh example
4.0K example
El sparsemap
El programa se puede usar para imprimir el diseño en la salida estándar:
$ sparsemap example
HOLE 4096
DATA 4096
HOLE 4096