NTFS: Анализ Структуры Данных Файловой Системы
Анализ структуры данных файловой системы NTFS поможет вам понять, как устроена эта система хранения информации. В нашей статье мы разберем основные принципы и компоненты NTFS, чтобы вы смогли лучше понимать ее работу и обеспечить безопасность ваших данных.
Что такое NTFS
Файловая система NTFS была разработанная компанией Microsoft с чистого листа для использования в новой операционной системе Windows NT. NTFS должна была заменить собой устаревшую на тот момент файловую систему FAT, многочисленные ограничения которой не позволяли организовать работу в действительно многопользовательской и многозадачной системе.
Разработчики NTFS поставили цель спроектировать надёжную, безопасную, расширяемую и отказоустойчивую файловую систему для HDD-дисков. Им это прекрасно удалось: файловая система получилась на редкость удачной, однако у нее есть как сильные, так и слабые стороны в сравнение с FAT.
Все данные – файлы
В файловой системе FAT ни одну часть данных нельзя было назвать «файлом» в полном смысле этого слова. Концепция NTFS была полностью переработана. В архитектуре NTFS все данные, включая служебные структуры самой файловой системы, универсально представлены в виде файлов. Более того: в NTFS даже сама файловая система представлена в виде отдельных файлов!
В виде файлов хранятся и административные данные базовой файловой системы – те самые данные, которые в других файловых системах находятся в скрытых областях по фиксированному адресу. В NTFS нет нужды резервировать какие-то особые области под файловые таблицы, таблицу разделов или журнал транзакций: они хранятся в виде обычных файлов и могут физически располагаться в любом месте тома.
При необходимости эти файлы могут менять свой размер (в частности, файловые таблицы заметно «распухают» при хранении на томе большого числа файлов), при этом системой используются стандартные механизмы, предусмотренные для работы с файлами. Если не будет непрерывного участка для хранения данных файловой системы – ничего страшного: файл будет фрагментирован (сохранён в виде нескольких фрагментов в разных частях диска).
Описанная концепция является основополагающим принципом NTFS. В отличие от других файловых систем, в NTFS нет жёстко заданной структуры. В ней нет, как в FAT, раздельных областей для системных структур, файловых таблиц и собственно данных. В NTFS вся файловая система считается областью данных, поэтому любой файл может быть сохранён в любом секторе тома. Единственным неизбежным исключением являются загрузочный сектор и загрузочный код, расположенные в первых секторах тома.
Файловая таблица MFT
NTFS хранит информацию о файлах и каталогах в главной файловой таблице MFT. Эта таблица содержит информацию обо всех файлах и каталогах. Каждому файлу или каталогу соответствует как минимум одна запись. Формат записей MFT исключительно прост. Размер записи составляет 1 КБ, при этом первые 42 байта заголовка имеют жёстко заданное предназначение. Остальное пространство используется для хранения атрибутов – например, имени файла и системных атрибутов. Уникальной является возможность сохранения небольших файлов непосредственно в MFT. В этом случае файл хранится в виде атрибута.
Рис. 1. Структура записи MFT, включающая заголовок и три атрибута.
Формат записи MFT
Формально размер записи MFT определяется переменной в загрузочном секторе. Однако все существующие версии Microsoft Windows используют записи размером 1024 байт. В начале записи расположен заголовок размером 42 байта, который содержит 12 полей. Остальные 982 байта не имеют фиксированной структуры и используются для хранения атрибутов.
Формат записи MFT чрезвычайно прост и очень удобен как для быстрой работы операционной системы, так и для поиска удалённых файлов. Фактически запись MFT представляет с собой небольшую ячейку, позволяющую положить в неё всё, что угодно – но в пределах её размера (982 байта). Начало записи зарезервировано для «этикетки», позволяющей корректно идентифицировать и адресовать ячейку.
Адреса записей MFT
Записи MFT адресуются в 48-битной системе, при этом первой записи соответствует нулевой адрес. Адрес последней (максимальной) записи изменяется по мере расширения MFT. Его можно измерить, разделив размер файла $MFT на размер каждой записи. Учитывая, что размер записи в Windows – ровно 1 КБ, данная операция не представляет проблемы.
Записи MFT пронумерованы. Каждой записи соответствует 16-разрядный порядковый номер. При создании новой записи этот номер автоматически увеличивается.
К примеру, рассмотрим запись MFT 313 с порядковым номером 1. При удалении файла, которому была выделена эта запись, и выделении записи другому файлу записи MTF будет выделен новый порядковый номер 2.
Адрес файла формируется следующим образом. Адрес записи MFT объединяется с порядковым номером, занимающим старшие 16 бит. Таким образом формируется уникальный 64-разрядный базовый адрес файла.
Рис. 2. Базовый адрес файла формируется объединением адреса записи MFT и её порядкового номера.
Для обращения к записям MFT в файловой системе NTFS используется порядковый номер записи. Использование уникального порядкового номера записи предоставляет и дополнительное удобство: оно упрощает выявление повреждений файловой системы. К примеру, если сбой происходит на этапе выделения структур данных для нового файла, то по порядковому номеру записи MFT можно будет определить, какому файлу принадлежит данная запись – новому или предыдущему. Соответственно, порядковый номер используют программы для восстановления данных NTFS.
Атрибуты записей MFT
NTFS – уникальная файловая система, не имеющая, в отличие от FAT, жёстко заданной структуры записей. Каждая запись MFT минимально структурирована. Есть заголовок, и есть место для хранения разнообразных атрибутов. Причём атрибутом может быть практически всё, что угодно – дата, время, имя файла и так далее – вплоть до собственно содержимого файла!
Атрибуты могут хранить самую разнообразную информацию. Понятно, что разные типы информации могут быть записаны в разных форматах и занимать больше или меньше места в записи.
Рис. 3. Пример записи MFT с заголовком записи, двумя атрибутами и неиспользуемой областью.
Итак, атрибуты могут содержать любую информацию. Но у каждого атрибута есть универсальная часть: заголовок. Формат заголовка стандартизован и одинаков для всех атрибутов. А вот содержимое атрибута может быть произвольной формы и размера.
В статье «Алгоритм восстановления данных с раздела NTFS» мы рассмотрим процесс поиска и восстановления удаленного файла.