Ver la ubicación física de un archivo/directorio en un disco duro

Ver la ubicación física de un archivo/directorio en un disco duro

¿Existe algún programa de Linux que ofrezca la misma (o parte de) funcionalidad de Sysinternals DiskView, especialmente poder ver la ubicación física de un archivo en un disco duro?

URL de vista de disco:http://technet.microsoft.com/en-gb/sysinternals/bb896650

Respuesta1

Para algunos sistemas de archivos como ext4 o btrfs en Linux, puede usar filefrag para obtener las compensaciones de los segmentos de datos del archivo en el dispositivo de bloque en el que se encuentra el sistema de archivos.

$ seq 1000 > a
$ filefrag -v a
Filesystem type is: ef53
File size of a is 3893 (1 block of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..       0:   82784147..  82784147:      1:             eof
a: 1 extent found
$ sudo dd bs=4k skip=82784147 count=1 if=/dev/storage/home 2>&- | head
1
2
3
4
5
6
7
8
9
10

Aquí el dispositivo de bloque es un volumen LVM. Ese volumen puede tener volúmenes físicos en discos, particiones, matrices RAID, archivos, RAM, dispositivos de bloques de red... Volver a un disco o conjunto de discos real puede resultar difícil.

En mi caso, es relativamente fácil, ya que es solo un volumen lógico encima de una partición GPT como un tramo lineal.

$ sudo dmsetup table /dev/storage/home
0 1953120256 linear 8:98 384

Entonces /dev/storage/home tiene 384 sectores dentro del dispositivo 8:98, que resulta ser /dev/sdg2para mí.

$ cat /sys/block/sdg/sdg2/start
489060352

Entonces sdg2 tiene 489060352 sectores dentro de /dev/sdg (el séptimo disco en este sistema).

Entonces puedo obtener el desplazamiento dentro del único disco en el que se encuentra el archivo:

$ sudo dd if=/dev/sdg skip="$((489060352+384+82784147*8))" count=1 2> /dev/null | head
1
2
3
4
5
6
7
8
9
10

Respuesta2

Sé que esta es una publicación antigua, pero necesitaba la misma funcionalidad para un sistema de archivos btrfs, que no tiene una asignación de dirección lógica -> física simple. La forma elegante de hacer esto en btrfs es compilar btrfs_map_physical.c ubicadofuente aquí.

Un mecanismo más general que creé y que funcionará en cualquier sistema de archivos es acceder al archivo ddmientras se ejecuta blktrace.

Mientras ejecuta esto en una terminal:

sudo blktrace -d /dev/sda -o - | blkparse -i - -F Q,"%d Queue(Q) %T.%t %S %n %C\n" | grep --line-buffered "Queue(Q)" | awk -W interactive ' {printf "%s %13s %s 0x%08x 0x%04x %s\n", $2, $3, $1, $4, $5, $6; fflush() }

Ejecute esto en otro:

dd if=/mnt/myfs/test.txt bs=4096 iflag=direct count=1 | head -4

Salida de muestra:

Queue(Q)   0.000000000 R 0x00044800 0x0008 dd
  • Queue(Q) es el evento blktrace que estoy analizando
  • 0.000000000 es la marca de tiempo relativa
  • R es la operación (leer)
  • 0x00044800 es la dirección del bloque en hexadecimal. Cambie el printf si quiere decimal.
  • 0x0008 es el número de bloques leídos
  • dd es el nombre de la aplicación que emitió la solicitud

Esta muestra está en un sistema de archivos con un tamaño de bloque de 4K.

información relacionada