Структура главной файловой таблицы (mft).
Главная таблица файлов (MFT) занимает центральное место в структуре NTFS-тома. MFT реализована как массив записей о файлах. Размер каждой записи фиксирован и равен 1 Кб. Логически MFT содержит по одной строке на каждый файл тома, включая строку для самой MFT. Кроме MFT на каждом томе NTFS имеется набор файлов метаданных с информацией, необходимой для реализации структуры файловой системы. Имена всех файлов метаданных NTFS начинаются со знака доллара ($), хотя эти знаки скрыты. Так, имя файла MFT –– $Mft. Остальные файлы NTFS-тома являются обычными файлами и каталогами. Первая запись MFT, хранящая адреса других записей, называется базовой (base file record).
При первом обращении к тому NTFS должна смонтировать его, то есть считать с диска метаданные и сформировать внутренние структуры данных, необходимые для обработки обращений к файловой системе. Чтобы смонтировать том, NTFS ищет в загрузочном секторе физический адрес MFT на диске. Запись о самой MFT является первым элементом в этой таблице, вторая запись указывает на файл в середине диска ($MftMirr), который называется зеркальной копией MFT и содержит копию первых нескольких строк MFT. Если по каким-либо причинам считать часть MFT не удастся, для поиска файлов метаданных будет использована именно эта копия MFT.
Структура файловых ссылок.
Файл на томе NTFS идентифицируется 64-битным значением, которое называется файловой ссылкой (file reference). Файловая ссылка состоит из номера файла и номера последовательности. Номер файла равен позиции его записи в MFT минус 1 (или позиции базовой записи в МFT минус 1, если файл требует несколько записей). Номер последовательности в файловой ссылке увеличивается на 1 при каждом повторном использовании позиции записи в MFT, что позволяет NTFS проверять внутреннюю целостность файловой системы. Файловая ссылка показана на рисунке.
Атрибуты файла NTFS
NTFS рассматривает файл не просто как хранилище текстовых или двоичных данных, а как совокупность пар атрибутов их значения, одна из которых содержит данные файла (соответствующий атрибут называется наименованным атрибутом данных). Другие атрибуты включают имя файла, метку времени и, возможно, дополнительные именованные атрибуты данных. Запись MFT для небольшого файла показана на рисунке.
Каждый атрибут файла хранится в файле как отдельный поток байтов. Строго говоря, NTFS читает и записывает не файлы, а потоки атрибутов. NTFS поддерживает следующие операции над атрибутами: создание, удаление, чтение (как диапазон байтов) и запись (как диапазон байтов). Сервисы чтения и записи обычно имеют дело с неименованным атрибутом данных. Однако вызывающая программа может указать другой атрибут данных, используя синтаксис именованных потоков данных. В таблице перечислены атрибуты для файлов на томах NTFS (не у каждого файла есть все эти атрибуты).
В таблице даны имена атрибутов, но на самом деле атрибуты соответствуют числовым кодам типов, используемым NTFS для упорядочения атрибутов в записи о файле. Файловые атрибуты в записи MFT размещаются в порядке возрастания числовых значений этих кодов. Некоторые типы атрибутов встречаются в записи дважды – например, если у файла несколько атрибутов данных или несколько имён.
Резидентные атрибуты.
Тело резидентного атрибута хранятся в файловой записи, расположенной внутри MFT. Если 8-разрядное поле, расположенное по смещению 08h байт от начала атрибутного заголовка, равно нулю – атрибут считается резидентным, а длина резидентного атрибута равна длине его заголовка (т.е., если к смещению атрибута добавить его длину, мы получим указатель на следующий атрибут или маркер конца, если текущий атрибут – последний в цепочке). Длина тела резидентных атрибутов, выраженная в байтах, храниться в 32-разрядном поле, расположенном по смещению 10h байт от начала атрибутного заголовка. 16-разрядное поле, следующее за ним, хранит смещение резидентного тела, отсчитываемое от начала атрибутного заголовка. На рисунке показана структура резидентного атрибута.
Нерезидентные атрибуты.
Тело нерезидентного атрибута хранится вне MFT, в одном или нескольких кластерах, перечисленных в заголовке данного атрибута в специальном списке. Если 8-разрядное поле, расположенное по смещению 08h байт от начала атрибутного заголовка, если единице – атрибут считается нерезидентным. Длина нерезидентного атрибута равна сумме длин его тела и заголовка (т.е., если к смещению атрибута добавить его длину, мы получим указатель на следующий атрибут или маркер конца, если текущий атрибут – последний в цепочке). У нерезидентных атрибутов для хранения длины их тела используется множество полей. Реальный размер тела атрибута (real size of attribute), выраженный в байтах, хранится в 64-разрядном поле, находящемся по смещению 30h байт от начала атрибутного заголовка. Следующее за ним 64-разрядное поле хранит инициализированный размер потока (initialized data size of the stream), выраженный в байтах и судя по всему всегда равный реальному размеру тела атрибута. 64-разрядное поле, расположенное со смещением 28h байт от начала атрибутного заголовка, хранит выделенный размер (allocated size of attribute), выраженный в байтах и равный реальному размеру тела атрибута округленному до размера кластера (в большую сторону).
В большинстве случав, номер первого кластера тела нерезидентного атрибута равен нулю, а последний количеству кластеров занятых телом атрибута, уменьшенном на единицу.
16-разрядное поле, расположенное со смещением 20h от начала атрибутного заголовка, содержит указатель на массив Data Runs, расположенный внутри этого заголовка и описывающий логический порядок размещения нерезидентного тела атрибута на диске. На рисунке показана структура нерезидентного атрибута.
38. Записи главной файловой таблицы NTFS (MFT) для резидентных атрибутов и для нерезидентных атрибутов. Виртуальные и логические номера кластеров.
NTFS рассматривает файл не просто как хранилище текстовых или двоичных данных, а как совокупность пар атрибутов и их значений, одна из которых содержит данные файла(соответствующий атрибут называется наименованным атрибутом данных). Другие атрибуты включают имя файла, метку времени и, возможно, дополнительные именованные атрибуты данных.
Каждый атрибут файла хранится в файле как отдельный поток байтов. Строго говоря, NTFS читает и записывает не файлы, а потоки атрибутов. NTFS поддерживает следующие операции над атрибутами: создание, удаление, чтение (как диапазон байтов) и запись (как диапазон байтов).
Атрибуты можно разделить на резидентные и нерезидентные. Если атрибут резидентный, то область данных атрибута находится непосредственно в теле самого атрибута. Если же атрибут нерезидентный, то он содержит только список ссылок на кластеры раздела, в которых находятся данные. Обычно нерезидентным является содержимое файла и дескриптор защиты.
Каждый атрибут в записи о файле идентифицируется кодом типа атрибута, имеет значение и необязательное имя. Значение атрибута представляет собой байтовый поток. Так, значением атрибута $FILE_NAME является имя файла, значением атрибута $DATA – произвольный набор байтов, сохранённых пользователем в файле.
У большинства атрибутов нет имени, хотя у $DATA и атрибутов, связанных с индексом, они обычно есть. Имена позволяют различать атрибуты файла, относящиеся к одному типу. Например, в файле с именованным потоком данных есть два атрибута $DATA: неименованный атрибут $DATA, хранящий неименованный по умолчанию поток данных, и именованный атрибут $DATA с именем дополнительного потока данных.
39. Структура больших файлов и каталогов в NTFS. Индексация файлов в NTFS.
Структура каталогов в NTFS
Каталог на NTFS представляет собой специфический файл, хранящий ссылки на другие файлы и каталоги, создавая иерархическое строение данных на диске. Файл каталога поделен на блоки, каждый из которых содержит имя файла, базовые атрибуты и ссылку на элемент MFT, который уже предоставляет полную информацию об элементе каталога.
Внутренняя структура каталога представляет собой бинарное дерево. Вот что это означает: для поиска файла с данным именем в линейном каталоге, таком, например, как у FAT, ОС приходится просматривать все элементы каталога, пока она не найдет нужный. Бинарное же дерево располагает имена файлов таким образом, чтобы поиск файла осуществлялся более быстрым способом - с помощью получения двухзначных ответов на вопросы о положении файла. Вопрос, который бинарное дерево способно дать ответ: в какой группе, относительно данного элемента, находится искомое имя - выше или ниже. Мы начинаем с такого вопроса к среднему элементу, и каждый ответ сужает зону поиска в среднем в два раза. Файлы, скажем, просто отсортированы по алфавиту, и ответ на вопрос осуществляется очевидным способом - сравнением начальных букв. Область поиска, суженная в два раза, начинает исследоваться аналогичным образом, начиная опять же со среднего элемента.
Вывод - для поиска одного файла среди 1000, например, FAT придется осуществить в среднем 500 сравнений (наиболее вероятно, что файл будет найден на середине поиска), а системе на основе дерева - всего около 10-ти (2^10 = 1024). Экономия времени поиска. Не стоит думать, что в традиционных системах (FAT) всё так запущено: во-первых, поддержание списка файлов в виде бинарного дерева довольно трудоемко, а во-вторых - даже FAT в исполнении современной системы (Windows2000 или Windows98) использует сходную оптимизацию поиска. Добавлять файл в каталог в виде дерева труднее, чем в линейный каталог – это достаточно сравнимые по времени операции. Дело в том, что для того, чтобы добавить файл в каталог, нужно сначала убедится, что файла с таким именем там еще нет, и вот тут-то в линейной системе будут трудности с поиском файла, которые компенсируют простоту добавления файла в каталог.
Какую информацию можно получить, просто прочитав файл каталога? То, что выдает команда dir. Для выполнения простейшей навигации по диску не нужно лазить в MFT за каждым файлом, надо лишь читать самую общую информацию о файлах из файлов каталогов. Главный каталог диска – корневой – ничем не отличается от обычных каталогов, кроме специальной ссылки на него из начала метафайла MFT.