Tengo un archivo disperso, en el que solo se asignan algunos bloques:
~% du -h --apparent-size example
100K example
~% du -h example
52K example
Me gustaría saber qué bloques del archivo están realmente asignados. ¿Hay una llamada al sistema o una interfaz de kernel que podría usarse para obtener una lista de las asignaciones o los agujeros de archivo?
Simplemente verificar una cadena de ceros lo suficientemente larga (el enfoque utilizado por GNU cp, rsync, etc.) no funciona correctamente:
~% cp example example1
~% du -h example1
32K example1
Detectó otras secuencias de ceros que en realidad se asignaron.
fuente
--fibmap
de lahdparm
utilidad. Ver el manual.Hay una colección de programas de Python llamados sparseutils que usan
SEEK_HOLE
ySEEK_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.El
sparsemap
programa se puede usar para imprimir el diseño en stdout:fuente
Depende del sistema de archivos. No creo que sea una llamada, por lo que muchas herramientas no manejan bien la copia de archivos dispersos. La cadena de herramientas GNU utiliza la búsqueda de grandes bloques de ceros, ya que les permite eliminar los bloques asignados no utilizados. Muchas herramientas de copia convertirán un archivo disperso en un archivo con todos los bloques asignados.
Probablemente tendrá que abrir el inodo y analizar el resultado. El formato de Inode depende del sistema de archivos. Algunos sistemas de archivos pueden tener parte de sus datos en el inodo mismo.
fuente
SEEK_DATA
comoSEEK_HOLE
parámetros paralseek()
, como los que hay en Solaris: opensolarisforum.org/man/man2/lseek.html