Просмотр физического расположения файла/каталога на жестком диске

Просмотр физического расположения файла/каталога на жестком диске

Существует ли какая-либо программа для 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 КБ.

Связанный контент