Добавлен: 29.10.2018
Просмотров: 47991
Скачиваний: 190
11.8. Файловая система Windows NT
1031
В то время как большая часть NT была создана на суше, NTFS является уникальным
компонентом операционной системы, потому что большая часть ее проектирования
происходила на борту парусной шлюпки в проливе Puget Sound (причем соблюдался
строгий протокол: утром — работа, после обеда — отдых). Далее мы изучим функцио-
нальные возможности NTFS, начиная с ее структуры, затем перейдем к поиску имен
файлов, сжатию файлов, журналированию и шифрованию файлов.
Структура файловой системы
Каждый том NTFS (например, дисковый раздел) содержит файлы, каталоги, битовые
массивы и другие структуры данных. Каждый том организован как линейная после-
довательность блоков (которые в терминологии компании Microsoft называются кла-
стерами), причем размер блоков для каждого тома фиксирован (в зависимости от раз-
мера тома он может изменяться от 512 байт до 64 Кбайт). Большинство дисков NTFS
использует блоки размером 4 Кбайт — это компромисс между применением больших
блоков (для эффективной передачи данных) и использованием маленьких блоков (для
снижения внутренней фрагментации). Ссылки на блоки делаются с использованием
смещения от начала тома (при помощи 64-битных чисел).
Главная структура данных каждого тома — это MFT (Master File Table — главная табли-
ца файлов), которая является линейной последовательностью записей фиксированного
размера (1 Кбайт). Каждая запись MFT описывает один файл или один каталог. Она
содержит атрибуты файла (такие, как его имя и временная метка), а также список
дисковых адресов (где расположены его блоки). Если файл очень большой, то иногда
приходится использовать две или более записи MFT (чтобы разместить в них список
всех блоков). В этом случае первая запись в MFT, называемая основной записью (base
record), указывает на дополнительные записи в MFT. Такая схема переполнения ведет
свое начало из СР/М, где каждый элемент каталога назывался экстентом. Битовый
массив отслеживает свободные элементы MFT.
Сама MFT также является файлом и в качестве такового может быть размещена в лю-
бом месте тома (таким образом устраняется проблема наличия дефектных секторов
на первой дорожке). Более того, при необходимости этот файл может расти (до мак-
симального размера в 2
48
записей).
MFT показана на рис. 11.24. Каждая запись MFT состоит из последовательности пар
(заголовок атрибута — значение). Каждый атрибут начинается с заголовка, рассказы-
вающего о том, что это за атрибут и какую длину имеет его значение. Некоторые зна-
чения атрибутов (такие, как имя файла и его данные) имеют переменную длину. Если
значение атрибута достаточно короткое для того, чтобы уместиться в записи MFT, то
оно помещается именно туда. Если же значение слишком длинное, то оно размещается
на диске, а в запись MFT помещается указатель на него. Это делает систему NTFS очень
эффективной для небольших полей, которые могут разместиться в самой записи MFT.
Первые 16 записей MFT резервируются для файлов метаданных NTFS (см. рис. 11.24).
Каждая из этих записей описывает нормальный файл, который имеет атрибуты и бло-
ки данных (как и любой другой файл). Каждый из этих файлов имеет имя, которое
начинается со знака доллара (чтобы обозначить его как файл метаданных). Первая
запись описывает сам файл MFT. В частности, в ней говорится, где находятся блоки
файла MFT (чтобы система могла найти файл MFT). Очевидно, что Windows нужен
способ нахождения первого блока файла MFT, чтобы найти остальную информацию по
1032
Глава 11. Изучение конкретных примеров: Windows 8
Рис. 11.24. Главная таблица файлов NTFS
файловой системе. Windows смотрит в загрузочном блоке — именно туда записывается
адрес первого блока файла MFT при форматировании тома.
Запись 1 является дубликатом начала файла MFT. Эта информация настолько ценная,
что наличие второй копии может быть просто критическим (в том случае, если один
из первых блоков MFT перестанет читаться). Вторая запись — файл журнала. Когда
в файловой системе происходят структурные изменения (такие, как добавление нового
или удаление существующего каталога), то такое действие журналируется здесь до его
выполнения (чтобы повысить вероятность корректного восстановления в случае сбоя
во время операции, например такого, как отказ системы). Здесь также журналируются
изменения в файловых атрибутах. Фактически не журналируются здесь только из-
менения в пользовательских данных. Запись 3 содержит информацию о томе (такую,
как его размер, метка и версия).
Как уже упоминалось, каждая запись MFT содержит последовательность пар «заголо-
вок атрибута — значение». Атрибуты определяются в файле
$AttrDef
. Информация об
этом файле содержится в MFT (в записи 4). Затем идет корневой каталог, который сам
является файлом и может расти до произвольного размера. Он описывается записью
номер 5 в MFT.
Свободное пространство тома отслеживается при помощи битового массива. Сам би-
товый массив — тоже файл, его атрибуты и дисковые адреса даны в записи 6 в MFT.
11.8. Файловая система Windows NT
1033
Следующая запись MFT указывает на файл начального загрузчика. Запись 8 исполь-
зуется для того, чтобы связать вместе все плохие блоки (чтобы обеспечить невозмож-
ность их использования для файлов). Запись 9 содержит информацию безопасности.
Запись 10 используется для установления соответствия регистра. Для латинских букв
A — Z соответствие регистра очевидно (по крайней мере для тех, кто разговаривает
на романских языках). Однако соответствие регистров для других языков (таких, как
греческий, армянский или грузинский) для говорящих на романских языках не столь
очевидно, поэтому данный файл рассказывает, как это сделать. И наконец, запись 11 —
это каталог, содержащий различные файлы для таких вещей, как дисковые квоты,
идентификаторы объектов, точки повторной обработки и т. д. Последние четыре записи
MFT зарезервированы для использования в будущем.
Каждая запись MFT состоит из заголовка записи, за которым следуют пары «заголо-
вок атрибута — значение». Заголовок записи содержит системный код, используемый
для проверки достоверности, последовательный номер (обновляемый каждый раз,
когда запись используется для нового файла), счетчик количества ссылок на файл,
фактическое количество использованных в записи байтов, идентификатор (индекс,
порядковый номер) основной записи (используется только для записей расширения),
а также некоторые другие поля.
NTFS определяет 13 атрибутов, которые могут появиться в записях MFT. Они пере-
числены в табл. 11.16. Каждый заголовок атрибута идентифицирует атрибут и содер-
жит длину и местоположение поля значения, а также разнообразные флаги и прочую
информацию. Обычно значения атрибутов следуют непосредственно за своими заго-
ловками атрибутов, но если значение слишком длинное для того, чтобы поместиться
в запись MFT, то оно может быть размещено в отдельных дисковых блоках. Такой атри-
бут называется нерезидентным атрибутом (nonresident attribute). Очевидно, что таким
атрибутом является атрибут данных. Некоторые атрибуты (такие, как имя) могут
Таблица 11.16. Используемые в записях MFT атрибуты
Атрибут
Описание
Standard
information
Биты флагов, временные метки и т. д.
File name
Имя файла в Unicode, может повторяться для имени MS-DOS
Security descriptor
Устарел. Информация безопасности теперь находится в $Extend$Secure
Attribute list
Местоположение дополнительных записей MFT (при необходимости)
Object ID
Уникальный для данного тома 64-битный идентификатор файла
Reparse point
Используется для монтирования и символических ссылок
Volume name
Название данного тома (используется только в $Volume)
Volume information
Версия тома (используется только в $Volume)
Index root
Используется для каталогов
Index allocation
Используется для очень больших каталогов
Bitmap
Используется для очень больших каталогов
Logged utility stream
Управляет журналированием в $LogFile
Data
Данные потока, могут повторяться
1034
Глава 11. Изучение конкретных примеров: Windows 8
повторяться, но все атрибуты должны присутствовать в записи MFT в определенном
порядке. Заголовки резидентных атрибутов имеют длину 24 байта, заголовки нерези-
дентных атрибутов длиннее (поскольку они содержат информацию о том, где нужно
искать атрибут на диске).
Стандартное информационное поле содержит: сведения о владельце файла, информа-
цию безопасности, нужные для POSIX временные метки, количество жестких ссылок,
биты архивирования и «только для чтения» и т. д. Это поле имеет фиксированную дли-
ну и присутствует всегда. Имя файла — это строка переменной длины в коде Unicode.
Для того чтобы файлы с не соответствующими правилам MS-DOS именами могли
быть доступны старым 16-битным программам, они могут иметь короткие имена (short
name) по принятой в MS-DOS схеме 8 + 3. Если реальное имя файла соответствует
схеме именования в MS-DOS (8 + 3), то второе имя MS-DOS не нужно.
В NT 4.0 информация безопасности размещалась в атрибуте, но в Windows 2000 и более
поздних вся информация безопасности размещается в одном файле (чтобы она могла
совместно использоваться многими файлами). Это приводит к существенной экономии
места во многих записях MFT и в файловой системе в целом, поскольку информация
безопасности идентична для большого количества принадлежащих одному пользова-
телю файлов.
Список атрибутов нужен в том случае, когда атрибуты не помещаются в запись MFT.
Из этого атрибута можно узнать, где искать записи расширения. Каждый элемент
списка содержит 48-битный индекс по MFT (который говорит о том, где находится
запись расширения) и 16-битный порядковый номер (для проверки того, что запись
расширения соответствует базовой записи).
Файлы NTFS имеют связанный с ними идентификатор, который подобен номеру
узла i-node в UNIX. Файлы можно открывать по идентификатору, но присваиваемый
файловой системой NTFS идентификатор не всегда можно использовать, поскольку
он основан на записи MFT и может измениться при перемещении записи для данного
файла (например, если файл восстанавливается из резервной копии). NTFS позволя-
ет использовать отдельный атрибут «идентификатор объекта», который может быть
установлен для файла и который нет необходимости изменять. Его можно сохранить
вместе с файлом (например, если он копируется на новый том).
Точка повторной обработки сообщает разбирающей имя файла процедуре о необходи-
мости сделать что-то особенное. Этот механизм используется для явного монтирования
файловых систем и для символических ссылок. Два атрибута тома используются только
для идентификации томов. Следующие три атрибута работают с реализацией катало-
гов. Маленькие каталоги — это просто списки файлов, а большие реализованы как де-
ревья В+. Атрибут logged utility stream используется шифрующей файловой системой.
И наконец, мы подошли к атрибуту, который важнее всех: потоку (или потокам)
данных. Файл в NTFS имеет один (или несколько) связанных с ним потоков данных.
Именно здесь находится его полезное содержание. Поток данных по умолчанию
(default data stream) названия не имеет (например, dirpath\filename::$DATA), но аль-
тернативные потоки данных
(alternate data stream) имеют имена, например: dirpath\
filename:streamname:$DATA.
Имя каждого потока (если оно имеется) находится в заголовке этого атрибута. Сле-
дом за заголовком идет либо список дисковых адресов (это содержащиеся в потоке
блоки), либо (для потоков всего в несколько сотен байтов, а таких много) сам поток.
11.8. Файловая система Windows NT
1035
Размещенные в записи MFT реальные данные потока называются непосредственным
файлом
— immediate file (Mullender and Tanenbaum, 1984).
Конечно, в основном данные не помещаются в запись MFT, поэтому данный атрибут
обычно нерезидентный. Теперь давайте рассмотрим, как NTFS отслеживает местопо-
ложение нерезидентных атрибутов.
Выделение дискового пространства
Модель отслеживания дисковых блоков состоит в том, что они выделяются последо-
вательными участками, насколько это возможно (из соображений эффективности).
Например, если первый логический блок потока помещен в блок 20 диска, то система
будет очень стараться поместить второй логический блок в блок 21, третий логический
блок — в блок 22 и т. д. Одним из способов достижения непрерывности этих участков
является выделение дискового пространства по несколько блоков за один раз (по мере
возможности).
Блоки потока описываются последовательностью записей, каждая их которых опи-
сывает последовательность логически смежных блоков. Для потока без пропусков
будет только одна такая запись. К этой категории принадлежат такие потоки, которые
записаны по порядку с начала и до конца. Для потока с одним пропуском (например,
определены только блоки 0–49 и блоки 60–79) будет две записи. Такой поток может
быть получен при помощи записи первых 50 блоков, а затем пропуска до 60-го блока
и записи еще 20 блоков. Когда такой пропуск считывается, все недостающие байты —
нулевые. Файлы с пропусками называются разреженными файлами (sparse files).
Каждая запись начинается с заголовка, в котором дается смещение первого блока
потока. Затем идет смещение первого не описанного данной записью блока. В приве-
денном ранее примере в первой записи будет заголовок (0, 50) и будут даны дисковые
адреса этих 50 блоков. Во второй записи будет заголовок (60, 80) и дисковые адреса
этих 20 блоков.
За заголовком записи следует одна или несколько пар (в каждой даются дисковый
адрес и длина участка). Дисковый адрес — это смещение дискового блока от начала
раздела, длина участка — это количество блоков в участке. В записи участка может
быть столько пар, сколько необходимо. Использование этой схемы для потока из трех
участков и девяти блоков показано на рис. 11.25.
На этом рисунке у нас есть запись MFT для короткого потока из девяти блоков (за-
головок 0–8). Он состоит из трех участков последовательных блоков на диске. Первый
участок — блоки 20–23, второй — блоки 64–65, третий — блоки 80–82. Каждый из
этих участков заносится в запись MFT как пара (дисковый адрес, количество блоков).
Количество участков зависит от того, насколько хорошо справился со своей работой
модуль выделения блоков при создании потока. Для потока из n блоков количество
участков может составлять от 1 до n.
Здесь нужно сделать несколько замечаний. Во-первых, для представленных таким
способом потоков нет верхнего ограничения размера. Если не использовать сжатие
адресов, то для каждой пары требуется два 64-битных числа (всего 16 байт). Однако
пара может представлять 1 млн (или более) смежных дисковых блоков. Фактически
состоящий из 20 отдельных участков (каждый по 1 млн блоков размером 1 Кбайт)
поток размером 20 Мбайт легко помещается в одну запись MFT, а разбросанный по
60 изолированным блокам поток размером 60 Кбайт в одну запись MFT не помещается.