Вопрос 10. Файловая система NTFS : структура системных файлов, их назначение. Файловый дескриптор, анализ его структуры для резидентного и нерезидентного файла.


Добавил:DMT
Дата создания:30 декабря 2007, 19:01
Дата обновления:10 января 2008, 0:09
Просмотров:20141 последний позавчера, 16:56
Комментариев: 2
Вопрос 10. Файловая система NTFS : структура системных файлов, их назначение. Файловый дескриптор, анализ его структуры для резидентного и нерезидентного файла. Пример (фрагмент, процедура) определяющая номера кластеров расположения нерезидентрого файла на диске на основе анализа цепочки данных файлового дескриптора.

MFT и его структура

Файловая система NTFS представляет собой выдающееся достижение структуризации: каждый элемент системы представляет собой файл - даже служебная информация. Самый главный файл на NTFS называется MFT , или Master File Table - общая таблица файлов. Именно он размещается в MFT зоне и представляет собой централизованный каталог всех остальных файлов диска, и себя самого. MFT поделен на записи фиксированного размера (обычно 1 Кбайт), и каждая запись соответствует какому либо файлу. Первые 16 файлов носят служебный характер и недоступны операционной системе - они называются метафайлами, причем самый первый метафайл - сам MFT. Эти первые 16 элементов MFT - единственная часть диска, имеющая фиксированное положение. Интересно, что вторая копия первых трех записей, для надежности хранится ровно посередине диска. Остальной MFT-файл может располагаться, как и любой другой файл, в произвольных местах диска - восстановить его положение можно с помощью его самого, "зацепившись" за самую основу - за первый элемент MFT.

Дескриптор MFT можно определить как набор атрибутов, включая атрибут - имя файла, атрибут - дескриптор защиты и атрибут – данные. NTFS обозначает ат­рибут его именем, записанным прописными буквами, перед которым стоит знак доллара ($) например: $FILENAME или $ DA ' I ' A . Однако на самом деле эти имена атрибутов соответствуют числовым кодам типа, которые NTFS использует для упорядочения атрибутов внутри дескриптора.

Каждым атрибут хранится и файле как отдельный поток байтов. NTFS не выполняет чтения и записи файлов — она читает и записывает потоки, соответствующие атрибутам. Возможны следующие операции над атри­бутами: создание, удаление, чтение (диапазона байтов) и запись (диапазона бан­тов). Операции чтения и записи обычно работают над безымянным атрибутом данных файла. Однако можно указать другой атрибут данных при помощи синтаксиса именованных потоков данных .

Структура тома NTFS определяет для файлов набор стандартных атрибу­тов. Эти системные атрибуты имеют фиксированные имена и коды типа, и фор­мат их значений определяется NTFS .

Метафайлы

Метафайлы находятся корневом каталоге NTFS диска - они начинаются с символа имени "$". Метафайлы и их назначение:

$MFT сам MFT

$ MFTmirr копия первых 16 записей MFT, размещенная посередине диска

$ LogFile файл поддержки журналирования (см. ниже)

$ Volume служебная информация - метка тома, версия файловой системы, т.д.

$ AttrDef список стандартных атрибутов файлов на томе

$. корневой каталог

$ Bitmap карта свободного места тома

$ Boot загрузочный сектор (если раздел загрузочный)

$ Quota файл, в котором записаны права пользователей на использование дискового пространства (начал работать лишь в NT5)

$ Upcase файл - таблица соответствия заглавных и прописных букв в имен файлов на текущем томе. Нужен в основном потому, что в NTFS имена файлов записываются в Unicode , что составляет 65 тысяч различных символов, искать большие и малые эквиваленты которых очень нетривиально.

Файловая запись MFT содержит либо все атрибу­ты данного файла, либо отображения VCN - LCN , которые определяют, где на диске расположены значения нерезидентных атрибутов файла.

В процессе работы NTFS записывает информацию в еще один важный файл метаданных — журнал транзакций ( log file ). В журнале транзакций ре­гистрируются все операции, влияющие на структуру тома, включая создание файла и любые команды, изменяющие структуру каталогов. Журнал транзакций применяется для восстановления тома NTFS после сбоя системы.

Еще одна запись MFT зарезервирована для корневого каталога (известного также как "\"). Эта запись содержит индекс файлов и каталогов, хранящихся в корне структуры каталогов NTFS. Получив первый запрос на открытие некото­рого файла, NTFS начинает поиск этого файла с файловой записи корневого каталога. После того как файл открыт, NTFS запоминает его файловую ссылку, чтобы при последующих операциях ввода-вывода обращаться к записи MFT этого файла напрямую.

Схема распределения пространства на томе хранится NTFS в файле бито­вой карты ( bitmap file ). Атрибут данных этого файла содержит битовую карту, каждый бит которой представляет один кластер тома и указывает, свободен ли данный кластер или занят некоторым файлом.

Другой важный системный файл — загрузочный файл ( boot file ), в котором хранится код начального загрузчика Windows NT . Для того чтобы можно было загрузить ОС, код начальной загрузки должен располагаться в определенном ме­сте диска. Однако при форматировании утилита Format определяет эту область как файл, создавая для нее файловую запись. Благодаря созданию загрузочного файла NTFS может придерживаться своего правила рассматривать все, находя­щееся в томе, как файлы. Загрузочный файл, как и файлы метаданных NTFS , имеет отдельную защиту при помощи дескрипторов защиты, которые применяются к любым объектам Windows NT . Модель "нее, что находится на диске, есть файл" означает также, что начальный загрузчик можно модифицировать путем обычных операций файлового ввода-вывода, хотя н настоящее время загрузоч­ный файл защищен от редактирования.

Дескриптор файла в NTFS

Вся информа­ция файла хранится в его атрибутах, и таким образом, ряды и колонки MFT описывают всю информацию, хранящуюся на томе NTFS. Размер дескриптора (записи) в MFT для тома — минимум 1 Кбайт и максимум 4 Кбайт — определяется во время его форматирования.

Атрибуты файла в записях (дескрипторах) MFT расположены в порядке возрастания чис­ловых значений кодов типа, некоторые типы атрибутов могут встре­чаться в записи более одного раза. Атрибуты, которые обя­зательны для каждого файла: атрибут стандартной информации, атрибут имени файла, атрибут дескриптора защиты и атрибут данных. В записи MFT могут встре­чаться и другие атрибуты, если они необходимы для данного файла.

Каждый атрибут в файловой записи имеет имя (необязательное) и значе­ние. Имена используются в основном с атрибутами данных для идентификации второго или третьего потока данных в файле. Значение атрибута — это поток байтов, составляющих его. Для маленького файла все его атрибуты и их значения (например, данные файла) умещаются в файловой записи. Если значе­ние атрибута хранится непосредственно в MFT, он называется резидентным атрибутом ( resident attribute ).

В начале каждого атрибута расположен стандартный заголовок, содержа­щий информацию о данном атрибуте, которую NTFS использует для стандарт­ной обработки всех типов атрибутов. Заголовок, который всегда является рези­дентным, содержит информацию о том, является ли атрибут резидентным или нерезидентным. В случае резидентного атрибута заголовок содержит также смещение значения атрибута относительно заголовка и длину этого значения для атрибута-имени файла.

Если значение атрибута хранится непосредственно в MFT, время, необхо­димое NTFS для доступа к нему, значительно сокращается.

Атрибуты, значения которых хранятся не в MET, а в отрезках, называют­ся нерезидентными атрибутами ( nonresident attributes ). ФС определяет, являет­ся ли данный атрибут резидентным или нерезидентным; способ размещения дан­ных прозрачен для программы, осуществляющей доступ к ним.

В случае нерезидентного атрибута, такого, каким должен быть атрибут дан­ных большого файла, его заголовок содержит информацию, необходимую NTFS для поиска значения атрибута на диске.

Только те из стандартных атрибутов, размер которых может возрастать, бывают нерезидентными. Для файла такие атрибуты — это дескриптор защиты, данные, список атрибутов и расширенные атрибуты HPFS. Атрибуты стандартной информации и имени файла всегда резидентные.

 

Пример (фрагмент, процедура) определяющая номера кластеров расположения нерезидентрого файла на диске на основе анализа цепочки данных файлового дескриптора. Функция печатает список кластеров:

Код на C++
  1. void GetFileClusters(
  2. PCHAR lpFileName, //имя файла
  3. ULONG ClusterSize //размер кластера на диске
  4. )
  5. {
  6. HANDLE hFile; //хэндл нерезидентного файла
  7. ULONG OutSize; //размер буфера OutBuf
  8. ULONG FileSize; //размер файла
  9. ULONG Bytes, //количество байт. возвращаемых DeviceIoControl
  10. ClCount, //количество кластеров в файле
  11. r, //счетчики
  12. CnCount; //количество кластеров в файле
  13. LARGE_INTEGER PrevVCN, Lcn;
  14. STARTING_VCN_INPUT_BUFFER InBuf; //номер начального виртуального кластера
  15. PRETRIEVAL_POINTERS_BUFFER OutBuf;
  16. //буфер структуры, описывающей размещение файла на диске
  17.  
  18. hFile = CreateFile(lpFileName, FILE_READ_ATTRIBUTES,
  19. FILE_SHARE_READ,
  20. NULL, OPEN_EXISTING, 0, 0); //открываем нерезидентный файл
  21.  
  22. if (hFile != INVALID_HANDLE_VALUE)
  23. {
  24. FileSize = GetFileSize(hFile, NULL); //определяем размер файла
  25. //определяем размер буфера OutBuf
  26. OutSize = sizeof(RETRIEVAL_POINTERS_BUFFER) + (FileSize / ClusterSize)
  27. * sizeof(OutBuf->Extents);
  28. //выделяем память для структуры
  29. OutBuf = (PRETRIEVAL_POINTERS_BUFFER)malloc(OutSize);
  30. InBuf.StartingVcn.QuadPart = 0; //номер VCN начального экстента файла
  31. //заполняем структуру, описывающую размещение файла
  32. if (DeviceIoControl(hFile, FSCTL_GET_RETRIEVAL_POINTERS, &InBuf,
  33. sizeof(InBuf), OutBuf, OutSize, &Bytes, NULL))
  34. {
  35. //количество кластеров в файле
  36. ClCount = (FileSize + ClusterSize - 1) / ClusterSize;
  37. PrevVCN = OutBuf->StartingVcn; //начальный VCN экстента (равен 0)
  38.  
  39. //цикл перемещения по экстентам файла
  40. for (r = 0; r < OutBuf->ExtentCount; r++)
  41. {
  42. Lcn = OutBuf->Extents[r].Lcn; //LCN кластера начала экстента
  43. //количество кластеров в текущем экстенте:
  44. for(CnCount=OutBuf->Extents[r].NextVcn.QuadPart-PrevVCN.QuadPart;
  45. //печатаем номер кластера
  46. CnCount; CnCount--, Lcn.QuadPart++) printf("%I64x ",Lcn.QuadPart);
  47. //переходим к следующему экстенту
  48. PrevVCN = OutBuf->Extents[r].NextVcn;
  49. }
  50. }
  51. free(OutBuf);
  52. CloseHandle(hFile);
  53. }
  54. }
При использовании обязательна ссылка на http://DMTSoft.ru
up

Комментарии для "Вопрос 10. Файловая система NTFS : структура системных файлов, их назначение. Файловый дескриптор, анализ его структуры для резидентного и нерезидентного файла. "


Пользователь: wetmurlyka
Сообщений: 6
Статус: Незримый
Зарегистрирован:
8 января 2008, 20:08
Был:27 февраля 2008, 19:13
wetmurlyka
smsup
Дата: 9 января 2008, 1:59 Сообщение № 1
Нерезидентные файлы
Сначала рассмотрим случай не¬резидентного размещения файла. При этом четыре байта со смеще¬нием 30 относительно атрибута данных - 80, хранят длину файла, рас¬положенного где-то на диске. В данном примере длина файла $MFT составляет 023260 байт (выделено толстым прямоугольником).
Для того, чтобы определить точное расположение нерезидент¬ною файла на диске, нужно про¬следить цепочку так называемых блоков виртуальных номеров кла¬стеров Virtual Cluster Number (VCN), или просто блоков VCN. Показатель смещения начала этой цепоч-ки относительно начала атрибута данных хранится в двухбайтовом поле, имеющем сме-шение 20 байт относительно начала атрибута данных. В описываемом случае этот показа-тель равен 0040 (пунктирный прямоугольник на рис.12), а сме¬шение области блоков VCN отно¬сительно начала записи MFT рав¬но 00F8+0040 = 0138. На рис.3 эта область обведена произвольным многоугольником.

Анализ области блоков VCN
Файл, записанный в разделе NTFS, может быть сегментирован. Он состоит из одного или несколь¬ких фрагментов, называемых экс¬тентами. Размер и расположение каждою экстен-та описывается в блоке VCN. В зависимости оттого, фрагментирован файл или нет, об¬ласть VCN может содержать один блок или их набор. Блоки VCN имеют переменный раз-мер, опре¬деляемый первым байтом.
Формат блока стоит показать на конкретном примере. Возьмем пер¬вый блок VCN, имею-щий в рассма¬триваемом примере смещение 0138 относительно начала записи MFT: 21 20 DA 4C
Тетрады первого байта со значе¬нием 21 определяют размеры двух полей блока VCN. Пер-вое поле, имеющее длину один байт, хранит количество кластеров, выделенных экстенту файла. Второе поле разме¬ром два байта содержит номер пер¬вого кластера. В данном слу-чае первому экстенту файла $MFT вы¬делено 20 кластеров, а номер пер¬вого кластера для первого экстента равен 4CDA. Таким образом опре¬деляем размер и расположение первого экстента файла.
Второй блок VCN расположен сразу вслед за первым: 32 10 23 DO E5 05
Для того чтобы определить пер¬вый кластер второго экстента, не¬обходимо прибавить к ад-ресу пер¬вого экстента смещение, указанное во втором блоке VCN (с учетом зна¬ка). В дан-ном случае второй экстент размещен в кластере с номером 4CDA + 05E5D0 = 632AA. Длина второго экстента составляет 2310 кластера.
Анализируя остальные блоки VCN, можно определить размеры и расположение всех экс-тентов фай¬ла. Список блоков VCN закрывает¬ся байтом с нулевым значением (подчеркнут толстой линией).

Резидентные файлы
Файлы небольшого размера размещаются непосредственно в записи MFT, описывающей этот файл, для сокращения времени доступа. Если в байте со смещени¬ем 8 относительно начала атрибу¬та данных находится нулевое зна¬чение, то не нужно прослеживать цепочки блоков VCN. Это означа¬ет, что файл находится внутри ат¬рибута данных.
При этом смещение резидент¬ных данных, т. е. файла, записано в двухбайтовом слове со смещением 14 относительно начала атрибута данных, а размер — в двухбайтовом слове со смещением 10.
Приведем небольшой пример. Для иллюстрации формата записи MFT, содержащей рези-дентный ат¬рибут данных, мы подготовили ма¬ленький файл с именем FARGUS01.txt, со-держащий текстовую строку «Test Find MFTS!!». Затем с по¬мощью программы Disk Probe мы обнаружили запись таблицы MFT, созданную для этого файла (рис. 14). Здесь атрибут данных начинает¬ся со смещением 0130 относитель¬но начала записи MFT. Байт со сме¬щением 8 внутри этого атрибута (выделен кружком) равен нулю, следовательно, мы име-ем де¬ло с резидентным атрибутом.
Как видно из рис. 6, байты фай¬ла FARGUS01.txt (выделенные цветом) находятся внутри записи MFT со смешением 18 относитель¬но начала атрибута данных, а раз¬мер файла со-ставляет 10 байт.
Пользователь: wetmurlyka
Сообщений: 6
Статус: Незримый
Зарегистрирован:
8 января 2008, 20:08
Был:27 февраля 2008, 19:13
wetmurlyka
smsup
Дата: 9 января 2008, 2:02 Сообщение № 2
Байт со смещением 8 относительно начала атрибута данных — это признак резидентного размещения файла. Если его значение равно 1, запись MFT хранит только список кластеров, выделенных файлу, а если 0 — файл находится внутри самой записи MFT. Как правило, записи содержат только файлы небольших размеров.