Para alguns sistemas de arquivos como ext4 ou btrfs no Linux, você pode usar o filefrag para obter os deslocamentos dos segmentos de dados para o arquivo no dispositivo de bloco no qual o sistema de arquivos está ativo.
$ 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, na RAM, em dispositivos de bloco de rede ... Pode ser difícil voltar a um disco ou conjunto de discos real.
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 é 384 setores dentro do dispositivo 8:98, o que acontece de ser /dev/sdg2
para mim.
$ cat /sys/block/sdg/sdg2/start
489060352
Então, sdg2 é 489060352 setores dentro de / dev / sdg (o sétimo disco deste sistema).
Para obter o deslocamento no único disco 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