Физическая организация файловой системы NTFS
Аббревиатура NTFS означает New Technology File System – новая технология файловой системы. NTFS содержит ряд значительных усовершенствований, существенно отличающих ее от других файловых систем. NTFS была разработана в качестве основной файловой системы для ОС Windows NT в начале 1990-х годов с учетом опыта использования файловых систем FAT, HPFS (основная файловая система для OS/2) и других.
Основными отличительными свойствами NTFS являются:
- поддержка больших файлов и больших дисков объемом до 264 байт;
- восстанавливаемость после сбоев и отказов программ и аппаратуры управления дисками;
- высокая скорость операций, в том числе и для больших дисков;
- гибкая структура, допускающая развитие за счет добавления новых типов записей и атрибутов файлов с сохранением совместимости с предыдущими версиями файловых систем;
- устойчивость к отказам дисковых накопителей;
- поддержка длинных символьных имен;
- контроль доступа к каталогам и отдельным файлам.
Структура тома NTFS.Весь том NTFS состоит из последовательности кластеров, что отличает эту файловую систему от FAT, где на кластеры делилась только область данных. NTFS поддерживает размеры кластеров от 512 байт до 64 Кбайт, неким стандартом считается кластер в 4 Кбайт.
Том (раздел) NTFS условно делится на две части (рис. 7.12). Первые минимум 12,5% тома отводятся под так называемую MFT-зону, в которой располагается главный служебный метафайл MFT, растущий от начала MFT-зоны к ее концу по мере создания новых пользовательских файлов/подкаталогов. Таким образом, чем больше файлов содержаться на дисковом томе, тем больше размер MTF. Запись данных в эту область невозможна, чтобы файл MFT не фрагментировался при своем росте. Остальные 87,5% тома представляют собой обычное пространство для хранения файлов. В зависимости от значения параметра NtfsMftZoneReservation, MFT-зона может составлять 25%, 37% или 50%.
Рис. 7.12. Структура тома NTFS
Свободное место тома включает в себя всё физически свободное место, в том числе незаполненные куски MFT-зоны. Механизм использования MFT-зоны таков: когда файлы уже нельзя записывать в обычное пространство, MFT-зона сокращается (в текущих версиях операционных систем ровно в два раза), освобождая таким образом место для записи файлов. Освободившееся пространство уже не является MFT-зоной, поэтому в него можно записывать данные. При освобождении места в обычной области MFT-зона может снова расшириться. При этом не исключена ситуация, когда в MFT-зоне остались и обычные файлы: аномалии тут нет, система старалась оставить её свободной, но не получилось. Из-за этого метафайл MFT все-таки может фрагментироваться, хоть это и нежелательно.
В отличие от FAT каждый элемент системы NTFS представляет собой файл, даже служебная информация. Самый главный файл в NTFS называется MFT (Master File Table) – общая таблица файлов. Он размещается в MFT-зоне и представляет собой централизованный каталог всех файлов диска, включая сам MFТ. MFТ позволяет определять местонахождение всех остальных файлов.
MFT поделен на записи фиксированного размера, размер которых задается при форматировании – 1, 2 или 4 кбайт (обычно 1 Кбайт). Каждая запись соответствует какому-либо файлу. Приблизительный размер MFT-файла равен:
Размер записи х NFiles, где NFiles – полное количество файлов раздела.
Первые 16 файлов носят служебный характер и недоступны операционной системе – они называются метафайлами, причем самый первый метафайл – сам MFT. Эти первые 16 элементов MFT – единственная часть диска, имеющая фиксированное положение. Вторая копия этих 16 записей, для надежности хранится ровно посередине диска. Остальной MFT-файл, при недостатке места в MFT-зоне, может фрагментироваться, т.е. располагаться, как и любой другой файл, в произвольных местах диска. Установить расположение частей MFT можно с помощью его самого, "зацепившись" за первый элемент MFT. Нулевая запись MFT содержит описание самой MFT, в том числе и адреса всех ее отрезков.
Иными словами, сама таблица MFT системой рассматривается как файл, к которому применим метод размещения в виде нескольких отрезков, произвольно расположенных в томе. Напомним, что в системе FAT таблица размещения файлов занимает строго отведенную для нее часть дискового пространства и не может быть фрагментирована.
Каждый из метафайлов отвечает за какой-либо аспект работы системы. Преимущество такого модульного подхода заключается в поразительной гибкости. Например, в FAT физическое повреждение в самой области FAT фатально для функционирования всего диска, а NTFS может сместить и даже фрагментировать по диску, все свои служебные области, обойдя любые неисправности поверхности, кроме первых 16 элементов MFT. Метафайлы находятся корневом каталоге NTFS-диска, они начинаются с символа имени "$" (табл. 7.2).
Таблица 7.2. Метафайлы NTFS
№ | Системный файл | Имя файла | Назначение файла |
Главная таблица файлов | $MFT | Содержит полный список файлов тома NTFS | |
Копия главной таблицы файлов | $MFTMirr | Зеркальная копия первых трех записей MFT | |
Файл журнала | $LogFile | Список транзакций, который используется для восстановления файловой системы после сбоев | |
Том | $Volume | Имя тома, версия NTFS и другая информация о томе | |
Таблица определения атрибутов | $AttrDef | Таблица имен, номеров и описаний атрибутов | |
Индекс корневого каталога | $. | Корневой каталог | |
Битовая карта кластеров | $Bitmap | Разметка использованных кластеров тома | |
Загрузочный сектор раздела | $Boot | Адрес загрузочного сектора раздела | |
Файл плохих кластеров | $BadClus | Файл, содержащий список всех обнаруженных на томе плохих кластеров | |
Таблица квот | $Quota | Квоты используемого пространства на диске для каждого пользователя | |
Таблица преобразования регистра символов | $Upcase | Используется для преобразования регистра символов для кодировки Unicode | |
11-15 | Зарезервированы для будущего использования |
Файлы NTFS. У системы NTFS нет ничего кроме файлов. Все файлы на томе NTFS идентифицируются номером файла, который определяется позицией записи файла в MFT. Система NTFS располагает файлы и их части в отрезках. Отрезком называется непрерывная последовательность смежных кластеров, характеризующаяся номером начального кластера и длиной.
Порядковый номер кластера в томе NTFS называется логическим номером кластера (LCN – Logical Cluster Number). Порядковый номер кластера внутри файла называется виртуальным номером кластера (VCN – Virtual Cluster Number). В качестве адреса отрезка NTFS использует логический номер его первого кластера, а также количество кластеров в отрезке k, то есть пара (LCN, k). Таким образом, часть файла, помещенная в отрезок и начинающаяся с виртуального кластера VCN, характеризуется адресом, состоящим из трех чисел: (VCN, LCN, k).
Для хранения номера кластера в NTFS используются 64-разрядные указатели, что дает возможность поддерживать тома и файлы размером до 264кластеров, что значительно больше емкости современных жестких дисков.
Классическое определение, данное в учебниках информатики, отождествляет файл с именованной записью на диске. Большинство файловых систем добавляет к этому понятие атрибута (attribute) – некоторой вспомогательной характеристики, описывающей время создания, права доступа и т.д. В NTFS имя файла, данные файла и его атрибуты полностью уравнены в правах.
Каждый файл и каталог на томе NTFS представляет собой набор атрибутов. Важно отметить, что имя файла и его данные также рассматриваются как атрибуты файла, то есть в NTFS кроме атрибутов, у файла нет никаких других компонентов. Каждый из атрибутов хранится как отдельный поток (stream) байтов, поэтому во избежание путаницы атрибуты, хранящие данные файла, часто называют потоками.
В NTFS файл целиком размещается в записи таблицы MFT, если это позволяет сделать его размер. В случае, когда размер файла больше размера записи MFT, в запись помещаются только некоторые атрибуты файла, а остальная часть файла размещается в отдельном отрезке тома (или нескольких отрезках). Часть файла, размещаемая в записи MFT, называется резидентной частью, а остальные части – нерезидентными. Адресная информация об отрезках, содержащих нерезидентные части файла, размещается в атрибутах резидентной части.
То есть файл имеет обязательный элемент – запись в MFT, где хранится вся информация о файле (имя файла, размер, положение на диске отдельных фрагментов). Если для информации не хватает одной записи MFT, то используются несколько, причем не обязательно подряд. Дополнительные нерезидентные части файла (атрибуты данных) могут отсутствовать. У некоторых файлов данных может вовсе не быть, а у файлов небольшого размера (сотни байт) данные хранятся прямо в записи таблицы MFT, в оставшемся от обязательной информации месте.
Дополнительные потоки не видны стандартными средствами ОС: наблюдаемый размер файла – это лишь размер основного потока, который содержит традиционные данные. Например, можно иметь файл нулевой длины, при стирании которого освободится 1 Гбайт свободного места потому, что какая-нибудь программа прикрепила к нему дополнительный поток в 1 Гбайт. Файл в NTFS – это более глубокое понятие, чем можно себе вообразить, просто просматривая каталоги диска.
Имя файла может содержать любые символы, включая полый набор национальных алфавитов, так как данные представлены в Unicode – 16-битном представлении, которое дает 65535 разных символов. Максимальная длина имени файла – 255 символов.
Каждый атрибут файла NTFS состоит из полей: тип атрибута, длина атрибута, значение атрибута и, возможно, имя атрибута. Тип атрибута, длина и имя образуют заголовок атрибута.
Имеется системный набор атрибутов, определяемых структурой тома NTFS. Системные атрибуты имеют фиксированные имена и коды их типа, а также определенный формат. Могут применяться также атрибуты, определяемые пользователями.
Системный набор включает следующие атрибуты:
· Attribute List (список атрибутов) – список атрибутов, из которых состоит файл; содержит ссылки на номер записи MFT, где расположен каждый атрибут; нужен только в том случае, если атрибуты файла не умещаются в основной записи и занимают дополнительные записи MFT;
· File Name (имя файла) – содержит длинное имя файла в формате Unicode, а также номер входа в таблице MFT для родительского каталога; если файл содержится в нескольких каталогах, то у него будет несколько атрибутов типа File Name; этот атрибут всегда резидентный;
· MS-DOS Name (имя MS-DOS) – содержит имя файла в формате 8.3;
· Version (версия) – содержит номер последней версии файла;
· Security Descriptor (дескриптор безопасности) – содержит информацию о защите файла: права доступа и допустимые операции над файлом;
· Volume Version (версия тома) – версия тома, используется только в системных файлах тома;
· Volume Name (имя тома) – имя тома;
· Data (данные) – содержит обычные данные файла;
· MFT bitmap (битовая карта MFT) – содержит карту использования блоков на томе;
· Index Root (корень индекса) – корень В-дерева, используемого для поиска файлов в каталоге;
· Index Allocation (размещение индекса) – нерезидентные части индексного списка В-дерева;
· Standard Information (стандартная информация) – хранит всю остальную стандартную информацию о файле, например, время создания файла, время обновления и другие.
Существуют два способа хранения атрибутов файла – резидентное хранение в записях таблицы MFT и нерезидентное хранение вне ее, во внешних отрезках. Таким образом, резидентная часть файла состоит из резидентных атрибутов, а нерезидентная – из нерезидентных атрибутов. Сортировка файлов может осуществляться только по резидентным атрибутам.
Файлы NTFS в зависимости от способа размещения делятся на небольшие, большие, очень большие и сверхбольшие.
Небольшие файлы (small). Если файл имеет небольшой размер, то он может целиком располагаться внутри одной записи MFT, имеющей, например, размер 2 Кбайт. Небольшие файлы NTFS состоят, по крайней мере, из следующих атрибутов (рис. 7.13):
- стандартная информация (SI – standard information);
- имя файла (FN – file name);
- данные (Data);
- дескриптор безопасности (SD – security descriptor).
Рис. 7.13. Небольшой файл NTFS
Большие файлы (large). Если данные файла не помещаются в одну запись MFT, то этот факт отражается в заголовке атрибута Data, который содержит признак того, что этот атрибут является нерезидентным, то есть находится вне таблицы MFT. В этом случае атрибут Data содержит адресную информацию (LCN, VCN, k) каждого отрезка данных.
Для очень больших (huge) и сверхбольших (extremely huge) файлов в атрибут Data помещаются ссылки на другие адреса, по которым хранятся адреса отрезков с данными или опять ссылки на адреса с адресами. Поэтому в NTFS не может быть атрибутов слишком большой для системы длины.
Каталоги.Каждый каталог NTFS представляет собой один вход в таблицу MFT, который содержит атрибут Index Root. Каталог NTFS представляет собой специфический файл, хранящий ссылки на другие файлы и каталоги, создавая иерархическое строение данных на диске. Файл каталога поделен на блоки, каждый из которых содержит имя файла, базовые атрибуты и ссылку на элемент MFT, который уже предоставляет полную информацию об элементе каталога.
Внутренняя структура каталога представляет собой бинарное дерево. Для поиска имени файла в линейном каталоге, например, у FAT, операционной системе приходится последовательно просматривать все элементы каталога. Бинарное дерево располагает имена файлов таким образом, чтобы ускорить их поиск с помощью запросов типа «выше или ниже данного элемента, находится искомое имя?» Запрос делается к среднему элементу, и каждый ответ сужает зону поиска в среднем в два раза. Файлы отсортированы по алфавиту и ответ на вопрос осуществляется сравнением начальных букв. Область поиска, суженная в два раза, начинает исследоваться аналогично, начиная со среднего элемента (рис. 7.14).
а) б)
Рис. 7.14. Алгоритмы поиска файла в бинарном дереве (а)
и последовательным перебором (б)
В результате вместо перебора большого количества имен (в худшем случае – всех имен каталога) выполняется сравнение с гораздо меньшим количеством имен узлов и имен в одной из групп каталога. Для поиска одного файла среди тысячи FAT придется осуществить около 500 сравнений (наиболее вероятно, что файл будет найден на середине поиска), а системе на основе дерева – всего около 12 сравнений. Необходимо отметить, что FAT32 в современных ОС (начиная с Windows 98) использует сходную оптимизацию поиска.
Для выполнения простейшей навигации по диску не нужно обращаться к MFT за каждым файлом, надо лишь читать самую общую информацию о файлах из файлов каталогов. Главный каталог диска (корневой) ничем не отличается от обычных каталогов, кроме специальной ссылки на него из начала метафайла MFT.
Надежность. NTFS – отказоустойчивая система, которая вполне может привести себя в корректное состояние при практически любых реальных сбоях. Любая современная файловая система основана на таком понятии, как транзакция – действие, совершаемое целиком и корректно или не совершаемое вообще. У NTFS просто не бывает промежуточных (ошибочных или некорректных) состояний, т.к. квант изменения данных не может быть поделен на «до» и «после сбоя», он либо совершен, либо отменен.
Пример 1. Осуществляется запись данных на диск. Вдруг выясняется, что в том месте, куда мы решили записать очередную порцию данных – физическое повреждение поверхности. В этом случае транзакция записи откатывается целиком, место помечается как сбойное, и начинается новая транзакция по записи данных в другое место.
Пример 2.Идет запись данных на диск, вдруг отключается питание и система перезагружается. На помощь приходит другой механизм NTFS – журнал транзакций. Система, перед записью на диск, пометила в метафайле $LogFile свое состояние. При перезагрузке это файл проверяется на предмет наличия незавершенных транзакций, которые были прерваны аварией и результат которых непредсказуем. Эти транзакции отменяются, место, куда осуществлялась запись, помечается как свободное, индексы и элементы MFT приводятся в состояние, в котором они были до сбоя, и система в целом остается стабильна. Ну а если ошибка произошла при записи в журнал? Тоже ничего страшного: сама транзакция либо еще не начиналась, либо уже закончилась и идет запись, что транзакция уже выполнена. В последнем случае при перезагрузке система сама разберется, что на самом деле всё и так записано корректно, и не обратит внимания на "незаконченную" транзакцию.
Конечно журналирование – не абсолютная панацея. Тем не менее, NTFS восстанавливается в полностью корректное состояние даже при сбоях в моменты, очень загруженные дисковой активностью. Важно понимать, что система восстановления NTFS гарантирует корректность файловой системы, а не ваших данных. Если авария произошла в момент записи на диск, ваши данные могут и не записаться. Чудес не бывает.
Фрагментация в NTFS.Ситуация с фрагментацией файлов в NTFS является сложной и неоднозначной. В самом начале утверждалось, что NTFS не подвержена фрагментации файлов. Это оказалось не совсем так, и утверждение сменили – NTFS препятствует фрагментации. Оказалось, что и это не совсем так. То есть она, конечно, препятствует, но толк от этого близок к нулю. Сейчас уже понятно, что NTFS – система, которая как никакая другая предрасположена к фрагментации, что бы ни утверждалось официально. Однако все внутренние структуры логически построены таким образом, что фрагментация не мешает быстро находить фрагменты данных. Тем не менее, такое серьезное негативное последствие фрагментации как лишние движения головок остается.
Как известно, система сильнее всего фрагментирует файлы, когда свободное место кончается и приходится использовать мелкие дырки, оставшиеся от других файлов. Тут проявляется первое свойство NTFS, которое прямо способствует серьезной фрагментации. Диск NTFS поделен на две зоны. В начала диска идет MFT зона, в которую запись данных невозможна, чтобы не фрагментировался хотя бы MFT. Но когда весь остальной диск заполняется, зона MFT сокращается ровно в два раза. В результате если NTFS работает на диске, заполненном примерно на 90%, фрагментация стремительно растет. При этом диск, заполненный более чем на 88%, дефрагментировать почти невозможно, т. к. нельзя перемещать данные в MFT зону.
NTFS фрагментируется даже в том случае, если свободное место далеко от истощения, чему способствует используемый алгоритм нахождения места для записи файлов. При записи берется какой-то определенный объем диска и заполняется файлом до упора, причем сначала заполняются большие дырки, потом маленькие. Типичное распределение фрагментов файла по размеру на фрагментированной NTFS выглядит так (размеры фрагментов): 16 - 16 - 16 - …[назад] - 15 - 15 - 15 - …[назад] - 14 - 14 - 14 .... 1 - 1 - 1 -1 - 1.
Так процесс идет до самых мелких «дырок» в 1 кластер, несмотря на то, что на диске есть и гораздо большие куски свободного места.
Сравнение файловых систем
Сравнение распространенных файловых систем FAT, FAT32 и NTFS дано в табл. 7.3.
Таблица 7.3
Характеристика | FAT | FAT32 (vFAT) | NTFS |
Системы, её поддерживающие | DOS, Windows 9Х, NT всех версий | Windows98, NT5 | NT4, NT5 |
Максимальный размер тома | 2 Гбайт | Практически не ограничен | Практически не ограничен |
Макс. число файлов на томе | Примерно 65 тыс. | Практически не ограничено | Практически не ограничено |
Имя файла | Поддержка длинных имен - 255 символов, системный набор символов | Поддержка длинных имен - 255 символов, системный набор символов | 255 символов, любые символы любых алфавитов (65 тыс. разных начертаний) |
Возможные атрибуты файла | Базовый набор | Базовый набор | Любые |
Сжатие | Нет (возможно при использовании дополнительного ПО) | Нет | Да |
Устойчивость к сбоям | Средняя (система проста и поэтому ломаться особо нечему) | Плохая (средства оптимизации по скорости привели к появлению слабых мест) | Полная - автоматическое восстановление системы при любых сбоях (не считая физические ошибки записи, когда пишется одно, а на деле записывается другое) |
Экономичность | Минимальная (огромные размеры кластеров на больших дисках) | Улучшена за счет уменьшения размеров кластеров | Максимальная - очень эффективная и разнообразная система хранения данных |
Быстродействие | Высокое для малого числа файлов, но быстро уменьшается с увеличением числа файлов в каталогах (плохое для заполненных дисков) | Полностью аналогично FAT, но на дисках большого размера (десятки гигабайт) начинаются проблемы | Не очень эффективна для малых и простых разделов (до 1 Гбайт); по скорости работы с большими каталогами и массивами данных значительно превосходит другие системы |
Системы программирования