Рассмотрим более сложный пример фрагментированного файла со следующим списком отрезков: 31 38 73 25 34 32 14 01 E5 11 02 31 42 AA 00 03 00
31h
. Один байт приходится на поле длины, и три байта — на поле начального кластера. Таким образом, первый отрезок (run 1) начинается с кластера 342573h
и продолжается вплоть до кластера 342573h + 38 == 3425ABh
. Чтобы найти смещение следующего отрезка в списке, мы складываем размер обоих полей с их начальным смещением: 3 + 1 == 4
. Отсчитываем четыре байта от начала списка отрезков и переходим к декодированию следующего отрезка: 32h
— два байта на поле длины отрезка (равное в данном случае 0114h
) и три байта — на поле номера начального кластера (0211E5h
). Следовательно, второй отрезок (run 2) начинается с кластера 0211E5h
и продолжается вплоть до кластера 0211E5h + 114h == 212F9h
. Третий отрезок (run 3): 31h
— один байт на поле длины и три байта — на поле начального кластера, равные 42h
и 0300AAh
соответственно. Поэтому третий отрезок (run 3) начинается с кластера 0300AAh
и продолжается вплоть до кластера 0300AAh + 42h == 300ECh
. Завершающий ноль на конце списка отрезков сигнализирует о том, что это последний отрезок в файле.Таким образом, подопытный файл состоит из трех отрезков, разбросанных по диску в следующем живописном порядке: 342573h
3425ABh
; 0211E5h
–212F9h
; 0300AAh
–300ECh
. Остается только прочитать его с диска! Нет ничего проще!Начиная с версии 3.0, NTFS поддерживает разреженные (sparse) атрибуты, т.е. такие атрибуты, которые не записывают на диск кластеры, содержащие одни нули. При этом поле номера начального кластера отрезка может быть равным нулю, что означает, что данному отрезку не выделен никакой кластер. Поле длины содержит количество кластеров, заполненных нулями. Их не нужно считывать с диска. Вы должны самостоятельно изготовить их в памяти. Между прочим, далеко не все дисковые доктора знают о существовании разреженных атрибутов (если атрибут разрежен, его флаг равен 8000h
Пространства имен
NTFS изначально проектировалась как файловая система, не зависящая от платформы, способная работать с большим количеством различных подсистем, в том числе: Win32, MS-DOS, POSIX. Так как каждая из перечисленных подсистем налагает собственные ограничения на набор символов, допустимых для использования в имени файла, NTFS вынуждена поддерживать несколько независимых пространств имен (name spaces).
Допустимы все символы UNICODE (с учетом регистра), за исключением символа нуля (NULL
\
) и знака двоеточия (:
). Последнее из перечисленных ограничений, кстати говоря, не есть ограничение POSIX. Напротив, это — внутреннее ограничение файловой системы NTFS, использующей этот символ для доступа к именованным атрибутам. Максимально допустимая длина имени составляет 255 символов.Доступны все символы UNICODE (без учета регистра), за исключением следующего набора: кавычки ("
*
), косая черта (/
), двоеточие (:
), знак "меньше" (<
), знак "больше" (>
), вопросительный знак (?
), обратная косая черта (\
), а также символ конвейера (|
). Кроме того, имя файла не может заканчиваться точкой или пробелом. Максимально допустимая длина имени составляет 255 символов.Доступны все символы пространства имен Win32 (без учета регистра), за исключением следующих: знак плюса (+
,
), точка (.
), точка с запятой (;
), знак равенства (=
). Длина имени файла не должна превышать восьми символов, за которыми следует необязательное расширение имени файла, имеющее длину от одного до трех символов.Назначение служебных файлов
NTFS содержит большое количество служебных файлов (метафайлов) строго определенного формата. Важнейший из метафайлов, $MFT
Краткие сведения о назначении важнейших метафайлов приведены в табл. 6.11. К сожалению, в пределах одной главы нет возможности подробно рассмотреть структуру всех существующих метафайлов, поэтому заинтересованным читателям рекомендуется искать эту информацию в документации к Linux-NTFS Project.