Архитектура тома и таблица MFT

Дисковое пространство в NTFS разбивается на кластеры фиксированного размера, который обычно составляет 4 килобайта. Отсчёт структуры начинается с загрузочного сектора VBR, указывающего смещение ключевого компонента системы — таблицы Master File Table ($MFT). Эта таблица представляет собой базу данных обо всех объектах тома, включая пользовательские файлы, системные каталоги и служебные структуры самой файловой системы.

Разработчики реализовали принцип предельной унификации, превратив саму разметку тома в набор скрытых файлов. Первые шестнадцать записей таблицы $MFT жестко зарезервированы под системные нужды. Для защиты таблицы от фрагментации драйвер NTFS резервирует под неё около 12,5 процента свободного места тома в виде непрерывной MFT-зоны. Пользовательские файлы начинают записываться в эту область только тогда, когда остальное пространство накопителя полностью исчерпано.

  • Файл $MFT содержит саму главную таблицу и дескрипторы абсолютно всех файлов диска
  • Файл $MFTMirr хранит дубликат первых критически важных записей на случай физического повреждения начала таблицы
  • Файл $LogFile работает как циклический журнал транзакций для регистрации изменений файловой структуры
  • Файл $Volume содержит технические параметры тома, включая его метку и версию файловой системы
  • Файл $Bitmap представляет собой битовую карту распределения свободного и занятого пространства кластеров
  • Файл $BadClus ведет учет поврежденных секторов диска и исключает их из распределения памяти

Строение записи файла и работа с атрибутами

Каждая запись в таблице MFT имеет фиксированную длину 1024 байта. Она состоит из заголовка со служебными флагами и переменного набора атрибутов. В концепции NTFS сам файл лишен монолитного тела, он существует как совокупность разнородных атрибутов. Имя файла, права доступа, временные метки создания и само полезное содержимое хранятся в отдельных независимых потоках.

По способу размещения данных атрибуты делятся на резидентные и нерезидентные. Резидентные атрибуты целиком помещаются внутри отведенного килобайта записи MFT. Если размер полезной нагрузки превышает примерно 700 байт, атрибут содержимого $DATA переводится в нерезидентный статус. В этом случае внутри MFT-записи остается только цепочка отрезков или списки экстентов (runlists), хранящие пары значений со смещением и длиной кластеров, выделенных под данные на физическом носителе.

Механизм транзакционного журналирования в $LogFile

Устойчивость NTFS к аппаратным сбоям и скачкам питания опирается на модель упреждающей записи в журнал (Write-Ahead Logging). Служебный файл $LogFile организован в виде двух кольцевых очередей, куда драйвер файловой системы записывает все планируемые операции с метаданными до того, как они будут зафиксированы на диске.

Любое структурное действие вроде создания папки, изменения размера файла или удаления дескриптора оформляется как атомарная транзакция. Запись в журнале содержит пару компенсирующих функций. Функция Redo указывает, как повторить действие при сбое, а функция Undo содержит инструкции по откату изменений к исходному состоянию, если транзакция оборвалась на середине.

Алгоритм восстановления при перезапуске

Когда операционная система монтирует том после некорректного выключения, драйвер NTFS запускает процедуру самовосстановления без полного сканирования поверхности диска. Процесс состоит из трёх последовательных шагов.

  1. Этап анализа считывает контрольные точки журнала и формирует список транзакций, прерванных в момент аварии
  2. Этап наката (Redo) применяет все подтвержденные операции из журнала к метаданным диска, доводя файловые структуры до актуального состояния
  3. Этап отката (Undo) отменяет частично выполненные и неподтвержденные транзакции, возвращая кластеры и указатели MFT к безопасному виду

Индексация директорий через B-деревья

Каталоги в NTFS не хранятся в виде простых линейных списков. Мелкие директории умещаются внутри атрибута $INDEX_ROOT в записи MFT. Когда число файлов в папке вырастает, файловая система задействует нерезидентный атрибут $INDEX_ALLOCATION и выстраивает сбалансированное B-дерево.

Такая организация позволяет процессору находить файлы по имени с логарифмической алгоритмической сложностью O(log N). Даже если в одной директории находится полмиллиона файлов, поиск конкретной записи требует всего несколько чтений индексных узлов с накопителя. Для быстрого отслеживания изменений поверх этой структуры работает журнал изменений USN Journal ($UsnJrnl), фиксирующий факт модификации файлов для поисковых служб и антивирусного ПО.

Сравнение NTFS и ext4

Файловая система ext4, стандартная для большинства дистрибутивов Linux, использует совершенно иной архитектурный фундамент. Вместо централизованной реляционной базы MFT в ext4 применяется схема с фиксированными индексными дескрипторами (inodes). Таблица inode создается один раз при форматировании раздела, в результате чего диск в Linux может переполниться по количеству доступных inode даже при наличии свободных гигабайтов памяти. В NTFS таблица MFT расширяется динамически по мере создания новых файлов.

Журналирование в ext4 реализовано через отдельный слой ядра JBD2 и поддерживает три режима работы. Режим data=journal записывает в журнал и метаданные, и пользовательские данные, обеспечивая максимальную сохранность файлов ценой падения скорости записи. Режим data=ordered заносит в журнал только метаданные, предварительно сбрасывая данные файлов на накопитель. Архитектура NTFS жестко ориентирована на журнал метаданных, оптимизированный под быстрый отклик и параллельную обработку запросов Windows.

  • Разграничение доступа в NTFS строится на сложных дескрипторах безопасности Security Descriptor с тонкими списками контроля ACL, тогда как ext4 базируется на классической модели прав POSIX и расширенных атрибутах xattr
  • Поддержка потоков данных в NTFS реализована аппаратно через Alternative Data Streams (ADS), позволяющие привязывать скрытые метапотоки к файлу, в то время как ext4 хранит подобные сведения через атрибуты безопасности SELinux
  • Максимальный размер отдельного тома и файла в NTFS теоретически ограничен 16 эксабайтами, а в ext4 лимит на размер тома составляет 1 эксабайт при максимальном размере файла в 16 терабайт

Частые вопросы

Зачем запускать chkdsk, если в файловой системе есть журнал $LogFile?

Журнал транзакций защищает метаданные от программных прерываний и сбоев питания, но бессилен против аппаратных дефектов пластин HDD или ячеек SSD. Утилита chkdsk проверяет физическое состояние поверхности накопителя, сверяет битовую карту $Bitmap с реальным деревом ссылок и изолирует сбойные секторы в файле $BadClus.

Что такое альтернативные потоки данных (ADS)?

Это встроенная возможность NTFS прикреплять к одной записи MFT несколько независимых атрибутов $DATA. Браузеры используют этот механизм для маркировки файлов меткой «Zone.Identifier», указывающей на загрузку из интернета, при этом основной файл для пользователя выглядит монолитным.

Почему размер занятого места на диске больше реального размера файлов?

Дисковое пространство выделяется целыми кластерами размером 4 КБ. Файл размером 10 байт займет на диске полный кластер. Разницу формируют потери на концах кластеров (slack space), служебные структуры MFT, теневые копии VSS и сам циклический файл журнала $LogFile.

Что происходит при переполнении таблицы MFT?

Таблица MFT не имеет жесткого предела. Когда резервная MFT-зона в 12,5 процента тома заполняется записями, система выделяет под нее новые блоки из общего свободного дискового пространства. В условиях сильного дефицита места это может вызывать фрагментацию самой таблицы MFT.