Ver a localização física de um arquivo/diretório em um disco rígido

Ver a localização física de um arquivo/diretório em um disco rígido

Existe algum programa Linux que ofereça a mesma (ou algumas) funcionalidades do Sysinternals DiskView, especialmente a capacidade de visualizar a localização física de um arquivo em um disco rígido?

URL do DiskView:http://technet.microsoft.com/en-gb/sysinternals/bb896650

Responder1

Para alguns sistemas de arquivos como ext4 ou btrfs no Linux, você pode usar filefrag para obter os deslocamentos dos segmentos de dados do arquivo no dispositivo de bloco em que o sistema de arquivos está.

$ 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

Aqui o dispositivo de bloco é um volume LVM. Esse volume pode ter volumes físicos em discos, em partições, em matrizes RAID, em arquivos, em RAM, em dispositivos de bloco de rede... Voltar para um disco ou conjunto de discos real pode ser difícil.

No meu caso, é relativamente fácil, pois é apenas um volume lógico no topo de uma partição GPT como um trecho linear.

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

Então /dev/storage/home tem 384 setores no dispositivo 8:98, o que acontece para /dev/sdg2mim.

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

Portanto, sdg2 tem 489060352 setores em /dev/sdg (o sétimo disco neste sistema).

Para que eu possa obter o deslocamento no disco único em que o arquivo está:

$ 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

Responder2

Eu sei que este é um post antigo, mas eu precisava da mesma funcionalidade para um sistema de arquivos btrfs, que não possui um mapeamento lógico -> de endereço físico simples. A maneira elegante de fazer isso no btrfs é compilar btrfs_map_physical.c localizadofonte aqui.

Um mecanismo mais geral que criei e que funcionará em qualquer sistema de arquivos é acessar o arquivo durante dda execução do blktrace.

Ao executar isso em um 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() }

Execute isso em outro:

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

Exemplo de saída:

Queue(Q)   0.000000000 R 0x00044800 0x0008 dd
  • Queue(Q) é o evento blktrace que estou analisando
  • 0,000000000 é o carimbo de data/hora relativo
  • R é a operação (ler)
  • 0x00044800 é o endereço do bloco em hexadecimal. Altere o printf se quiser decimal.
  • 0x0008 é o número de blocos lidos
  • dd é o nome do aplicativo que emitiu a solicitação

Este exemplo está em um sistema de arquivos com tamanho de bloco de 4K.

informação relacionada