Реализация файловой системы. Файловая система NTFS
Введение
Типовая совокупность действий пользователя в отношении файловой системы на диске состоит из форматирования диска, создания на нем структуры каталогов, заполнения их файлами, а также выполнения разнообразных действий с этими файлами. В предыдущей лекции говорилось главным образом о том, какие возможности предоставляет файловая система пользователю для решения его задач. Теперь перейдем к рассмотрению вопросов, которые связаны с реализацией предоставляемых сервисов, алгоритмами и структурами данных на диске, позволяющими связать символьное имя файла с данными. Кроме того, файловые службы должны решать проблемы совместного доступа к данным, проблемы проверки и сохранения целостности файловой системы, проблемы повышения производительности и ряд других.
Нижний уровень в системе хранения данных - диски с подвижными головками. Для обмена с магнитным диском на уровне аппаратуры нужно указать номер цилиндра, номер поверхности, номер блока на соответствующей дорожке и число байтов, которое нужно записать или прочитать от начала этого блока. Таким образом, диски могут быть разбиты на блоки фиксированного размера, и можно непосредственно получить доступ к любому блоку (организовать прямой доступ к файлам).
В традиционной многоуровневой системе построения операционных систем с устройствами (дисками) непосредственно взаимодействует часть ОС, называемая системой ввода-вывода, основу которой составляют драйверы устройств. Задача системы ввода-вывода: скрыть особенности работы с дисками и предоставить в распоряжение более высокоуровневого компонента ОС - файловой системы - используемое дисковое пространство в виде непрерывной последовательности блоков фиксированного размера. Файловая система располагается соответственно между системой ввода-вывода и прикладной программой см., например, [ Карпов ] .
В ОС Windows файловая система интегрирована в систему ввода-вывода (см. рис. 12.1), построенную в виде набора разнообразных драйверов, и также реализована в виде драйвера, например, драйвера NTFS или драйвера FAT. Общение драйверов организовано путем посылки так называемых IRP (I/O request packet) пакетов. Функционирование системы ввода-вывода подробно описано в [ Руссинович ] , [ Сорокина ] . В данной лекции речь пойдет о ее файловой подсистеме.
Кластеры
Обычно диски разбиты на блоки (секторы) размером - 512 б. Однако удобнее оперировать блоками более крупного размера - кластерами (cluster). Размер кластера равен размеру сектора, умноженному на кластерный множитель (claster factor), и может быть установлен во время операции форматирования диска. По умолчанию это значение равно 4 Кб и может быть изменено. Альтернативные значения размера кластера можно, например, извлечь из справочной информации команды format.
Эксперимент. Получение информации о потенциальном размере кластера
Ниже приведена часть результатов вывода команды "format /?"
ключ: /A:размер
Заменяет размер кластера по умолчанию. В общих случаях рекомендуется использовать размеры кластера по умолчанию.
NTFS поддерживает размеры 512, 1024, 2048, 4096, 8192, 16КБ, 32КБ, 64K.
FAT32 поддерживает размеры 512, 1024, 2048, 4096, 8192, 16КБ, 32КБ, 64КБ, (128КБ, 256КБ для размера сектора > 512 Байт).
Файловые системы FAT и FAT32 налагают следующие ограничения на число кластеров тома:
FAT: число кластеров <= 65526
FAT32: 65526 < число кластеров < 4177918
Выполнение команды Format будет немедленно прервано, если будет обнаружено нарушение указанных выше ограничений, используя указанный размер кластеров.
Сжатие томов NTFS не поддерживается для размеров кластеров более 4096 Байт.
Размер кластера, которые в дальнейшем также будут называться блоками диска, играет немаловажную роль. Небольшой размер блока будет приводить к тому, что каждый файл будет содержать много блоков и читаться медленно. Большие блоки обеспечивают более высокую скорость обмена с диском, но из-за внутренней фрагментации (каждый файл занимает целое число блоков, и в среднем половина последнего блока пропадает) снижается процент полезного дискового пространства. Специально проведенные исследования показали, что оптимальным является компромиссный размер блока, лежащий в диапазоне от 1-го до 8 Кб.
Система различает кластеры диска (volume claster) и кластеры диска, принадлежащие файлу (logical claster). Для них поддерживается разная нумерация, соответственно VCN и LCN.
Структуры данных, необходимые для описания файловой системы на диске
Основная функция файловой системы - связь символьного имени файла и блоков диска, принадлежащих файлу, - реализуется с помощью ссылки из записи каталога о данном файле на запись в таблице, формат которой определяется типом файловой системы на данном диске.
Например, в файловой системе FAT, одной из файловых систем, поддерживаемых ОС Windows, имеется таблица отображения файлов (file allocation table), которая поддерживает связный список блоков для каждого файла. Таблица индексирована по номерам блоков. Запись в каталоге указывает на строку в таблице, содержащую первый блок файла, а далее по таблице можно найти все остальные блоки данного файла. Принцип работы файловой системы FAT более подробно описан в [ Карпов ] .
Рассмотрим устройство базовой файловой системы ОС Windows - NTFS.
Главная файловая таблица MFT
В файловой системе NTFS запись о файле в каталоге сопоставляется с записью о файле в главной файловой таблице диска - MFT (master file table), которая содержит информацию о расположении данных файла.
MFT - главная структура данных на диске, представляет собой обычный файл, содержащий до 248 записей размером 1 Кб каждая (см. рис. 12.2). Каждому файлу или каталогу соответствует одна запись. Записи 12-15 зарезервированы для служебных файлов, а записи, начиная с 16-й, предназначены для файлов пользователей. Для больших файлов требуется несколько записей, первая из которых называется базовой. Таблица MFT может располагаться в любом месте диска.
В состав каждой записи входит заголовок и последовательность пар <заголовок атрибута, значение>. Если атрибут целиком помещается в записи MFT, он считается резидентным. В противном случае атрибут помещается в отдельные блоки диска, а в заголовке атрибута хранится информация о его местонахождении. Всегда резидентны атрибуты: "имя файла", "стандартная информация", а такие атрибуты, как "поток данных файла", "индекс" большого каталога обычно нерезидентны, хотя для файлов размером несколько сот байтов поток данных может быть резидентным атрибутом, т.к. целиком помещается в записи MFT.
Чаще данные файла все же не помещаются в записи MFT. Рассмотрим данный вариант несколько подробнее. В этом случае вслед за заголовком в записи размещается список дисковых блоков файла ( рис. 12.3).
Напомним, что решается задача приведения в соответствие номера блока в файле (LCN) номеру блока на диске (VCN). Для этого блоки диска представляются в виде совокупности серий, каждая из которых является непрерывной последовательностью блоков. Например, на рис. показано отображение 10-блочного файла, блоки которого размещаются в 9, 10, 25, 26, 27, 63, 85, 86, 87 и 88-м блоках диска. Схема весьма эффективна, особенно для не слишком фрагментированных файлов, например, непрерывный файл независимо от размера описывается всего одной серией.
Для сильно фрагментированных файлов требуется много серий и несколько MFT записей. Первая запись о файле содержит список остальных записей. Если этот список велик, то он является нерезидентным атрибутом и размещается в отдельном файле.
Номера дисковых кластеров файлов можно узнать при помощи утилиты nfi.exe (NTFS File Sectors Information Util), входящей в состав ресурсов Windows.
Эксперимент. Просмотр кластеров, принадлежащих файлу с помощью утилиты nfi.exe
\TMP\Nfi\exp.h $STANDARD_INFORMATION (resident) $FILE_NAME (resident) $DATA (nonresident) logical sectors 471790-471794 (0x732ee-0x732f2) File 33 \TMP\Nfi\h.h $STANDARD_INFORMATION (resident) $FILE_NAME (resident) $DATA (nonresident) logical sectors 471798-471809 (0x732f6-0x73301)
Здесь приведена информация о файлах \tmp\nfi\exp.h и \tmp\nfi\h.h, которую выдает утилита nfi . Наиболее интересно расположение на диске нерезидентного атрибута потока данных, дисковые номера кластеров которого в данном случае обозначаются как logical sectors.