¿Cómo enumero los bloques de datos de un archivo en Linux?

13

Según tengo entendido, cada archivo en un sistema operativo tipo Unix tiene un número de inodo (que se puede ver con "ls -i"), y cada inodo es una lista de bloques de disco que contienen los datos reales de un archivo.

¿Hay un comando de Linux que toma un nombre de archivo como argumento e imprime la lista de bloques de disco a los que apunta el inodo de ese archivo?

PD El sistema de archivos en cuestión es ext3.

Miguel
fuente

Respuestas:

17

Puede usar la herramienta "debugfs" para ver la información del archivo en la línea de comando o interactivley. ya sea uso:

# debugfs /dev/<spartition>
# stat /path/to/file

o

# debugfs -R "stat /path/to/file" /dev/<partition>

por ejemplo:

# debugfs -R "stat /etc/passwd"  /dev/sda5
Inode: 435914   Type: regular    Mode:  0644   Flags: 0x0
Generation: 979004472    Version: 0x00000000
User:     0   Group:     0   Size: 1577
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
ctime: 0x4a2d6f78 -- Mon Jun  8 23:07:20 2009
atime: 0x4a2d6f79 -- Mon Jun  8 23:07:21 2009
mtime: 0x4a2d6f78 -- Mon Jun  8 23:07:20 2009
Size of extra inode fields: 4
BLOCKS:
(0):1767438
TOTAL: 1
katriel
fuente
Tenga en cuenta que el argumento para 'stat' no siempre es / ruta / a / archivo. El uso de / path / to / file funciona para archivos en los sistemas de archivos raíz (montados en /) pero no para rutas montadas en otro sistema de archivos. En esos casos, uno puede recibir el mensaje de error File not found by ext2_lookup. Por lo tanto, es mejor usar la notación de inodo para el argumento de stat. Utilícelo ls -ipara obtener el número de inodo de un archivo, luego invoque debugfs con ese número en '<>' en lugar de / path / to / file. Por ejemplo:# debugfs -R "stat <1234567>" /dev/sda2
ElazarR
@ElazarR ¿Puedes explicar ese comentario? ¿Por qué path/to/fileno debería funcionar en todos los casos? Lo que me confunde es que a través debugfs ..... /dev/fs_blockdevde mi comprensión solo hay un sistema de archivos en consideración, y a todos esos archivos dentro de este sistema se puede acceder a través de su ruta o por su inodo, ¿qué querías expresar?
humanityANDpeace
@humanityANDpeace, en el caso de que un archivo esté en una partición (sistema de archivos) que está fuera del sistema de archivos raíz, es decir, montado en algún punto de montaje debajo de la partición raíz, la operación ext2_lookup parece fallar al encontrar la ruta dada bajo el dispositivo dado (dividir). Esto da como resultado el error que mencioné. Por ejemplo, si sus carpetas / home están montadas desde / dev / sda5 sobre el sistema de archivos raíz (que está en otra parición, por ejemplo, / dev / sda3), entonces se debugfs -R "stat /home/myuser/foo.txt" /dev/sda5produce un error. Pero invocar debugfs -R "stat /path/on/rootfs" /dev/sda3obras.
ElazarR
Creo que lo necesita sudo, de lo contrario se mostrará un mensaje inútil.
Kedar Mhaswade
Y la pregunta inversa: ¿cómo podemos averiguar qué archivo usa un bloque determinado?
Luis A. Florit
4

Mire la sintaxis para "debugfs", y específicamente el comando "stat". Eso le mostrará una lista de los bloques de datos utilizados por un archivo. Puede pasar parámetros a "debugfs" con el argumento "-f" para llamarlo desde un script.

Evan Anderson
fuente
4

Una manera simple de obtener la lista de bloques (sin tener que leer desde la partición como en las debugfsrespuestas) es usar el FIBMAPioctl. No conozco ningún comando para hacerlo, pero es muy simple escribir uno; una búsqueda rápida en Google me dio un ejemplo del uso de FIBMAP , que hace exactamente lo que quieres. Una ventaja es que funcionará en cualquier sistema de archivos que admita la bmapoperación, no solo ext3.

Una alternativa más nueva (y más eficiente) es el FIEMAPioctl, que también puede devolver información detallada sobre las extensiones (útil para ext4).

CesarB
fuente
3
hdparm --fibmap /path/to/filename

No trabajaré en zfs, pero sí en ext4, btrfs, (v) fat, etc.

man 8 hdparm :

--fibmapCuando se usa, esta debe ser la única bandera dada. Requiere una ruta de archivo como parámetro e imprimirá una lista de las extensiones de dispositivo (rangos de sector) ocupadas por ese archivo en el disco. Los números de sector se proporcionan como números LBA absolutos, referenciados desde el sector 0 del dispositivo físico ( no la partición o el sistema de archivos). Esta información se puede utilizar para una variedad de propósitos, como examinar el grado de fragmentación de archivos más grandes o determinar los sectores apropiados para corromperlos deliberadamente durante los procedimientos de prueba de inyección de fallas.

ChewbaccaKL
fuente
1

Al menos en algunas máquinas Linux ... "ls -s" puede proporcionar lo que está buscando.

Editar: mi mal, veo que estás buscando una lista de los bloques en sí, no un recuento de ellos.

usuario10357
fuente
-s muestra el tamaño del archivo en bloques: quiero una lista real de los números de bloque.
mike