Библиотека сайта rus-linux.net
Фрагментация под Linux: Настройка файловой системы Ext3
Автор: Oliver Diedrich, перевод: Алексей ДмитриевПредыдущие страницы: 1, 2, 3, 4, 5.
Приложения
Отладчик файловой системы
Программа debugfs (входящая в пакет e2fsprogsм) это прекрасный инструмент для исследования лабиринтов Ext3. Команды:
stat file_name
и
stat <inode number>
выдают всю информацию относительно дескриптора, включая блоки данных, задействованные файлом.
mi
используется для изменения содержания дескриптора -
иногда это последний способ спасти поврежденный файл; ls
служит для исследования структур директории; stats
сообщает
подробности про суперблок; lsdel
выводит список удаленных
файлов в Ext2; ncheck
определяет имя файла, принадлежащего
дескриптору, но не принимает в расчет жесткие ссылки; icheck
выводит все дескрипторы, указывающие на блок данных; cat
выводит содержимое файла на экран, а dump
- в новый файл;
help
выводит список всех команд debugfs.
Программа debugfs может смело применяться к файловым системам, смонтированным и находящимся в работе, так как открывает по умолчанию доступ только на чтение (ro). Однако, если вы используете команду
debugfs -w device
для записи в вашу систему, вы должны иметь в виду, что эта программа может быстро разрушить структуры администрирования вашей системы до степени, когда даже e2fsck уже не поможет.
Измерение фрагментации
Чтобы определить степень фрагментации внутри файла, мы должны узнать, какие блоки данных использует этот файл и сопоставить порядок следования данных блоков с идеальным порядком следования.
Рисунок 6. В нефрагментированном файле блоки располагаются в соответствии с порядком, в котором файловая система будет их читать
Блоки данных файла могут быть установлены тремя различными
способами. Прямой путь - читать диск сектор за сектором и
расшифровывать индивидуальные структуры Ext3, что в итоге приведет к
необходимости перепрограммировать драйвер Ext3.
К счастью, в этом нет необходимости. Библиотека libext2fs
обеспечивает механизмы прямого доступа к работе драйвера файловой
системы. Функции ext2fs_get_next_inode()
и
ext2fs_block_iterate()
итерируют все дескрипторы,
используемые в файловой системе, и все блоки данных, принадлежащие
дескриптору. Вызов произвольной функции с каждым номером блока данных
можно включить в ext2fs_get_next_inode()
, чтобы сравнить
действительное расположение блоков на диске с идеальным порядком
следования. Такой подход использует программа e2fsck, и наша
программа ext2_frag[6].
Программа ext2_frag должна быть запущена с именем устройства, которое нужно проверить (раздел или логический том на системах LVM):
ext2_frag DEVICE [-s|-f|-v|-d] [-i INODE]
По умолчанию, программа проверяет всю файловую систему и выводит
данные о том, фрагментирован ли каждый файл, и в какой степени. Опция
-f
для большей ясности ограничивает вывод только
фрагментированными файлами. Опция -s
выводит только
статистическую сводку всей системы. Итак, данные о фрагментации
файловой системы на устройстве /dev/sda1 могут быть получены при
помощи команды:
ext2_frag -s /dev/sda1
Опция -i
исследует детали фрагментации отдельных файлов
по номерам их дескрипторов; -v
и -d
выдают
дальнейшие подробности о расположении блоков файла.
Третий способ установить номера блоков, принадлежащих файлу,
использовать программу ioctl, из набора FIBMAP, хотя она
работает только с обычными файлами, а не с директориями. Она
используется в программе filefrag из пакета e2fsprogs,
а также программой fragments[7]. В отличие от
ext2fs_block_iterate()
, программа ioctl(FIBMAP)
выводит только номера блоков, и не выводит номера непрямых блоков -
они могут быть идентифицированы только как пробелы в порядке
следования блоков.
Программу fragments нужно запускать с именем директории:
fragments [-r] [-d] [-f] [-b] [-x] DIRECTORY
С опцией -r
, программа рекурсивно исследует субдиректории
указанной директории; -d
выводит статистику по каждой
субдиректории; добавив -x
заставим программу игнорировать
субдиректории, являющиеся точками монтирования других файловых
систем.
Вся файловая система в общем случае проверяется командой:
fragments -d -x /
Опция -f
выдает информацию о фрагментации отдельных
файлов; -b
добавляет расположение блоков каждого файла.