Ntfs mft extents что это

Обновлено: 07.07.2024

В этой статье описывается, как NTFS зарезервировать пространство для своей таблицы файлов Master (MFT).

Применяется к: Windows 10 — все выпуски, Windows Server 2012 R2
Исходный номер КБ: 174619

Сводка

Файловая система NTFS содержит в своем ядре файл, называемый основной таблицей файлов (MFT). В MFT есть по крайней мере одна запись для каждого файла в томе NTFS, включая сам MFT.

Так как утилиты, которые дефрагментировать объемы NTFS, не могут перемещать записи MFT, а также из-за чрезмерной фрагментации MFT может повлиять на производительность, NTFS оставляет пространство для MFT, чтобы сохранить MFT как можно более соразмерным по мере его роста.

В Windows, defrag utility defrag defrags the MFT.

Утилита defrag

Операция по дефрагмации MFT объединяет MFT-файл в 1 и предотвращает его хранение в нескольких местах, которые не являются последовательной на диске. В этом классе операций MFT-файл более последовательно. Однако именно размер MFT-файла был до операции defrag.

MFT может быть слишком большим, если в томе было много удаленных файлов. Удаленные файлы вызывают внутренние дыры в MFT. Эти дыры являются значительными регионами, которые неиспользована файлами. Это пространство невозможно восстановить. Это по крайней мере верно в томе NTFS в прямом эфире.

Дополнительная информация

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

(Записи каталога, внешние для MFT, также содержат некоторые избыточные сведения о файлах. Но полное обсуждение всех структур NTFS выходит за рамки этой статьи.)

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

Из-за важности MFT для NTFS и возможного влияния на производительность, если этот файл становится сильно фрагментирован, NTFS делает особые усилия, чтобы сохранить этот файл сопоставительным. NTFS зарезервировать 12,5% объема для эксклюзивного использования MFT до тех пор, пока не будет использована остальная часть тома. Таким образом, пространство для файлов и каталогов не выделяется из этой зоны MFT, пока все остальные места не будут выделены в первую очередь.

Вы можете изменить ключ реестра NtfsMFTZoneReservation, чтобы увеличить объем Windows. Дополнительные сведения о MFT см. в разделе Ключевые элементы в разделе Процесс дефрагментации диска в разделе Поддержание максимальной производительности Windows 2000с помощью defragmentation .

В зависимости от среднего размера файла и других переменных, резервная зона MFT или незаслуженный пробел на диске могут использоваться перед другими, когда диск заполняется до емкости.

Тома с небольшим количеством относительно больших файлов сначала изматывали неотбываемую площадь, в то время как объемы с большим количеством относительно небольших файлов сначала выматывали пространство зоны MFT. В любом случае фрагментация MFT начинает происходить при заполнении одного региона или другого. Если незаслуженный пробел становится полным, из зоны MFT, конкурирующей с MFT для выделения, начинает выделяться пространство для пользовательских файлов и каталогов. Если зона MFT становится полной, пространство для новых записей MFT выделяется из оставшейся части диска, снова конкурируя с другими файлами.

Новый параметр реестра может увеличить процент тома, который NTFS зарезервировать для своей таблицы основных файлов. NtfsMftZoneReservation — это REG_DWORD значение, которое может принимать значение между 1 и 4, где 1 соответствует минимальному размеру зоны MFT, а 4 — максимальному. Если параметр не указан или не установлено недействительное значение, для этого параметра NTFS использует значение 1 по умолчанию. Точные коэффициенты, соответствующие каждому параметру, не имеют документов, так как они не стандартизированы и могут изменяться в будущих выпусках. Чтобы узнать, какие параметры лучше для среды, может потребоваться поэкспериментировать с различными значениями.

Чтобы определить текущий размер MFT на компьютере Windows, введите команду на dir /a $mft томе NTFS.

Чтобы определить текущий размер MFT на компьютере Windows, используйте диск Defragmenter для анализа диска NTFS и нажмите кнопку Просмотр отчета. Это отображает статистику дисков, включая текущий размер MFT и количество фрагментов.

Defragmenter диска отображает зеленый цвет для так называемых системных файлов и на форматированном томе NTFS это просто сочетание MFT, pagefile.sys (если он существует на этом томе) и то, что называется "MFT Zone" или зарезервированное пространство для расширения MFT. В отчете о дефрагментации отображаются только сведения о pagefile и MFT; В нем не упоминается зона MFT, так как она никак не влияет на использование диска или емкость.

Зона MFT не вычитается из доступного (свободного) пространства дискового пространства, используемого для файлов пользовательских данных, это только пространство, которое используется последним. Когда MFT необходимо увеличить размер, например, вы создали новые файлы и каталоги, он сначала будет взят из зоны MFT, что снижает фрагментацию MFT и оптимизирует производительность MFT.

Зона MFT по умолчанию вычисляется и резервируется Ntfs.sys при монтаже тома и зависит от размера тома. Вы можете увеличить зону MFT с помощью записи реестра, описанной ниже, но нельзя сделать зону MFT по умолчанию меньше, чем то, что рассчитывается Ntfs.sys. Увеличение зоны MFT не уменьшается в любом случае дискового пространства, которое может использоваться пользователями для файлов данных.

Результаты, возвращаемые командой dir, могут быть не актуальными. Размер, о чем сообщает команда dir, может отражать кэшные данные, отражающие размер MFT на момент начала работы системы после упорядоченного отключения.

В этот раздел, описание метода или задачи включены действия, содержащие указания по изменению параметров реестра. Однако неправильное изменение параметров реестра может привести к возникновению серьезных проблем. Поэтому следует в точности выполнять приведенные инструкции. Для дополнительной защиты создайте резервную копию реестра, прежде чем редактировать его. Так вы сможете восстановить реестр, если возникнет проблема. Дополнительные сведения о том, как создать и восстановить реестр, см. в этой информации, как создать и восстановить реестр в Windows.

Чтобы добавить это значение, выполните следующие действия:

Запустите редактор реестра (Regedt32.exe) и перейдите к следующему подкайке:

Из меню Редактирование нажмите кнопку Добавить значение.

Введите следующую информацию в диалоговом окне:

  • Имя значения: NtfsMftZoneReservation
  • Тип данных: REG_DWORD
  • Данные: (допустимый диапазон 1-4)

Перезапустите редактор реестра и перезапустите компьютер.

Это параметр времени работы и не влияет на фактический формат тома. Скорее, это влияет на то, как NTFS выделяет пространство для всех томов в данной системе. Поэтому для полной эффективности параметр должен действовать со времени формата тома и на протяжении всего времени его работы. Если параметр реестра корректируется вниз или удаляется, зона MFT будет соответственно уменьшена, но это не повлияет на уже выделенное и используемую MFT-пространство.

В предыдущих статьях мы неоднократно затрагивали тему повреждений HDD. Но что случится, если эти повреждения приобретут массовый характер во всего лишь одном накопителе? Такое развитие событий приведет к неизбежному сбою главной таблицы файлов диска и ряду других неприятных последствий.

Что такое главная таблица файлов?

Главная или Общая таблица файлов диска (Master File Table, MFT) — документ, хранящийся исключительно в файловой системе NTFS. Он является важнейшим винтиком в механизме работы данной системы, поскольку хранит в себе такую информацию как размер, дату и время записи, содержимое файлов.

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

Симптомы повреждения

Как и в случае с любой другой ошибкой, повреждения MFT также не проходят бесследно. Они проявляются следующим образом:

The type of the file system is NTFS.
Volume label Work Folder.
Corrupt master file table. Windows will attempt to recover master file table from disk.
Windows cannot recover master file table. CHKDSK aborted.

Примечание:
Volume label (метка тома) — это название диска, которое в вашем случае может отличаться.

Причины ошибки

В большинстве случаев, повреждение раздела NTFS смело свидетельствует о наличии сбоя главной таблицы файлов. Причин, способных спровоцировать возникновение неполадки, существует множество, но мы разберем самые основные:

  • Сбой в работе операционной системы. Например, BSOD (синий экран смерти).
  • Вирус, предназначенный для повреждения MFT.
  • Неправильное извлечение диска (вы могли отключить его в момент неполного завершения работы компьютера).
  • Сбой приложения.
  • Наличие битых секторов.

Вне зависимости от причины возникновения неполадки, всегда есть шанс на восстановление диска и данных на нем. Каждая из приведенных ниже инструкций позволит своей простотой существенно сэкономить ваше личное время с большой долей вероятности вернуть HDD к жизни. Приступим!

Восстановление поврежденной таблицы файлов

Дефрагментация диска

В некоторых случаях причиной отказа работы MFT и, как следствие, всей системы NTFS является чрезмерное фрагментирование диска. Решить этот вопрос можно следующим образом:

1. Откройте Мой компьютер .

2. Щелкните правой кнопкой по логическому разделу или физическому диску, с которым предстоит работать, и перейдите в Свойства .


Стандарт файловой системы NTFS версии 3.1 появился в 2001 году с выходом на рынок Windows XP и с тех пор не претерпел фундаментальных изменений. В Windows 10 также используется NTFS v3.1. Архитектуру и особенности внутреннего устройства этой файловой системы Крис Касперски подробно описал в своей книге «Восстановление данных», которая сейчас готовится к переизданию. Мы публикуем отрывок из этой книги, где Крис рассказывает о том, что представляет собой NTFS изнутри.

NTFS с высоты птичьего полета

Основным структурным элементом всякой файловой системы является том (volume), в случае с FAT совпадающий с разделом (partition). NTFS поддерживает тома, состоящие из нескольких разделов (см. рис.). Будем для простоты считать, что том представляет собой отформатированный раздел (то есть раздел, содержащий служебные структуры файловой системы).

Большинство файловых систем трактуют том как совокупность файлов, свободного дискового пространства и служебных структур файловой системы, но в NTFS все служебные структуры представлены файлами, которые (как это и положено файлам) могут находиться в любом месте тома, при необходимости фрагментируя себя на несколько частей.

Основным служебным файлом является главная файловая таблица, $MFT (Master File Table) — своеобразная база данных, хранящая информацию обо всех файлах тома: их именах, атрибутах, способе и порядке размещения на диске. Каталог также является файлом особого типа, со списком принадлежащих ему файлов и вложенных подкаталогов. Важно подчеркнуть, что в MFT присутствуют все файлы, находящиеся во всех подкаталогах тома, поэтому для восстановления диска наличия файла $MFT будет вполне достаточно.

Остальные служебные файлы, называемые метафайлами (metafiles) или метаданными (metadata), всегда имеют имена, начинающиеся со знака доллара ( $ ), и носят сугубо вспомогательный характер, интересный только самой файловой системе. К ним в первую очередь относится: $LogFile — файл транзакций, $Bitmap — карта свободного/занятого пространства, $BadClust — перечень плохих кластеров. Текущие версии Windows блокируют доступ к служебным файлам с прикладного уровня (даже с правами администратора!), и всякая попытка открытия или создания такого файла в корневом каталоге обречена на неудачу.

Классическое определение, данное в учебниках информатики, отождествляет файл с именованной записью на диске. Большинство файловых систем добавляет к этому понятие атрибута (attribute) — некоторой вспомогательной характеристики, описывающей время создания, права доступа и так далее. В NTFS имя файла, данные файла и его атрибуты полностью уравнены в правах. Иначе говоря, всякий файл NTFS представляет собой совокупность атрибутов, каждый из которых хранится как отдельный поток байтов. Поэтому, во избежание путаницы, атрибуты, хранящие данные файла, часто называют потоками (streams).

Каждый атрибут состоит из тела (body) и заголовка (header). Атрибуты подразделяются на резидентные (resident) и нерезидентные (non-resident). Резидентные атрибуты хранятся непосредственно в $MFT , что существенно уменьшает грануляцию дискового пространства и сокращает время доступа. Нерезидентные атрибуты хранят в $MFT лишь свой заголовок, описывающий порядок размещения атрибута на диске.

Назначение атрибута определяется его типом (type), представляющим собой четырехбайтное шестнадцатеричное значение. При желании атрибуту можно дать еще и имя (name), состоящее из символов, входящих в соответствующее пространство имен (namespace). Подавляющее большинство файлов имеет по меньшей мере три атрибута. К их числу относится стандартная информация о файле (время создания, модификации, последнего доступа, права доступа), которая хранится в атрибуте типа 10h , условно обозначаемом $STANDARD_INFORMATION . Ранние версии Windows NT позволяли обращаться к атрибутам по их условным обозначениям, но начиная с Windows 2000 мы лишены этой возможности. Полное имя файла (не путать с путем!) хранится в атрибуте типа 30h ( $FILE_NAME ).

Если у файла есть одно или несколько альтернативных имен, таких атрибутов может быть и несколько. Здесь же хранится ссылка (file reference) на родительский каталог, позволяющая разобраться, к какому каталогу принадлежит данный файл или подкаталог. По умолчанию данные файла хранятся в безымянном атрибуте типа 80h ( $DATA ). Однако при желании прикладные программы могут создавать дополнительные потоки данных, отделяя имя атрибута от имени файла знаком двоеточия (например: ECHO xxx > file:attr1; ECHO yyy > file:attr2; more < file:attr1; more < file:attr2 ).

Изначально в NTFS была заложена способность индексации любых атрибутов, значительно сокращающая время поиска файла по заданному списку критериев (например, времени последнего доступа). Индексы хранятся в виде двоичных деревьев, поэтому среднее время выполнения запроса оценивается как O(lg n) . На практике в большинстве драйверов NTFS реализована индексация лишь по имени файла. Как уже говорилось ранее, каталог представляет собой файл особого типа — файл индексов. В отличие от FAT, где файл каталога представляет собой единственный источник данных об организации файлов, в NTFS файл каталога используется лишь для ускорения доступа к содержимому каталога. Он не является обязательным, так как ссылка на родительский каталог всякого файла в обязательном порядке присутствует в атрибуте его имени ( $FILE_NAME ).

Продолжение доступно только участникам

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Крис Касперски

Известный российский хакер. Легенда ][, ex-редактор ВЗЛОМа. Также известен под псевдонимами мыщъх, nezumi (яп. 鼠, мышь), n2k, elraton, souriz, tikus, muss, farah, jardon, KPNC.

NTFS (NT File System) – файловая система, которая разрабатывалась Microsoft специально для Windows NT. Написание NTFS шло параллельно с разработкой самой этой ОС. Известно, что NT зарождалась не в вакууме; в ее основу были положены идеи серверной системы VMS «high-end» класса компании DEC (в 1998 она была куплена Compaq, которая затем была поглощена Hewlett-Packard). ОС VMS работала на железе DEC, включая 32-битные компьютеры VAX и 64-битные машины на основе процессора Alpha. Каким-то образом команда, работавшая над созданием VMS, перекочевала в Microsoft для создания NT. Во главе этой команды находился Дэйв Катлер (Dave Cutler), крестный отец NT, разработчик ядра системы. Основная версия причины перехода Катлера в Microsoft – закрытие проекта разработки нового RISC-процессора и соответствующей ОС, в котором он работал вместе со своей командой инженеров. В результате, не без участия Билла Гейтса, Дэйв со своей командой оказался в Microsoft. Кстати, Гейтс был очень заинтересован в создании новой ОС, потому что у Microsoft на тот момент была только Windows, пригодная для домашних пользователей, а выхода на рынок серверов не было.

Архитекторами NTFS были Том Миллер (Tom Miller) и Гэри Кимура (Gary Kimura), которые работали программистами в команде Катлера в DEC. Так же, как NT влила в себя идеи VMS, NTFS основывалась на идеях файловой системы VMS – Files-11, в которой, в частности, поддерживались списки контроля доступом (ACL), а также ввод/вывод, ориентированный на записи (record-oriented I/O) [1] [2].

  • Восстанавливаемость. В случае сбоя диска, NTFS должна привести себя в рабочее, целостное состояние. В лучшем случае, NTFS вернется в состояние, которое непосредственно предшествовало сбою, в худшем какая-то пользовательская информация может быть потеряна, но том останется в рабочем состоянии. Восстанавливаемость реализуется через модель обработки транзакций. Транзакция не что иное, как операция I/O, которая изменяет структуры NTFS. Если такая операция не завершается полностью, то NTFS откатывает свои структуры данных до состояния перед выполнением транзакции.
  • Защита от несанкционированного доступа. Файлы и каталоги NTFS обладают дескрипторами защиты, что позволяет контролировать доступ к ним в рамках общей модели безопасности NT. Подобными дескрипторами защиты обладают все объекты NT (процессы, потоки, разделы и пр.).
  • Отказоустойчивость. Если восстанавливаемость гарантирует целостность тома после сбоя, то отказоустойчивость может гарантировать восстановление пользовательских данных. Это реализуется за счет избыточности данных и RAID. Дублирование данных осуществляется на уровне диспетчера томов, который копирует записываемые данные на другом диске.
  • Диски и файлы большого объема. В NTFS реализуется очень эффективная поддержка больших дисков и файлов. Для хранения номера кластера используется 64 бита или 8 байт. Т. о. NTFS позволяет адресовывать 2^64 кластеров, при стандартном размере кластера в 4KB и максимальном 64KB. Под размер файлов также выделено 8 байт, что позволяет адресовывать очень большие файлы.
  • Поддержка POSIX. Также как NT, NTFS полностью соответствует стандарту POSIX 1003.1. Главная особенность формата заключается в назначении имен файлам с учетом регистра символов, а также реализация жестких связей (hard links). Жесткие связи позволяют файлам из разных каталогов ссылаться на одни и те же данные. Жесткая связь создается для существующего файла и указывает на его данные, хотя для пользователя такой объект выглядит как файл.

Разработка новой файловой системы, которая должна удовлетворять вышеперечисленным требованиям очень сложный процесс и здесь разработчики учли опыт MS в разработке FAT и HPFS. Том Миллер так описывает процесс разработки новой ФС:

Работа над файловой системой – это, пожалуй, самое ужасное [при разработке операционной системы]. Если обнаружилась в ядре системы, или что-нибудь странное происходит с дисплеем, то можно просто перезагрузить машину и продолжать работу. Но если что-то случилось с жестким диском, то часто дальнейшая работа вообще невозможна. Всех страшно раздражают ошибки в файловой системе. Никому не хочется, чтобы его постоянная память стала не постоянной.
  • Версия 1.0. Была выпущена вместе с NT 3.1 в середине 1993. Включает самый основной функционал ФС.
  • Версия 1.1. Была выпущена вместе с NT 3.5 в 1994.
  • Версия 1.2. Была написана для NT 3.51 (середина 1995) и для NT 4 (середина 1996); последняя, также известна как «NTFS 4.0». Добавлена поддержка сжатия файлов, именованных потоков, защита файлов на основе списков ACL.
  • Версия 3.0. Поставляется с Windows 2000 (известна как «NTFS V5.0»). Добавлена поддержка дисковых квот, шифрования, разреженных файлов (sparse files), точек повторного разбора (reparse points), служебный метакаталог $Extend и его файлы
  • Версия 3.1. Поставляется с Windows XP (осень 2001, «NTFS V5.1»), Windows 2003 (весна 2003, «NTFS V5.2»), Windows Vista (середина 2005, «NTFS V6.0»).

Общие концепции NTFS

  • Метафайлы NTFS – служебные файлы, используемые NTFS для поддержания своей внутренней структуры.
  • Том (volume) NTFS – раздел, отформатированный под NTFS.
  • Главная загрузочная запись (Master Boot Record) – первый сектор жесткого диска, который содержит загрузочный код (bootstrap code) и таблицу разделов (partition table). Загрузочный код читает таблицу разделов, ищет активный (флаг 0x80) раздел и передает управление на его первый сектор (загрузочный сектор).
  • Загрузочный сектор (boot sector) – первый сектор тома, в котором хранятся параметры ФС. Также в загрузочный сектор входит код, который отвечает за чтение ntldr в память. Такой код несет смысл только если том является системным (т. е. только для диска C). В процессе монтирования тома, ntfs.sys проводит валидацию загрузочного сектора и признает его своим в случае совпадение необходимых параметров.
  • Системный том (system volume) – том, на котором располагается ntldr. Для NT системным томом может быть только первый том – С:. Загрузочный том (boot volume) – том, на котором располагается папка windows (winnt).

Формат загрузочного сектора NTFS описывается следующей таблицей (как и все остальные описываемые структуры, наилучшим руководством по ним может служить книга Брайана Кэрриэ «Криминалистический анализ файловых систем»).

Смещение Размер в байтах Описание
0x0 3 Команда перехода на загрузочный код.
0x3 8 Сигнатура ‘NTFS ’.
0xB 2 Количество байт на сектор
0xD 1 Количество секторов в кластере.
0xE 2 Должно равняться нулю.
0x10 1 Должно равняться нулю.
0x11 2 Должно равняться нулю.
0x13 2 Должно равняться нулю.
0x15 1 Тип носителя
0x16 2 Должно равняться нулю.
0x18 2 Должно равняться нулю.
0x1A 2 Должно равняться нулю.
0x1C 4 Не используется.
0x20 4 Должно равняться нулю.
0x24 4 Не используется.
0x28 8 Число секторов в томе.
0x30 8 Стартовый кластер MFT.
0x38 8 Стартовый кластер копии MFT.
0x40 1 Кластеров на запись MFT.
0x41 3 Не используется.
0x44 1 Кластеров на индексную запись.
0x45 3 Не используется.
0x48 8 Серийный номер тома. Уникален. Создается в процессе форматирования.
0x50 4 Не используется.
0x54 426 Загрузочный код.
0x1FE 2 Маркер конца. Равен 0xAA55.

Соответствующие структуры имеют вид (определения взяты из исходников Linux-NTFS Project, там же можно найти очень много информации о структурах ntfs). Так же как и FAT, NTFS хранит часть информации в блоке, называемом BIOS Parameter Block, который входит в состав boot sector.

При проверке факта, что том является NTFS, необходимо прежде всего проверить сигнатуру «NTFS ».

Потом некоторые параметры бут сектора, как например кол-во байт в секторе и количество секторов в кластере на кратность двойки в степени.

Все проверки в функции ntfs_boot_sector_is_ntfs из Linux-NTFS Project.

Таблица MFT

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

В NTFS ключевым местом для хранения информации о файлах является таблица MFT (Master File Table). В ней содержится информацию обо всех файлах в системе. MFT состоит из записей (mft record) фиксированного размера, размер записи указывается в параметре clusters_per_mft_record структуры бут сектора.

  • Любой объект файловой системы представляется хотя бы одной записью в MFT и, по сути, является файлом. Например, бут сектор - файл $Boot, сам MFT – $Mft.
  • Файл представляет собой набор атрибутов, в которых хранятся все данные. Например, атрибут $STANDART_INFORMATION хранит информацию о файле. Атрибутом также являются и данные. Если файл имеет альтернативные потоки (streams), то таких атрибутов несколько, по числу потоков.
  • LCN – смещение в кластерах относительно тома, VCN – смещение в кластерах относительно файла. Для перевода LCN в смещение на томе следует использовать формулу offs = lcn * bytes_per_sector * sectors_per_cluster, соответствующие значения хранятся в BIOS_PARAMETER_BLOCK в бут секторе.

MFT состоит из заголовка записи MFT_RECORD, за которым следуют данные записи – атрибуты.

Начало записи MFT идентифицируется сигнатурой “FILE”. Флаги указывают, является ли запись каталогом, или файлом и используется ли запись вообще.

Если файловая запись используется и описывает каталог, тогда поле flags равно MFT_RECORD_IN_USE | MFT_RECORD_IS_DIRECTORY (3). Для файла, flags равен MFT_RECORD_IN_USE.

Записи адресуются через структуру

Для адресации записей используется младшее поле index, а ordinal нужно для определения несоответствий внутри самой файловой системы.

Смещение первого элемента MFT (в кластерах), т. е. его начало хранится в поле mft_lcn. Размер записи хранится в поле clusters_per_mft_record. Особенность этого поля заключается в том, что оно может хранить отрицательное значение, в таком случае это указание на то, что размер записи задается не в кластерах, а в байтах, причем задается не количество байт, а отрицательное значение степени двойки (логарифм двойки). Для получения количества байт нужно сделать инверсию значения в положительное и возвести двойку в степень этого значения. Например, так.

Задача с поиском элемента в MFT осложняется тем, что сам файл MFT может быть фрагментирован и тогда линейная индексация его как массива не представляется возможной. Для последующего чтения записей в MFT, лучше сразу скэшировать информацию об отрезках для файла MFT.

Первые записи MFT стандартизированы и описывают служебные файлы самой NTFS.

Утилита Руссиновича nfi позволяет сдампить элементы в MFT и просмотреть их атрибуты, например, nfi C.

В этой статье мы рассмотрим основные структуры данных файловой системы NTFS, определяющие ее суть – главную файловую запись MFT, файловые записи FILE Record и последовательности обновления (update sequence или fix-ups), без знания которых осмысленная работа с редактором диска и ручное/полуавтоматическое восстановление данных просто невозможны!

Файловую систему NTFS принято описывать как сложную реляционную базу данных, обескураживающую грандиозностью своего архитектурного замысла не одно поколение начинающих исследователей. NTFS похожа на огромный, окутанный мраком лабиринт, в котором очень легко заблудиться. Хакеры давно разобрались с основными структурами данных, осветив магистральные коридоры лабиринта светом множества факелов. Боковые ответвления разведаны намного хуже и все еще находятся по власти тьмы, хранящей множество смертоносных ловушек, ждущих своих исследователей. В общем, если NTFS-«читалку» можно запрограммировать буквально за один вечер (с отладкой!), писать на NTFS-тома еще никто не рисковал.

К счастью, никто не требует от нас написания полноценного NTFS-драйвера! Наша задача значительно скромнее – вернуть разрушенный том в состояние, пригодное для восприятия операционной системой (задача-максимум) или извлечь из него все ценные файлы (задача-минимум). Вникать в структуру журналов транзакций, дескрипторов безопасности, двоичных деревьев индексаций для этого совершенно необязательно! Реально нам потребуется разобраться лишь с устройством главной файловой записи – MFT и нескольких дочерних подструктур.

Обзор NTFS с высоты птичьего полета

Основным структурным элементом всякой файловой системы является том (volume), в случае с FAT совпадающий с разделом (partition), о котором мы говорили в прошлой статье [1, 2]. NTFS поддерживает тома, состоящие из нескольких разделов. Подробнее схему отображения томов на разделы мы обсудим в следующей статье этого цикла, а пока же будем для простоты считать, что том представляет собой отформатированный раздел (т.е. раздел, содержащий служебные структуры файловой системы).

Рисунок 1. Обычный (слева) и разряженный (справа) тома

Большинство файловых систем трактуют том как совокупность файлов, свободного дискового пространства и служебных структур файловой системы, но в NTFS все служебные структуры представлены файлами, которые (как это и положено файлу) могут находиться в любом месте тома, при необходимости фрагментируя себя на несколько частей.

Самым главным служебным файлом является $MFT – Master File Table (главная файловая таблица) – своеобразная база данных, хранящая информацию обо всех файлах тома – их именах, атрибутах, способе и порядке размещения на диске (каталог также является файлом особого типа, со списком принадлежащих ему файлов и подкаталогов внутри). Важно подчеркнуть, что в MFT присутствуют все файлы, находящиеся во всех подкаталогах тома, поэтому для восстановления диска наличия $MTF-файла будет вполне достаточно.

Остальные служебные файлы (кстати говоря, называемые метафайлами или метаданными – metafile/metadata соответственно и всегда предваряются знаком доллара «$») носят сугубо вспомогательный характер, интересный только самой файловой системе. К ним в первую очередь относятся: $LogFile – файл транзакций, $Bitmap – карта свободного/занятого пространства, $BadClust – перечень плохих кластеров и т. д. (Подробнее о назначении каждого из файлов будет рассказано в следующей статье). Текущие версии Windows блокируют доступ к служебным файлам с прикладного уровня (даже с правами администратора!), и всякая попытка открытия/создания такого файла в корневом каталоге обречена на неуспех.

Классическое определение, данное в учебниках информатики, отождествляет файл с именованной записью на диске. Большинство файловых систем добавляет к этому понятие атрибута (attribute) – некоторой вспомогательной характеристики, описывающей время создания, права доступа и т. д. В NTFS имя файла, данные файла и его атрибуты полностью уравнены в правах. Можно сказать, что всякий NTFS-файл представляет собой совокупность атрибутов, каждый из которых хранится как отдельный поток (streams) байтов, поэтому во избежание путаницы атрибуты, хранящие данные файла, часто называют потоками.

Каждый атрибут состоит из тела (body) и заголовка (header). Атрибуты делятся на резидентные (resident) и нерезидентные (non-resident). Резидентные атрибуты хранятся непосредственно в $MTF, что существенно уменьшает грануляцию дискового пространства и сокращает время доступа. Нерезидентные – хранят в $MTF лишь свой заголовок, описывающий порядок размещения атрибута на диске.

Назначение атрибута определяется его типом (type) – четырехбайтовым шестнадцатеричным значением. При желании атрибуту можно дать еще и имя (name), состоящее из символов, входящих в соответствующее пространство имен. Подавляющее большинство файлов имеет по меньшей мере три атрибута: стандартная информация о файле (время создания, модификации последнего доступа, права доступа и т. д.) хранится в атрибуте типа 10h, условно обозначаемом $STANDARD_INFORMATION. Ранние версии Windows NT позволяли обращаться к атрибутам по их условным обозначениям, однако Windows 2000 и Windows XP лишены этой возможности. Полное имя файла (не путать с путем!) хранится в атрибуте типа 30h ($FILE_NAME). Если у файла есть одно или более альтернативных имен (например, MS-DOS-имя), таких атрибутов может быть несколько. Здесь же хранится ссылка (file reference) на материнский каталог, позволяющая разобраться, к какому каталогу данный файл/подкаталог принадлежит. Данные файла по умолчанию хранятся в безымянном атрибуте типа 80h ($DATA), однако при желании прикладные приложения могут создавать дополнительные потоки данных, отделяя имя атрибута от имени файла знаком двоеточия, например:

ECHO xxx > file:attr1; ECHO yyy > file:attr2; more < file:attr1; more < file:attr2

Изначально в NTFS была заложена способность индексации любых атрибутов, значительно сокращающая время поиска файла по заданному списку критериев (например, времени последнего доступа). Внутренние индексы хранятся в виде двоичных деревьев, поэтому среднее время выполнения запроса оценивается как O(lg n). Однако в текущих NTFS-драйверах реализована индексация лишь по одному атрибуту – имени файла. Как уже говорилось выше, каталог представляет собой особенный файл – файл индексов (INDEX). В отличие от FAT, где файл каталога представляет единственный источник данных об организации файлов, в NTFS он используется лишь для ускорения доступа к содержимому директории и не является обязательным, поскольку ссылка на материнский каталог всякого файла в обязательном порядке присутствует в атрибуте его имени ($FILE_NAME).

Каждый атрибут может быть зашифрован, разряжен или сжат. Однако техника работы с такими атрибутами выходит далеко за рамки первичного знакомства с организацией файловой системы и будет рассмотрена позднее. А пока же мы углубимся в изучение фундамента файловой системы – структуры $MFT.

Главная файловая запись (master file table)

В процессе форматирования логического раздела, в его начале создается так называемая MTF-зона (MFT-zone), по умолчанию занимающая 12,5% от емкости тома (а вовсе не 12%, как утверждается во многих публикациях), хотя в зависимости от значения параметра NtfsMftZoneReservation она может составлять 25%, 37% или 50%.

В этой области расположен $MFT-файл, изначально занимающий порядка 64 секторов и растущий от начала MFT-зоны к ее концу по мере создания новых пользовательских файлов/подкаталогов. Таким образом, чем больше файлов содержится на дисковом томе, тем больше размер MFT. Приблизительный размер $MFT-файла можно оценить по следующей формуле: sizeof(FILE Record) N Files, где sizeof(FILE Record) обычно равен 1 Кб, а N Files – полное количество файлов/подканалов раздела, включая недавно удаленные.

Для предотвращения фрагментации $MFT-файла MFT-зона удержится зарезервированной вплоть до полного исчерпания свободного пространства тома, затем незадействованный «хвост» MFT-зоны усекается в два раза, освобождая место для пользовательских файлов. Этот процесс может повторяться многократно, вплоть до полной отдачи всего зарезервированного пространства. Решение красивое, хотя и не новое. Многие из файловых систем восьмидесятых позволяли резервировать заданное дисковое пространство в хвосте активных файлов, тем самым сокращая их фрагментацию (причем любых файлов, а не только служебных). В частности, такая способность была у DOS 3.0, разработанной для персональных компьютеров типа Агат. Может, кто помнит такую машину?

Когда $MFT-файл достигает границ MFT-зоны, в ходе своего последующего роста он неизбежно фрагментируется, вызывая обвальное падение производительности файловой системы, причем подавляющее большинство дефрагментаторов $MFT-файл не обрабатывают! А ведь API дефрагментации, встроенное в штатный NTFS-драйвер, это в принципе позволяет! Подробности (вместе с самой утилитой дефрагментации) можно найти на сайте Марка Руссиновича. Но, как бы то ни было, заполнять дисковый том более чем на 88% его емкости категорически не рекомендуется!

При необходимости $MFT-файл может быть перемещен в любую часть диска, и тогда в начале тома его уже не окажется. Стартовый адрес $MFT-файла хранится в Boot-секторе по смещению 30h байт от его начала (см. «boot-сектор», описанный в предыдущей статье данного цикла) и в подавляющем большинстве случаев этот адрес ссылается на 4-й кластер.

Рисунок 2. Структура дискового тома под NTFS

$MFT-файл представляет собой массив записей типа FILE Record (или в терминологии UNIX – inodes), каждая из которых описывает соответствующий ей файл или подкаталог (подробнее см. раздел «Файловые записи»).

В подавляющем большинстве случаев файл/подкаталог полностью описывается одной-единственной записью FILE Record, хотя теоретически этих записей может потребоваться и несколько.

При удалении файла/каталога соответствующая ему файловая последовательность помечается как неиспользуемая. При создании новых файлов записи, помеченные как неиспользуемые, могут задействоваться вновь, при этом счетчик номера последовательности, хранящийся внутри файловой записи, увеличивается на единицу. Этот механизм позволяет отслеживать «мертвые» ссылки на уже удаленные файлы – очевидно, sequence number внутри file reference будет отличаться от номера последовательности соответствующей файловой записи (этой проверкой занимается утилита chkdsk и автоматически, насколько мне известно, она не выполняется).

Читайте также: