Модель отслеживания дисковых блоков состоит в том, что они выделяются последо-
вательными участками, насколько это возможно. О дним из способов достижения непрерывности этих участков
является выделение дискового пространства по несколько блоков за один раз.
Б локи потока описываются последовательностью записей, каждая их которых опи-
сывает последовательность логически смежных блоков. Для потока без пропусков
будет только одна такая запись. К этой категории принадлежат такие потоки, которые
записаны по порядку с начала и до конца.
Ф айлы с пропусками называются разреженными файлами (sparse files).
Каждая запись начинается с заголовка, в котором дается смещение первого блока
потока. Затем идет смещение первого не описанного данной записью блока.
З а заголовком записи следует одна или несколько пар (в каждой даются дисковый
адрес и длина участка). Дисковый адрес — это смещение дискового блока от начала
раздела, длина участка — это количество блоков в участке. В записи участка может
быть столько пар, сколько необходимо. Использование этой схемы для потока из трех
участков и девяти блоков показано на рис. 11.25.
и споль-
зуются две или более записи MFT. На рис. 11.26 мы видим файл, основная запись
которого находится в записи 102 в MFT. Он имеет слишком много (для одной записи
MFT) участков, поэтому вычисляется количество нужных записей расширения (на-
пример, две) и их индексы помещаются в основную запись. Остальная часть записи
используется для первых k участков данных.
Рис. 11.26. Файл, которому требуется три записи MFT для хранения всех его участков
Обратите внимание
Е сли нужно очень много записей MFT, то появляется проблема: может не хватить ме-
ста в основной MFT для размещения всех их индексов. Для этой проблемы также есть
решение: список записей расширения MFT делается нерезидентным, то есть хранится
в других дисковых блоках (вместо основной записи MFT). В этом случае он может
увеличиваться настолько, насколько это нужно.
Элемент MFT для небольшого каталога показан на рис. 11.27. Запись содержит не-
которое количество элементов каталога, каждый из которых описывает один файл
или каталог. Каждый элемент содержит структуру фиксированной длины, за которой
следует имя файла (переменной длины). Фиксированная часть содержит индекс эле-
мента MFT для данного файла, длину имени файла, а также разнообразные прочие
поля и флаги. Поиск элемента каталога состоит из опроса всех имен файлов по очереди.
Большие каталоги используют другой формат. Вместо линейного перечисления файлов
используется дерево В+ (чтобы сделать возможным алфавитный поиск и облегчить
вставку новых имен в нужное место каталога).
В дополнение к обычным файлам и каталогам NTFS поддерживает и жесткие ссылки
(в UNIX-смысле), а также символические ссылки (с использованием механизма под
названием точка повторной обработки — reparse points). NTFS поддерживает помет-
ку файла или каталога как точки повторной обработки и ассоциирование с ней блока
данных. Когда такой файл или каталог встречается во время разбора имени файла, опе-
рация заканчивается неудачей и диспетчеру объектов возвращается этот блок данных.
Диспетчер объектов может интерпретировать данные как представляющие альтерна-
тивный маршрут, после чего он обновляет строку для разбора и повторяет операцию
ввода-вывода. Этот механизм используется для поддержки как символических ссылок,
так и смонтированных файловых систем, выполняя перенаправление поиска в другую
часть иерархии каталогов или даже в другой раздел диска.
NTFS поддерживает прозрачное сжатие файлов. Файл может создаваться в сжатом
режиме, а это означает, что NTFS пытается автоматически сжать блоки при их записи
на диск и автоматически распаковывает их при чтении обратно. Те процессы, которые
читают или пишут сжатые файлы, совершенно не в курсе того факта, что происходит
сжатие или распаковка.
Сжатие работает следующим образом. Когда NTFS пишет файл (помеченный как сжа-
тый) на диск, то она изучает первые 16 (логических) блоков файла — независимо от
того, сколько участков они занимают. Затем запускает по ним алгоритм сжатия. Если
полученные данные можно записать в 15 или менее блоков, то сжатые данные записы-
ваются на диск (по возможности — одним участком). Если сжатые данные по-прежнему
занимают 16 блоков, то эти 16 блоков записываются в несжатом виде. Затем исследуются
блоки 16–31, чтобы узнать, можно ли их сжать до размера 15 блоков (или менее), и т. д.
На рис. 11.28, а показан файл, в котором первые 16 блоков успешно сжались до 8 бло-
ков, вторые 16 блоков не сжались, а третьи 16 блоков также сжались на 50 %. Эти три
части были записаны как три участка и сохранены в записи MFT. «Отсутствующие»
блоки хранятся в элементе MFT с дисковым адресом 0 (рис. 11.28, б). Здесь за заго-
л овком (0, 48) следует пять пар: две для первого (сжатого) участка, одна для несжатого
участка и две для последнего (сжатого) участка.
К огда файл считывается обратно, NTFS должна знать, какие участки сжаты, а какие —
нет. Она может определить это по дисковым адресам. Дисковый адрес 0 указывает
на то, что это последняя часть 16 сжатых блоков. Дисковый блок 0 не может исполь-
зоваться для хранения данных (во избежание неоднозначности). Поскольку блок 0
тома содержит загрузочный сектор, использование его для данных в любом случае
невозможно.
Журналирование
NTFS поддерживает два механизма, при помощи которых программы могут обнаружить
изменения в файлах и каталогах. Первый — это операция NtNotifyChangeDirectoryFile,
передающая системе буфер, который возвращается после обнаружения изменения
в каталоге или подкаталоге. В результате ввода-вывода буфер заполняется списком
записей об изменениях. Если он очень маленький, записи теряются.
Второй механизм — это журнал изменений NTFS. NTFS содержит список всех записей
об изменениях для каталогов и файлов тома в специальном файле, который програм-
мы могут читать при помощи специальных операций управления файловой системой
( опция FSCTL_QUERY_USN_JOURNAL вызова NtFsControlFile). Файл журнала обычно
очень большой, поэтому вероятность затирания записей до того, как они будут изучены,
очень мала.