Из чего состоит атрибут ntfs
Аннотация: Основные понятия. Возможности NTFS. Структура NTFS. Файлы NTFS. Структуры данных для управления файлами.
Основные понятия
Файловая система ( file system ) – способ организации данных в виде файлов на устройствах внешней памяти (жестких и оптических дисках, устройствах флеш-памяти и т. п.).
Файловая система должна обеспечивать:
- безопасное и надежное хранение данных (т. е. защищенное от несанкционированного использования и различного рода сбоев и ошибок);
- программный интерфейс доступа к файлам;
- организацию файлов в виде иерархии каталогов.
Windows поддерживает несколько файловых систем для различных внешних устройств:
- NTFS – основная файловая система семейства Windows NT;
- FAT (File Allocation Table – таблица размещения файлов) – простая файловая система используемая Windows для устройств флеш памяти, а также для совместимости с другими операционными системами при установке на диски с множественной загрузкой. Основным элементом этой файловой системы является таблица размещения файлов FAT (по имени которой названа вся файловая система), необходимая для определения расположения файла на диске. Существует три варианта FAT, отличающихся разрядностью идентификаторов, указывающих размещение файлов: FAT12, FAT16 и FAT32;
- exFAT (Extended FAT – расширенная FAT) – развитие файловой системы FAT, использующее 64 разрядные идентификаторы. Применяется в основном для устройств флеш-памяти;
- CDFS (CD ROM File System) – файловая система для CD дисков, объединяющая форматы ISO 9660 1 ISO 9660 – стандарт ISO (International Organization for Standardization – Международная организация по стандартизации) для файловых систем CD дисков и Joliet 2 Joliet – расширение стандарта ISO 9660, разработанное Microsoft. Снимает жесткие ограничения на именование файлов ;
- UDF (Universal Disk Format – универсальный формат дисков) – файловая система для CD и DVD дисков, разработанная для замены ISO 9660.
Для дальнейшего изложения необходимо знать следующие важные понятия: диск , раздел, простые и составные тома, сектор, кластер .
Диск ( disk ) – устройство внешней памяти , например, жесткий диск или оптический диск (CD, DVD , Blu ray).
Раздел ( partition ) – непрерывная часть жесткого диска. Диск может содержать несколько разделов.
Том ( volume ) или логический диск (logical disk ) – область внешней памяти, с которой операционная система работает как с единым целым. Тома бывают простые и составные.
Простой том (simple volume ) – том, состоящий из одного раздела.
Составной том (multipartition volume ) – том, состоящий из нескольких разделов (необязательно на одном диске).
Понятия раздела и простого тома отличаются: во первых, разделы формируются, в основном, только на жестких дисках, а тома создаются и на других устройствах внешней памяти (например на оптических дисках и устройствах флеш памяти), во вторых, понятие "раздел" связано с физическим устройством, а понятие "том" – с логическим представлением внешней памяти.
Сектор ( sector ) – блок данных фиксированного размера на диске; наименьшая единица информации для диска. Типичный размер сектора для жестких дисков равен 512 байтам, для оптических дисков – 2048 байт . Деление диска на секторы происходит один раз при создании диска в процессе низкоуровневого форматирования и обычно не может быть изменено.
Кластер ( cluster ) – логический блок данных на диске, включающий один или несколько секторов. Количество секторов, составляющих кластер , обычно кратно степеням двойки. Размер кластера задается операционной системой в процессе высокоуровневого форматирования, которое может осуществляться многократно.
При записи на диск файл всегда будет занимать целое число кластеров. Например, файл размером 100 байт в файловой системе с размером кластера 4 КБ будет занимать ровно 4 КБ.
Выбор размера кластера связан со следующими соображениями. Малые кластеры позволяют сократить размер фактически неиспользуемого дискового пространства, возникающего за счет размещения файла в целом числе кластеров. Но при этом общее количество кластеров на диске увеличивается и размер служебных структур файловой системы, в которых хранится информация о файлах, возрастает.
Крис Касперски
Известный российский хакер. Легенда ][, ex-редактор ВЗЛОМа. Также известен под псевдонимами мыщъх, nezumi (яп. 鼠, мышь), n2k, elraton, souriz, tikus, muss, farah, jardon, KPNC.
Основные понятия
Файловая система ( file system ) – способ организации данных в виде файлов на устройствах внешней памяти (жестких и оптических дисках, устройствах флеш-памяти и т. п.).
Файловая система должна обеспечивать:
- безопасное и надежное хранение данных (т. е. защищенное от несанкционированного использования и различного рода сбоев и ошибок);
- программный интерфейс доступа к файлам;
- организацию файлов в виде иерархии каталогов.
Windows поддерживает несколько файловых систем для различных внешних устройств:
- NTFS – основная файловая система семейства Windows NT;
- FAT (File Allocation Table – таблица размещения файлов) – простая файловая система используемая Windows для устройств флеш памяти, а также для совместимости с другими операционными системами при установке на диски с множественной загрузкой. Основным элементом этой файловой системы является таблица размещения файлов FAT (по имени которой названа вся файловая система), необходимая для определения расположения файла на диске. Существует три варианта FAT, отличающихся разрядностью идентификаторов, указывающих размещение файлов: FAT12, FAT16 и FAT32;
- exFAT (Extended FAT – расширенная FAT) – развитие файловой системы FAT, использующее 64 разрядные идентификаторы. Применяется в основном для устройств флеш-памяти;
- CDFS (CD ROM File System) – файловая система для CD дисков, объединяющая форматы ISO 9660 1 ISO 9660 – стандарт ISO (International Organization for Standardization – Международная организация по стандартизации) для файловых систем CD дисков и Joliet 2 Joliet – расширение стандарта ISO 9660, разработанное Microsoft. Снимает жесткие ограничения на именование файлов ;
- UDF (Universal Disk Format – универсальный формат дисков) – файловая система для CD и DVD дисков, разработанная для замены ISO 9660.
Для дальнейшего изложения необходимо знать следующие важные понятия: диск , раздел, простые и составные тома, сектор, кластер .
Диск ( disk ) – устройство внешней памяти , например, жесткий диск или оптический диск (CD, DVD , Blu ray).
Раздел ( partition ) – непрерывная часть жесткого диска. Диск может содержать несколько разделов.
Том ( volume ) или логический диск (logical disk ) – область внешней памяти, с которой операционная система работает как с единым целым. Тома бывают простые и составные.
Простой том (simple volume ) – том, состоящий из одного раздела.
Составной том (multipartition volume ) – том, состоящий из нескольких разделов (необязательно на одном диске).
Понятия раздела и простого тома отличаются: во первых, разделы формируются, в основном, только на жестких дисках, а тома создаются и на других устройствах внешней памяти (например на оптических дисках и устройствах флеш памяти), во вторых, понятие "раздел" связано с физическим устройством, а понятие "том" – с логическим представлением внешней памяти.
Сектор ( sector ) – блок данных фиксированного размера на диске; наименьшая единица информации для диска. Типичный размер сектора для жестких дисков равен 512 байтам, для оптических дисков – 2048 байт . Деление диска на секторы происходит один раз при создании диска в процессе низкоуровневого форматирования и обычно не может быть изменено.
Кластер ( cluster ) – логический блок данных на диске, включающий один или несколько секторов. Количество секторов, составляющих кластер , обычно кратно степеням двойки. Размер кластера задается операционной системой в процессе высокоуровневого форматирования, которое может осуществляться многократно.
При записи на диск файл всегда будет занимать целое число кластеров. Например, файл размером 100 байт в файловой системе с размером кластера 4 КБ будет занимать ровно 4 КБ.
Выбор размера кластера связан со следующими соображениями. Малые кластеры позволяют сократить размер фактически неиспользуемого дискового пространства, возникающего за счет размещения файла в целом числе кластеров. Но при этом общее количество кластеров на диске увеличивается и размер служебных структур файловой системы, в которых хранится информация о файлах, возрастает.
Возможности NTFS
Файловая система NTFS ( New Technology File System ) разрабатывалась Microsoft в начале 1990 х гг. как основная файловая система для серверных версий операционных систем Windows . NTFS была представлена в 1993 году в операционной системе Windows NT 3.1.
В настоящее время NTFS рассматривается в качестве предпочтительной файловой системы как для серверных, так и для клиентских версий Windows .
В NTFS используются 64 разрядные идентификаторы кластеров, поэтому теоретически том NTFS может содержать 264 кластеров (16 ЭБ 3 2 10 байт = 1 килобайт (КБ), 2 20 байт = 1 мегабайт (МБ), 2 30 байт = 1 гигабайт (ГБ), 2 40 байт = 1 терабайт (ТБ), 2 50 байт = 1 петабайт (ПБ), 2 60 байт = 1 экзабайт (ЭБ), 2 70 байт = 1 зеттабайт (ЗБ). ). Однако текущие реализации в Windows поддерживают только 32 разрядную адресацию кластеров, что при размере кластера максимум 64 КБ (216 байт ) позволяет NTFS тому достигать размера до 256 ТБ:
2 32 * 2 16 байт = 2 48 байт = 2 8 * 2 40 байт = 256 ТБ.
Для томов, больших 4 ГБ, при форматировании Windows предлагает размер кластера по умолчанию 4 КБ.
Перечислим некоторые возможности NTFS [5, стр. 761]:
- восстанавливаемость (recoverability) – способность файловой системы возвращаться к работоспособному состоянию после возникновения сбоя. Реализуется такая возможность, во первых, за счет поддержки атомарных транзакций, во вторых, за счет избыточности хранения информации. Атомарная транзакция (atomic transaction) – операция с файловой системой, приводящая к её изменению, которая либо полностью успешно выполняется, либо не выполняется вообще (т. е. в случае сбоя во время атомарной транзакции все изменения откатываются). Избыточность используется при хранении важнейших данных файловой системы, критически необходимых для её корректной работы;
- безопасность (security) – защищенность файлов от несанкционированного доступа. Реализуется при помощи модели безопасности Windows, рассмотренной в лекции 9 "Безопасность в Windows";
- шифрование (encryption) – преобразование файла в зашифрованный код, который невозможно прочесть без ключа. Обычные механизмы безопасности, такие как назначение прав доступа пользователей к файлам, не обеспечивают полной защиты информации, например, в случае перемещения диска на другой компьютер. Администратор операционной системы всегда может получить доступ к файлам других пользователей, даже на томе NTFS. Поэтому в NTFS включена поддержка шифрующей файловой системы EFS (Encrypting File System), которая позволяет легко зашифровывать и расшифровывать файлы;
- поддержка RAID (Redundant Array of Inexpensive (Independent) Disks – массив недорогих (независимых) дисков с избыточностью) – возможность использования для хранения информации нескольких дисков; данные с одного диска автоматически копируются на другие, обеспечивая тем самым повышенную надежность;
- дисковые квоты для пользователей (Per-User Volume Quotas) – возможность выделения для каждого пользователя определенного пространства на диске (квоты); 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 ).
Резюме
В этой лекции приведен обзор файловых систем, поддерживаемых Windows , и подробно рассматривается основная файловая система Windows – NTFS . Дается определение базовым понятиям – диск , раздел, том, сектор, кластер . Перечисляются возможности NTFS . Описывается структура NTFS тома, особое внимание уделяется главной таблице файлов MFT . Рассматриваются виды и структура файловых записей MFT . В заключение приводятся структуры данных Windows Research Kernel , связанные с файловой системой NTFS .
Устройство файловой системы NTFS поражает своей грандиозностью и напоминает огромный, окутанный мраком лабиринт. Но какого любителя приключений остановит паутина, скелеты и пара ловушек с ядовитыми стрелами? Хватай факел, и отправимся в путь. Нашим первым квестом будет изучение главной файловой таблицы — MFT и нескольких дочерних структур.
Стандарт файловой системы NTFS версии 3.1 появился в 2001 году с выходом на рынок Windows XP и с тех пор не претерпел фундаментальных изменений. В Windows 10 также используется NTFS v3.1. Архитектуру и особенности внутреннего устройства этой файловой системы Крис Касперски подробно описал в своей книге «Восстановление данных», которая сейчас готовится к переизданию. Мы публикуем отрывок из этой книги, где Крис рассказывает о том, что представляет собой NTFS изнутри.
Продолжение доступно только участникам
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Структура NTFS
Структура тома NTFS представлена на рис.17.1.
В начале тома находится загрузочная запись тома ( Volume Boot Record ), в которой содержится код загрузки Windows , информация о томе (в частности, тип файловой системы), адреса системных файлов ($ Mft и $MftMirr – см. далее). Загрузочная запись занимает обычно 8 КБ (16 первых секторов).
В определенной области тома ( адрес начала этой области указывается в загрузочной записи) расположена основная системная структура NTFS – главная таблица файлов (Master File Table , MFT ). В записях этой таблицы содержится вся информация о расположении файлов на томе, а небольшие файлы хранятся прямо в записях MFT .
Важной особенностью NTFS является то, что вся информация , как пользовательская, так и системная, хранится в виде файлов. Имена системных файлов начинаются со знака "$". Например, загрузочная запись тома содержится в файле $ Boot , а главная таблица файлов – в файле $ Mft . Такая организация информации позволяет единообразно работать как с пользовательскими, так и с системными данными на томе.
Поскольку MFT является важнейшей системной структурой, к которой при операциях с томом наиболее часто происходят обращения, выгодно хранить файл $ Mft в непрерывной области логического диска, чтобы избежать его фрагментации (размещения в разных областях диска), и, следовательно, повысить скорость работы с ним. С этой целью при форматировании тома выделяется непрерывная область, называемая зоной MFT ( MFT Zone ). По мере увеличения главной таблицы файлов, файл $ Mft расширяется, занимая зарезервированное место в зоне.
Остальное место на томе NTFS отводится под файлы – системные и пользовательские.
Рассмотрим более подробно структуру MFT (рис.17.2).
Главная таблица файлов MFT состоит из множества записей о файлах (файловых записей), расположенных на томе. Размер одной записи – 1 КБ (2 сектора). Самая первая запись в MFT – это запись о самом файле $ Mft . Во второй записи содержится информация о файле $MftMirr – зеркальной копии MFT . В этом файле дублируются первые 4 записи таблицы MFT , в том числе запись о $ Mft . В случае возникновения сбоя, если MFT окажется недоступной, информация о системных файлах будет считываться из $MftMirr (в загрузочной записи имеется адрес $MftMirr).
Перечислим следующие несколько записей в таблице MFT и кратко опишем назначение соответствующих системных файлов:
- $LogFile – файл журнала, в котором записывается информация о всех операциях, изменяющих структуру тома NTFS, например, создание файлов и каталогов. Файл журнала используется при восстановлении тома NTFS после сбоев;
- $Volume – файл информации о томе, в котором содержатся имя тома (Volume label), версия NTFS и набор флагов состояния тома, например, флаг (т. н. грязный бит, dirty bit), установка которого означает, что том был поврежден и требует восстановления при помощи системной утилиты Chkdsk;
- $AttrDef – таблица определения атрибутов (Attribute Definition Table), содержащая возможные на данном томе типы атрибутов файлов (см. далее);
- Root Directory (обозначается также обратным слешем "\") – файл с информацией о корневом каталоге тома. В нем хранятся ссылки на файлы и каталоги, содержащиеся в корневом каталоге;
- $BitMap – файл битовой карты (bitmap), каждый бит в этой карте соответствует кластеру на томе: если бит равен 1, кластер занят, иначе – свободен;
- $Boot – файл загрузочной записи тома;
- $BadClus – файл плохих кластеров (bad clusters), содержащий информацию обо всех кластерах, имеющих сбойные секторы (bad sectors).
Кроме перечисленных, имеются и другие системные файлы NTFS , а в новых версиях появляются новые системные файлы.
В этой статье мы рассмотрим основные структуры данных файловой системы 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 и автоматически, насколько мне известно, она не выполняется).
Как уже обсуждалось, основная информация о файле содержится в файловой записи (File Record ) размером 1 КБ таблицы MFT , а небольшие файлы целиком хранятся в файловой записи.
Файловая запись состоит из заголовка ( Header ) и набора атрибутов ( Attribute ). В заголовке содержится служебная информация о файловой записи, например, её тип и размер. Все данные, относящиеся непосредственно к файлу, хранятся в виде атрибутов. Названия атрибутов, так же как и системных файлов, начинаются с "$". Например, отдельными атрибутами являются имя файла ($FILE_NAME), информация о его свойствах ( $STANDARD_INFORMATION ), данные файла ( $DATA ). Типичная файловая запись представлена на рис.17.3.
На диске файловая запись всегда расположена в начале сектора, первые байты файловой записи кодируют слово "FILE" (ASCII-коды: 46 49 4C 45). Конец записи определяется 4 байтовой последовательностью FF FF FF FF.
Физически атрибут файла хранится в виде потока байтов ( stream ) – простой последовательности байтов. Такое представление позволяет одинаковым образом работать с разнотипными атрибутами, а также добавлять нестандартные пользовательские атрибуты.
Каждый атрибут состоит из заголовка ( attribute header ), определяющего тип атрибута и его свойства, и тела ( attribute body ), содержащего основную информацию атрибута.
Более подробная структура файловой записи представлена на рис.17.4.
По расположению относительно MFT атрибуты бывают резидентные и нерезидентные. Резидентные атрибуты ( resident attributes) полностью помещаются в файловую запись MFT , нерезидентные атрибуты (nonresident attributes) хранятся вне MFT . Область, в которой расположен нерезидентный атрибут , называется группой (run). Поскольку нерезидентных атрибутов в файле может быть несколько, то и групп бывает тоже несколько. Множество групп файла называется списком групп (RunList). Файловая запись при наличии нерезидентных атрибутов содержит ссылку на расположение группы на диске (см. пример на рис.17.2 "Главная таблица файлов MFT ").
Некоторые поля заголовка файловой записи, а также резидентных и нерезидентных атрибутов представлены на рис.17.5. На том же рисунке справа показан пример файловой записи с конкретными значениями рассматриваемых полей. Числа слева от полей записи обозначают шестнадцатеричное смещение поля от начала записи.
В начале файловой записи находится признак её начала – слово "FILE" (46 49 4C 45). По смещению 0x14 расположено двухбайтовое поле , в котором записано смещение первого атрибута относительно начала файловой записи. В примере в этом поле записано 38, т. е. первый атрибут расположен по смещению 38.
В следующем поле хранится тип файловой записи: значение 01 обозначает файл , 02 – каталог ( directory ). В примере файловая запись соответствует файлу ( значение 01 по смещению 16).
Ещё одно поле в заголовке содержит размер всей записи. В примере на рис.17.5 в этом поле записано 1A0, т. е. размер записи составляет 416 байт .
Каждый атрибут имеет поля, указывающие тип, длину и резидентность атрибута. Все типы атрибутов имеют свои численные значения, например, атрибуту $FILE_NAME соответствует значение 0x30, атрибуту $STANDARD_INFORMATION – 0x10, атрибуту $DATA – 0x80.
Если атрибут резидентный, в поле резидентности записывается 0x00, иначе – 0x01. В случае нерезидентного атрибута предусмотрены поля для хранения номеров кластеров, в которых располагается группа или несколько групп, выделенных для размещения файла.
В примере на рис.17.5 показаны два атрибута. Первый атрибут имеет тип $STANDARD_INFORMATION ( значение 10), длина атрибута 96 байт (6016 = 9610), атрибут является резидентным (00). У второго атрибута тип $ DATA (80), длина – 72 байта (4816 = 7210), атрибут является нерезидентным (01).
Для обозначения кластеров используются два типа номеров: LCN и VCN . При помощи первого типа, LCN (Logical Cluster Number – логический номер кластера), нумеруются все кластеры на диске, от первого до последнего. LCN применяются, чтобы найти начальный кластер группы. Номера VCN ( Virtual Cluster Number – виртуальный номер кластера) обозначают порядковый номер кластера внутри группы. Схема нумерации кластеров LCN VCN проиллюстрирована на рис.17.6.
В случае нерезидентных атрибутов в заголовке атрибута содержатся следующие поля: номер VCN первого кластера группы (обычно равен 0х00), номер VCN последнего кластера группы и список групп (RunList), описывающий расположение групп на диске.
Рассмотрим пример описания расположения групп, приведенный на рис.17.5 (справа). В этом примере значения полей следующие:
- первый VCN = 0x00;
- последний VCN = 0x3F;
- список групп (RunList) = 0x21 40 55 20 00.
Расположение кластеров для данного примера приведено на рис.17.7.
В этом примере значение для списка групп
0x21 40 55 20 00
- 0x21 – первый байт кодирует размер двух полей, которые за ним следуют:
- младший полубайт обозначает размер поля (в байтах), в котором хранится длина группы в кластерах; в данном случае значение 1 указывает, что на длину группы отводится один байт;
- старший полубайт обозначает размер поля (в байтах), в котором расположен номер LCN первого кластера группы; в данном случае значение 2 указывает на двухбайтовое поле;
Указанные обозначения проиллюстрированы на рис.17.8.
Отметим, что в рассмотренном примере нерезидентный атрибут содержится всего в одной группе; в общем случае групп может быть несколько.
Структуры данных для управления файлами
Рассмотрим структуры данных, задействованные при работе с файловой системой NTFS (рис.17.9).
В структуре данных EPROCESS , описывающей процесс в Windows (см. лекцию 7 "Процессы и потоки"), имеется поле ObjectTable ( файл base\ntos\inc\ps.h, строка 293), в котором содержится указатель на таблицу дескрипторов процесса типа HANDLE_TABLE ( файл base\ntos\inc\ex.h, строка 5179). В строках этой таблицы содержатся ссылки на ресурсы, открытые процессом, и в том числе, ссылки на объекты типа FILE_OBJECT , которые упоминались в лекции 15 "Управление устройствами".
Структура FILE_OBJECT ( файл base\ntos\inc\io.h, строка 1763) содержит следующие основные поля:
- FileName – строковое имя файла;
- Vpb – указатель на структуру VPB, которая представляет том на устройстве внешней памяти;
- FsContext – указатель на блок управления потоком данных NTFS;
- DeviceObject – указатель на объект типа DEVICE_OBJECT , связанный с физическим диском, на котором находится файл.
В структуре VPB ( Volume Parameter Block ) содержатся следующие поля ( файл base\ntos\inc\io.h, строка 1288):
- VolumeLabelLength – размер тома в байтах;
- DeviceObject – указатель на объект типа DEVICE_OBJECT , ассоциированный с данным томом (логическим диском);
- RealDevice – указатель на объект типа DEVICE_OBJECT , ассоциированный с физическим устройством внешней памяти (физическим диском);
- SerialNumber – серийный номер тома;
- ReferenceCount – счетчик количества ссылок на структуру; если это поле не равно нулю, значит, структура кем-то используется;
- VolumeLabel – метка (строковое имя) тома. Максимальная длина метки определяется константой MAXIMUM_VOLUME_LABEL_LENGTH , равной 32 двухбайтовым символам (см. файл base\ntos\inc\io.h, строка 1286).
На рис.17.9 изображен физический диск , разбитый на три тома (логических диска) – два тома NTFS и один том FAT32 . Поле DeviceObject структуры VPB указывает на объект DEVICE_OBJECT , который ссылается на первый из томов NTFS . Поле RealDevice структуры VPB указывает на объект DEVICE_OBJECT , связанный с физическим диском.
С каждым файлом NTFS , с которым операционная система в данный момент работает, связана структура данных , называемая блок управления файлом (File Control Block , FCB ). В этой структуре хранится указатель на запись в таблице MFT для данного файла (см. рис.17.9).
Поскольку в файле существует в общем случае несколько потоков, для каждого потока создается своя структура данных – блок управления потоком ( Stream Control Block , SCB), в котором содержится ссылка на FCB . Поле FsContext структуры FILE_OBJECT указывает на SCB для открытого потока, таким образом, структура FILE_OBJECT на самом деле связана с потоком, а не с файлом. Чтобы открыть другой поток в том же файле требуется создавать новый объект FILE_OBJECT . На рис.17.9 показана ситуация, когда процесс открыл два разных потока одного и того же файла. В WRK можно найти описание блока управления потоком SCB – структуру FSRTL_ADVANCED_FCB_HEADER ( файл base\ntos\inc\fsrtl.h, строка 120) вместе с её основным полем, представляющим структуру FSRTL_COMMON_FCB_HEADER (тот же файл , строка 65).
Резюме
В этой лекции приведен обзор файловых систем, поддерживаемых Windows , и подробно рассматривается основная файловая система Windows – NTFS . Дается определение базовым понятиям – диск , раздел, том, сектор, кластер . Перечисляются возможности NTFS . Описывается структура NTFS тома, особое внимание уделяется главной таблице файлов MFT . Рассматриваются виды и структура файловых записей MFT . В заключение приводятся структуры данных Windows Research Kernel , связанные с файловой системой NTFS .
Как уже обсуждалось, основная информация о файле содержится в файловой записи (File Record ) размером 1 КБ таблицы MFT , а небольшие файлы целиком хранятся в файловой записи.
Файловая запись состоит из заголовка ( Header ) и набора атрибутов ( Attribute ). В заголовке содержится служебная информация о файловой записи, например, её тип и размер. Все данные, относящиеся непосредственно к файлу, хранятся в виде атрибутов. Названия атрибутов, так же как и системных файлов, начинаются с "$". Например, отдельными атрибутами являются имя файла ($FILE_NAME), информация о его свойствах ( $STANDARD_INFORMATION ), данные файла ( $DATA ). Типичная файловая запись представлена на рис.17.3.
На диске файловая запись всегда расположена в начале сектора, первые байты файловой записи кодируют слово "FILE" (ASCII-коды: 46 49 4C 45). Конец записи определяется 4 байтовой последовательностью FF FF FF FF.
Физически атрибут файла хранится в виде потока байтов ( stream ) – простой последовательности байтов. Такое представление позволяет одинаковым образом работать с разнотипными атрибутами, а также добавлять нестандартные пользовательские атрибуты.
Каждый атрибут состоит из заголовка ( attribute header ), определяющего тип атрибута и его свойства, и тела ( attribute body ), содержащего основную информацию атрибута.
Более подробная структура файловой записи представлена на рис.17.4.
По расположению относительно MFT атрибуты бывают резидентные и нерезидентные. Резидентные атрибуты ( resident attributes) полностью помещаются в файловую запись MFT , нерезидентные атрибуты (nonresident attributes) хранятся вне MFT . Область, в которой расположен нерезидентный атрибут , называется группой (run). Поскольку нерезидентных атрибутов в файле может быть несколько, то и групп бывает тоже несколько. Множество групп файла называется списком групп (RunList). Файловая запись при наличии нерезидентных атрибутов содержит ссылку на расположение группы на диске (см. пример на рис.17.2 "Главная таблица файлов MFT ").
Некоторые поля заголовка файловой записи, а также резидентных и нерезидентных атрибутов представлены на рис.17.5. На том же рисунке справа показан пример файловой записи с конкретными значениями рассматриваемых полей. Числа слева от полей записи обозначают шестнадцатеричное смещение поля от начала записи.
В начале файловой записи находится признак её начала – слово "FILE" (46 49 4C 45). По смещению 0x14 расположено двухбайтовое поле , в котором записано смещение первого атрибута относительно начала файловой записи. В примере в этом поле записано 38, т. е. первый атрибут расположен по смещению 38.
В следующем поле хранится тип файловой записи: значение 01 обозначает файл , 02 – каталог ( directory ). В примере файловая запись соответствует файлу ( значение 01 по смещению 16).
Ещё одно поле в заголовке содержит размер всей записи. В примере на рис.17.5 в этом поле записано 1A0, т. е. размер записи составляет 416 байт .
Каждый атрибут имеет поля, указывающие тип, длину и резидентность атрибута. Все типы атрибутов имеют свои численные значения, например, атрибуту $FILE_NAME соответствует значение 0x30, атрибуту $STANDARD_INFORMATION – 0x10, атрибуту $DATA – 0x80.
Если атрибут резидентный, в поле резидентности записывается 0x00, иначе – 0x01. В случае нерезидентного атрибута предусмотрены поля для хранения номеров кластеров, в которых располагается группа или несколько групп, выделенных для размещения файла.
В примере на рис.17.5 показаны два атрибута. Первый атрибут имеет тип $STANDARD_INFORMATION ( значение 10), длина атрибута 96 байт (6016 = 9610), атрибут является резидентным (00). У второго атрибута тип $ DATA (80), длина – 72 байта (4816 = 7210), атрибут является нерезидентным (01).
Для обозначения кластеров используются два типа номеров: LCN и VCN . При помощи первого типа, LCN (Logical Cluster Number – логический номер кластера), нумеруются все кластеры на диске, от первого до последнего. LCN применяются, чтобы найти начальный кластер группы. Номера VCN ( Virtual Cluster Number – виртуальный номер кластера) обозначают порядковый номер кластера внутри группы. Схема нумерации кластеров LCN VCN проиллюстрирована на рис.17.6.
В случае нерезидентных атрибутов в заголовке атрибута содержатся следующие поля: номер VCN первого кластера группы (обычно равен 0х00), номер VCN последнего кластера группы и список групп (RunList), описывающий расположение групп на диске.
Рассмотрим пример описания расположения групп, приведенный на рис.17.5 (справа). В этом примере значения полей следующие:
- первый VCN = 0x00;
- последний VCN = 0x3F;
- список групп (RunList) = 0x21 40 55 20 00.
Расположение кластеров для данного примера приведено на рис.17.7.
В этом примере значение для списка групп
0x21 40 55 20 00
- 0x21 – первый байт кодирует размер двух полей, которые за ним следуют:
- младший полубайт обозначает размер поля (в байтах), в котором хранится длина группы в кластерах; в данном случае значение 1 указывает, что на длину группы отводится один байт;
- старший полубайт обозначает размер поля (в байтах), в котором расположен номер LCN первого кластера группы; в данном случае значение 2 указывает на двухбайтовое поле;
Указанные обозначения проиллюстрированы на рис.17.8.
Отметим, что в рассмотренном примере нерезидентный атрибут содержится всего в одной группе; в общем случае групп может быть несколько.
Структуры данных для управления файлами
Рассмотрим структуры данных, задействованные при работе с файловой системой NTFS (рис.17.9).
В структуре данных EPROCESS , описывающей процесс в Windows (см. лекцию 7 "Процессы и потоки"), имеется поле ObjectTable ( файл base\ntos\inc\ps.h, строка 293), в котором содержится указатель на таблицу дескрипторов процесса типа HANDLE_TABLE ( файл base\ntos\inc\ex.h, строка 5179). В строках этой таблицы содержатся ссылки на ресурсы, открытые процессом, и в том числе, ссылки на объекты типа FILE_OBJECT , которые упоминались в лекции 15 "Управление устройствами".
Структура FILE_OBJECT ( файл base\ntos\inc\io.h, строка 1763) содержит следующие основные поля:
- FileName – строковое имя файла;
- Vpb – указатель на структуру VPB, которая представляет том на устройстве внешней памяти;
- FsContext – указатель на блок управления потоком данных NTFS;
- DeviceObject – указатель на объект типа DEVICE_OBJECT , связанный с физическим диском, на котором находится файл.
В структуре VPB ( Volume Parameter Block ) содержатся следующие поля ( файл base\ntos\inc\io.h, строка 1288):
- VolumeLabelLength – размер тома в байтах;
- DeviceObject – указатель на объект типа DEVICE_OBJECT , ассоциированный с данным томом (логическим диском);
- RealDevice – указатель на объект типа DEVICE_OBJECT , ассоциированный с физическим устройством внешней памяти (физическим диском);
- SerialNumber – серийный номер тома;
- ReferenceCount – счетчик количества ссылок на структуру; если это поле не равно нулю, значит, структура кем-то используется;
- VolumeLabel – метка (строковое имя) тома. Максимальная длина метки определяется константой MAXIMUM_VOLUME_LABEL_LENGTH , равной 32 двухбайтовым символам (см. файл base\ntos\inc\io.h, строка 1286).
На рис.17.9 изображен физический диск , разбитый на три тома (логических диска) – два тома NTFS и один том FAT32 . Поле DeviceObject структуры VPB указывает на объект DEVICE_OBJECT , который ссылается на первый из томов NTFS . Поле RealDevice структуры VPB указывает на объект DEVICE_OBJECT , связанный с физическим диском.
С каждым файлом NTFS , с которым операционная система в данный момент работает, связана структура данных , называемая блок управления файлом (File Control Block , FCB ). В этой структуре хранится указатель на запись в таблице MFT для данного файла (см. рис.17.9).
Поскольку в файле существует в общем случае несколько потоков, для каждого потока создается своя структура данных – блок управления потоком ( Stream Control Block , SCB), в котором содержится ссылка на FCB . Поле FsContext структуры FILE_OBJECT указывает на SCB для открытого потока, таким образом, структура FILE_OBJECT на самом деле связана с потоком, а не с файлом. Чтобы открыть другой поток в том же файле требуется создавать новый объект FILE_OBJECT . На рис.17.9 показана ситуация, когда процесс открыл два разных потока одного и того же файла. В WRK можно найти описание блока управления потоком SCB – структуру FSRTL_ADVANCED_FCB_HEADER ( файл base\ntos\inc\fsrtl.h, строка 120) вместе с её основным полем, представляющим структуру FSRTL_COMMON_FCB_HEADER (тот же файл , строка 65).
Читайте также: