Существует ли какая-либо программа для Linux, которая предлагает ту же (или часть) функциональность Sysinternals DiskView, в частности возможность просмотра физического расположения файла на жестком диске?
URL-адрес DiskView:http://technet.microsoft.com/en-gb/sysinternals/bb896650
решение1
Для некоторых файловых систем, таких как ext4 или btrfs в Linux, можно использовать filefrag для получения смещений сегментов данных для файла на блочном устройстве, на котором находится файловая система.
$ 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, на файлах, на оперативной памяти, на сетевых блочных устройствах... Возвращение к реальному диску или набору дисков может оказаться сложным.
В моем случае это относительно просто, так как это просто логический том поверх одного раздела GPT в виде одного линейного участка.
$ sudo dmsetup table /dev/storage/home
0 1953120256 linear 8:98 384
/dev/sdg2
Итак, /dev/storage/home — это 384 сектора в пределах устройства 8:98, что у меня и есть .
$ 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
решение2
Я знаю, что это старый пост, но мне нужна была та же функциональность для файловой системы btrfs, в которой нет простого логического -> физического сопоставления адресов. Элегантный способ сделать это в btrfs — скомпилировать btrfs_map_physical.c, расположенныйисточник здесь.
Более общий механизм, который я создал и который будет работать в любой файловой системе, — это доступ к файлу во dd
время работы blktrace
.
Запустив это в одном терминале:
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() }
Запустите это в другом:
dd if=/mnt/myfs/test.txt bs=4096 iflag=direct count=1 | head -4
Пример вывода:
Queue(Q) 0.000000000 R 0x00044800 0x0008 dd
- Queue(Q) — это событие blktrace, которое я анализирую
- 0.000000000 — относительная временная метка
- R — операция (чтение)
- 0x00044800 — адрес блока в шестнадцатеричном формате. Измените printf, если вам нужен десятичный формат.
- 0x0008 — количество прочитанных блоков
- dd — имя приложения, отправившего запрос
Этот образец находится в файловой системе с размером блока 4 КБ.