Назад | Перейти на главную страницу

Как я могу узнать, где физически находится файл на диске (номера блоков)?

Я знаю, это непонятный вопрос. Я пытаюсь провести тестирование производительности некоторых дисков на Linux. Я получаю противоречивые результаты, выполняя один и тот же тест на том же диске. Я знаю, что диски имеют разную производительность в зависимости от того, к какой части диска осуществляется доступ. В частности, чтение и запись на внешнюю часть диска имеет гораздо более высокую пропускную способность, чем чтение и запись на внутреннюю часть диска, из-за почти постоянной плотности данных и постоянной скорости вращения.

Я хотел бы посмотреть, можно ли объяснить мои несоответствия этой разнице в пропускной способности, вызванной геометрией. Можно ли с помощью существующих инструментов узнать, где на диске размещен файл?

Если нет, я полагаю, что могу написать что-нибудь для прямого поиска, чтения и записи в сам файл устройства, минуя (и разрушая) файловую систему, но я надеюсь этого избежать. В настоящее время я использую ext4 на ядре 3.0 (Arch Linux, если это имеет значение), но меня также интересуют методы для других файловых систем.

Вы можете использовать FIBMAP ioctl, как показано на примере Вот, или используя hdparm:

/ $ sudo /sbin/hdparm --fibmap /etc/X11/xorg.conf

/etc/X11/xorg.conf:
 filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0    1579088    1579095          8

Вы могли бы использовать debugfs для этого:

debugfs -R "stat ~/myfile" /dev/hda1

Измените жесткий диск / диск с разделами соответствующим образом и убедитесь, что диск отключен. Вы получите список со всеми использованными блоками:

BLOCKS:
(0):1643532
TOTAL: 1

это thread может дать вам некоторое представление об алгоритме размещения файлов ext4.

debugfs имеет bmap функция, которая, кажется, дает нужные данные. Вы должны иметь возможность отдавать ему последовательные блоки файла и получать номера физических блоков.

Вопрос довольно старый, но есть еще один ответ, который может быть полезен тем, кто нашел его в Google: filefrag (в Debian это внутри пакета e2fsprogs).

# filefrag -eX /usr/bin/aptitude
Filesystem type is: ef53
File size of /usr/bin/aptitude is 4261400 (1041 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..     1fa:    15bd805..   15bd9ff:    1fb:            
   1:      1fb..     3f2:    15c6608..   15c67ff:    1f8:    15bda00:
   2:      3f3..     410:    15c8680..   15c869d:     1e:    15c6800: last,eof
/usr/bin/aptitude: 3 extents found

Его преимущество состоит в том, что он работает и с другими файловыми системами (я использовал его для UDF), которые, похоже, не поддерживаются другими описанными здесь инструментами.

Смещение, представленное в выходных данных, должно быть кратным размеру блока, записанному во второй строке (здесь 4096). Помните, что логические смещения могут не быть смежными, поскольку в файле могут быть дыры (если это поддерживается файловой системой).