Для некоторых файловых систем, таких как Ext4 или BTRFS на Linux, вы можете использовать файлфраг для получения смещений сегментов данных для файла в блочном устройстве. Файловая система включена.
$ 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
Здесь блок-устройство является объемом LVM. Этот объем может иметь физические объемы на дисках, на разделах, на RAID-массивах, на файлах, на RAM, на сетевых блочных устройствах ... Возвращение к фактическому диску или набору диска может оказаться сложным.
В моем случае это относительно легко, так как это просто логический объем на вершине одного раздела GPT в виде одного линейного растяжения.
$ sudo dmsetup table /dev/storage/home
0 1953120256 linear 8:98 384
Так / dev / Storage / Home - 384 сектора в пределах устройства 8:98, что происходит / dev / sdg2
для меня.
$ cat /sys/block/sdg/sdg2/start
489060352
Таким образом, SDG2 - 489060352 секторов внутри / dev / sdg (7-й диск в этой системе).
Итак, я могу получить смещение в одном диске, который файл включен:
$ 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