Реализация файловой системы NTFS
Каждый том NTFS (например, дисковый раздел) содержит файлы, каталоги, битовые
массивы и другие структуры данных. Каждый том организован как линейная после-
довательность блоков (которые в терминологии компании Microsoft называются кла-
стерами), причем размер блоков для каждого тома фиксирован (в зависимости от раз-
мера тома он может изменяться от 512 байт до 64 Кбайт).
С сылки на блоки делаются с использованием
смещения от начала тома (при помощи 64-битных чисел).
Главная структура данных каждого тома — это MFT (Master File Table — главная табли-
ца файлов), которая является линейной последовательностью записей фиксированного
размера (1 Кбайт). Каждая запись MFT описывает один файл или один каталог. Она
содержит атрибуты файла (такие, как его имя и временная метка), а также список
дисковых адресов (где расположены его блоки). Если файл очень большой, то иногда
приходится использовать две или более записи MFT (чтобы разместить в них список
всех блоков). В этом случае первая запись в MFT, называемая основной записью (base
record), указывает на дополнительные записи в MFT.
Б итовый
массив отслеживает свободные элементы MFT.
Сама MFT также является файлом и в качестве такового может быть размещена в лю-
бом месте тома (таким образом устраняется проблема наличия дефектных секторов
на первой дорожке). Более того, при необходимости этот файл может расти (до мак-
симального размера в 248 записей).
К аждая запись MFT состоит из последовательности пар
(заголовок атрибута — значение). Каждый атрибут начинается с заголовка, рассказы-
вающего о том, что это за атрибут и какую длину имеет его значение. Некоторые зна-
чения атрибутов (такие, как имя файла и его данные) имеют переменную длину. Если
значение атрибута достаточно короткое для того, чтобы уместиться в записи MFT, то
оно помещается именно туда. Если же значение слишком длинное, то оно размещается
на диске, а в запись MFT помещается указатель на него. Это делает систему NTFS очень
эффективной для небольших полей, которые могут разместиться в самой записи MFT.
Первые 16 записей MFT резервируются для файлов метаданных NTFS (см. рис. 11.24).
Каждая из этих записей описывает нормальный файл, который имеет атрибуты и бло-
ки данных (как и любой другой файл). Каждый из этих файлов имеет имя, которое
начинается со знака доллара (чтобы обозначить его как файл метаданных). Первая
запись описывает сам файл MFT. В частности, в ней говорится, где находятся блоки
файла MFT (чтобы система могла найти файл MFT). Очевидно, что Windows нужен
способ нахождения первого блока файла MFT, чтобы найти остальную информацию по
ф айловой системе. Windows смотрит в загрузочном блоке — именно туда записывается
адрес первого блока файла MFT при форматировании тома.
Запись 1 является дубликатом начала файла MFT.
В торая запись — файл журнала. Когда
в файловой системе происходят структурные изменения (такие, как добавление нового
или удаление существующего каталога), то такое действие журналируется здесь до его
выполнения (чтобы повысить вероятность корректного восстановления в случае сбоя
во время операции, например такого, как отказ системы). Здесь также журналируются
изменения в файловых атрибутах. Фактически не журналируются здесь только из-
менения в пользовательских данных. Запись 3 содержит информацию о томе (такую,
как его размер, метка и версия).
А трибуты определяются в файле $AttrDef. Информация об
этом файле содержится в MFT (в записи 4). Затем идет корневой каталог, который сам
является файлом и может расти до произвольного размера. Он описывается записью
номер 5 в MFT.
Свободное пространство тома отслеживается при помощи битового массива. Сам би-
товый массив — тоже файл, его атрибуты и дисковые адреса даны в записи 6 в MFT.
С ледующая запись MFT указывает на файл начального загрузчика. Запись 8 исполь-
зуется для того, чтобы связать вместе все плохие блоки (чтобы обеспечить невозмож-
ность их использования для файлов). Запись 9 содержит информацию безопасности.
Запись 10 используется для установления соответствия регистра. Для латинских букв
A — Z соответствие регистра очевидно
О днако соответствие регистров для других языков н е столь
очевидно, поэтому данный файл рассказывает, как это сделать. И наконец, запись 11 —
это каталог, содержащий различные файлы для таких вещей, как дисковые квоты,
идентификаторы объектов, точки повторной обработки и т. д. Последние четыре записи
MFT зарезервированы для использования в будущем.
Каждая запись MFT состоит из заголовка записи, за которым следуют пары «заголо-
вок атрибута — значение». Заголовок записи содержит системный код, используемый
для проверки достоверности, последовательный номер (обновляемый каждый раз,
когда запись используется для нового файла), счетчик количества ссылок на файл,
фактическое количество использованных в записи байтов, идентификатор (индекс,
порядковый номер) основной записи (используется только для записей расширения),
а также некоторые другие поля.
NTFS определяет 13 атрибутов, которые могут появиться в записях MFT. Они пере-
числены в табл. 11.16. Каждый заголовок атрибута идентифицирует атрибут и содер-
жит длину и местоположение поля значения, а также разнообразные флаги и прочую
информацию. Обычно значения атрибутов следуют непосредственно за своими заго-
ловками атрибутов, но если значение слишком длинное для того, чтобы поместиться
в запись MFT, то оно может быть размещено в отдельных дисковых блоках. Такой атри-
бут называется нерезидентным атрибутом (nonresident attribute). Очевидно, что таким
атрибутом является атрибут данных. Некоторые атрибуты (такие, как имя) могут
Таблица 11.16. Используемые в записях MFT атрибуты
Атрибут Описание
Standard
information
Биты флагов, временные метки и т. д.
File name Имя файла в Unicode, может повторяться для имени MS-DOS
Security descriptor Устарел. Информация безопасности теперь находится в $Extend$Secure
Attribute list Местоположение дополнительных записей MFT (при необходимости)
Object ID Уникальный для данного тома 64-битный идентификатор файла
Reparse point Используется для монтирования и символических ссылок
Volume name Название данного тома (используется только в $Volume)
Volume information Версия тома (используется только в $Volume)
Index root Используется для каталогов
Index allocation Используется для очень больших каталогов
Bitmap Используется для очень больших каталогов
Logged utility stream Управляет журналированием в $LogFile
Data Данные потока, могут повторяться
п овторяться, но все атрибуты должны присутствовать в записи MFT в определенном
порядке. Заголовки резидентных атрибутов имеют длину 24 байта, заголовки нерези-
дентных атрибутов длиннее (поскольку они содержат информацию о том, где нужно
искать атрибут на диске).
Стандартное информационное поле содержит: сведения о владельце файла, информа-
цию безопасности, нужные для POSIX временные метки, количество жестких ссылок,
биты архивирования и «только для чтения» и т. д. Это поле имеет фиксированную дли-
ну и присутствует всегда. Имя файла — это строка переменной длины в коде Unicode.
Для того чтобы файлы с не соответствующими правилам MS-DOS именами могли
быть доступны старым 16-битным программам, они могут иметь короткие имена (short
name) по принятой в MS-DOS схеме 8 + 3. Если реальное имя файла соответствует
схеме именования в MS-DOS (8 + 3), то второе имя MS-DOS не нужно.
С писок атрибутов нужен в том случае, когда атрибуты не помещаются в запись MFT.
Из этого атрибута можно узнать, где искать записи расширения. Каждый элемент
списка содержит 48-битный индекс по MFT (который говорит о том, где находится
запись расширения) и 16-битный порядковый номер (для проверки того, что запись
расширения соответствует базовой записи).
Файлы NTFS имеют связанный с ними идентификатор, который подобен номеру
узла i-node в UNIX. Файлы можно открывать по идентификатору, но присваиваемый
файловой системой NTFS идентификатор не всегда можно использовать, поскольку
он основан на записи MFT и может измениться при перемещении записи для данного
файла (например, если файл восстанавливается из резервной копии). NTFS позволя-
ет использовать отдельный атрибут «идентификатор объекта», который может быть
установлен для файла и который нет необходимости изменять. Его можно сохранить
вместе с файлом (например, если он копируется на новый том).
Точка повторной обработки сообщает разбирающей имя файла процедуре о необходи-
мости сделать что-то особенное. Этот механизм используется для явного монтирования
файловых систем и для символических ссылок. Два атрибута тома используются только
для идентификации томов. Следующие три атрибута работают с реализацией катало-
гов. Маленькие каталоги — это просто списки файлов, а большие реализованы как де-
ревья В+. Атрибут logged utility stream используется шифрующей файловой системой.
п отоку (или потокам)
данных. Файл в NTFS имеет один (или несколько) связанных с ним потоков данных.
Именно здесь находится его полезное содержание. Поток данных по умолчанию
(default data stream) названия не имеет (например, dirpath\filename::$DATA), но аль-
тернативные потоки данных (alternate data stream) имеют имена, например: dirpath\
filename:streamname:$DATA.
Имя каждого потока (если оно имеется) находится в заголовке этого атрибута. Сле-
дом за заголовком идет либо список дисковых адресов (это содержащиеся в потоке
блоки), либо (для потоков всего в несколько сотен байтов, а таких много) сам поток.
Р азмещенные в записи MFT реальные данные потока называются непосредственным
файлом — immediate file