¿Hay algún comando que muestre los bloques inicial y final de cualquier archivo?
command-line
filesystems
files
preciso
fuente
fuente
Respuestas:
hdparm
No estoy 100% seguro de que esto sea lo que está buscando, pero creo que puede hacerlo usando el comando
hdparm
, específicamente con su--fibmap
interruptor.extracto
Ejemplo
Digamos que tenemos un archivo de muestra.
Ahora cuando corremos
hdparm
.filefrag
Otro buen método para descubrir los bloques iniciales y finales de un archivo es
filefrag
. Sin embargo, deberá usar los interruptores adecuados para obtener la salida deseada. Una ventaja de esta herramientahdparm
es que cualquier usuario puede ejecutarla, por lo que nosudo
se requiere. Deberá usar el-b512
interruptor para que las salidas se muestren en bloques de 512 bytes. También necesitamos decirfilefrag
que sea detallado.Ejemplo
debugfs
Un tercer método para obtener los LBA de un archivo es hacer uso de
debugfs
. Este método requerirá un poco de matemática, pero pensé que era importante mostrar cómo se puede convertir del valor extents reportadodebugfs
a LBA, para aquellos que puedan ser curiosos.Entonces, comencemos con el inodo del archivo.
NOTA: También podríamos usar el nombre del archivo dentro,
debugfs
pero para esta demostración voy a usar el inodo en su lugar.Ahora obtengamos la
stat
informacióndebugfs
sobre nuestro inodo.La información importante está en la sección de extensiones. Estos son en realidad bloques del sistema de archivos que están siendo utilizados por este inodo. Solo necesitamos convertirlos a LBA. Podemos hacer esto a través de la siguiente ecuación.
NOTA: Suponiendo que nuestro sistema de archivos usa tamaños de bloque de 4k y que el hardware subyacente usa unidades de 512 bytes, debemos multiplicar los exents por 8.
Ejemplo
Entonces, en nuestro ejemplo, nuestra extensión inicial y final es la misma, ya que nuestro archivo se ajusta dentro de una sola extensión.
Entonces nuestros LBA son 282439184..282439191.
Referencias
fuente
filefrag
.debugfs
.filefrag
con los tamaños de bloques disponibles de 1024 y 2048 ...debugfs
con extensiones de archivo más grandes : 0 - 12187 ... Me tomaré mi tiempo y entenderé ... eso es una gran ayuda, gracias ...Número de sector relativo al dispositivo de bloque que contiene el FS (no todo el disco)
(Tenga en cuenta que
hdparm --fibmap
es relativo a todo el disco, no a la partición o cualquier otro blockdev que contenga el FS. También requiere root).filefrag -e
funciona bien, y utiliza el genérico y eficienteFIEMAP
ioctl , por lo que debería funcionar en casi cualquier sistema de archivos (incluyendo los BTRFS menudo extraños, incluso para los archivos comprimidos-BTRFS). Recurrirá a FIBMAP para sistemas de archivos / núcleos sin soporte FIEMAP.Solo XFS
Si está utilizando xfs, entonces
xfs_bmap
tiene una salida más agradable: le muestra dónde hay agujeros, mientras quefilefrag
la próxima extensión comienza en un sector posterior. Utiliza bloques de 512B, no lo que sea realmente el tamaño de bloque del sistema de archivos. (normalmente 4k en Linux). Le muestra en qué grupo de asignación se encuentra cada extensión y cómo se alinea en los límites de banda RAID.-l
es redundante cuando-v
se usa, pero por alguna razón siempre escribo-vpl
.-pl
Es una salida más compacta.Ambos
filefrag
yxfs_bmap
te muestran extensiones preasignadas.hdparm --fibmap
solo es útil si desea un número de sector relativo a todo el disco duro , no dentro de la partición en la que se encuentra el sistema de archivos. No funciona sobre RAID de software (o presumiblemente cualquier otra cosa entre el sistema de archivos y un disco duro). También requiere root. A pesar del nombre de la opción, en realidad se usaFIEMAP
cuando está disponible (el ioctl de mapa de extensión más nuevo, no el viejo ioctl de mapa de bloques lento).fuente
Entonces, para un archivo dado, desea saber qué números de bloque de disco contienen el inicio y el final de ese archivo.
debugfs (8) parece prometedor para ext2 / 3/4 FSes
stat (1), ls -i, lsof (8) proporcionan el número de inodo, pero no mucho más sobre los bloques de disco.
head / tail --bytes = 1024 es útil para el contenido del archivo, pero no para los bloques de disco.
dd (1) será lo que desea inspeccionar el contenido del bloque: esté atento a la diferencia entre los parámetros seek = y skip =, y evite = = dev / ... a menos que realmente desee que el archivo de salida sea un dispositivo .
fuente
hdparm --fibmap
enumerará los bloques que ocupa un archivo. Tenga en cuenta que pueden no ser contiguos, por lo que "inicio y fin" no tiene sentido.fuente
--fibmap
. También debe especificar un nombre de archivo w / it. Ejemplo:hdparm --fibmap afile
.hdparm
fue en un nivel de unidad completo, nunca lo usé para archivos antes.