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/sdg2
mim.
$ 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 dd
a 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.