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

10

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

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

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

Рик Коши
источник
1
кто говорит, что файлы находятся в одном месте? Если они фрагментированы (что они обычно делают), они могут закончиться всем.
Sirex
Абсолютно. Но они все еще где-то :-) И в моем конкретном случае, при записи файлов во вновь созданную файловую систему, они весьма вероятно (в основном) будут нефрагментированными.
Рик Коши
Вы не можете сделать это. Лучшее, что вы можете получить, это номера блоков LBA файлов, которые не обязательно соответствуют указанным физическим местоположениям (по крайней мере, не таким способом, который вы можете определить, так как диски не публикуют это отображение). Также есть и другие вещи, например, блоки 3-5 могут быть последовательно пронумерованы, но 4 может быть перераспределен в совершенно другое место на диске, потому что исходный сектор в 4 был физически поврежден, и т. Д. Вы не можете получить информацию вы ищете, если производитель привода не хочет дать вам подробные характеристики адреса.
Джейсон С

Ответы:

7

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

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

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

BLOCKS:
(0):1643532
TOTAL: 1
Барт Де Вос
источник
1
Это прекрасно, спасибо. Я не уверен, почему вы сказали, чтобы убедиться, что диск отключен, хотя. Согласно странице руководства, debugfs по умолчанию открывается в режиме только для чтения, поэтому эта команда должна быть полностью безопасной даже в активной файловой системе. Конечно, это может дать сомнительные результаты, если запрашиваемый файл активно изменяется в данный момент, но никаких других проблем не должно быть. Я что-то пропустил?
Рик Коши
Нет вы правы Это скорее «лучшая практика», чем необходимость. Если вы делаете это в активной файловой системе, файлы могут измениться и т. Д.
Барт Де Вос
1
Номер блока LBA не говорит вам, где файл физически находится на диске. В наши дни преобразование из LBA в физическое местоположение, как правило, невозможно из-за сложности физической геометрии современных накопителей, закулисного перераспределения секторов и т. Д. Вообще говоря, обычно безопаснее делать ставку на дисковые носители с более низким LBA. к внешней стороне диска, но это только потому, что эта схема была типичной в прошлом, еще в дни адресации CHS. Современные приводы даже не публикуют реальную геометрию CHS, потому что они не могут.
Джейсон С
как насчет жирных систем?
Дашесы
10

Вы можете использовать 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
Франсуа Г
источник
К сожалению, ничего, что выводит stat, это информация, которая мне нужна. Размер в байтах и ​​блоках, номер инода, разрешения ... Ни один из них не отражает, какие блоки содержат данные файла. Например, все мои тестовые файлы (которые имеют одинаковый размер) показывают абсолютно одинаковые данные, за исключением номера инода и времени доступа / модификации.
Рик Коши
Да, вы правы, извините, я не правильно прочитал. Я изменил свой ответ на STG более подходящим.
Франсуа Г
hdparm действительно дает мне то, что мне нужно, и в несколько более удобочитаемом формате, чем debugfs. Я должен был найти его, так как он не установлен (в Arch Linux) по умолчанию. debugfs является частью e2fsprogs (тот же пакет, который дает нам mkfs и fsck), поэтому устанавливается по умолчанию.
Рик Коши
LBA не сообщает вам, где файл физически находится на диске. Невозможно получить информацию о реальном физическом отображении LBA.
Джейсон С
Я получаю это на жире:HDIO_GETGEO failed: Inappropriate ioctl for device
Дашесы
5

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

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

Павел Бродацкий
источник
1
Спасибо за указатель на ветку о размещении файла ext4. Это было поучительно. :-)
Рик Коши
LBA не сообщает вам, где файл физически находится на диске. Невозможно получить информацию о реальном физическом отображении LBA.
Джейсон С
2

Вопрос довольно старый, но есть другой ответ, который может быть полезен для тех, кто находит это в 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). Помните, что логические смещения могут быть не смежными, поскольку в файле могут быть дыры (если они поддерживаются файловой системой).

Джованни Масцеллани
источник