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

Дескриптор группы иР8 гораздо больше своего аналога в ExtX, хотя содержащиеся в нем данные в основном не обязательны. Для хранения дескриптора группы выделяется полный блок; дескриптор состоит из набора стандартных полей и открытой области, предназначенной для хранения различных таблиц. Стандартные поля содержат служебную информацию и описывают строение завершающей части блока. Такие служебные данные, как местонахождение последнего выделенного блока, фрагмента и индексного узла, используются для повышения эффективности создания файлов. Также присутствует сводная информация о количестве свободных блоков, фрагментов и индексных узлов; эти параметры должны совпадать со значениями в сводке групп цилиндров. Дескриптор группы также содержит время последней записи в группу (рис. 16.2).

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

Рис. 16.2. Строение дескриптора группы со стандартными полями и открытой областью, содержащей битовые карты и другие таблицы

Как мы видели при знакомстве с ЕхгХ, во втором блоке каждой группы всегда хранится таблица дескрипторов групп. В иР8 местонахождение дескриптора группы, таблицы индексных узлов и резервной копии суперблока задается отдельно для каждой файловой системы, а смещения задаются в суперблоке. Например, таблица индексных узлов может начинаться в 32, а дескриптор группы - в 16 фрагментах от начала. В11Р81 ситуация дополнительно усложняется тем, что смещения дополняются базовым сдвигом, который зависит от группы цилиндров. Например, если для таблицы индексных узлов задано смещение в 32 фрагмента, она может быть удалена на 32 фрагмента от начала группы 0, на 64 фрагмента от начала группы 1 и на 96 фрагментов от начала группы 2. Такой разброс вносится для того, чтобы сократить последствия от физических повреждений пластин на старых дисках.

Группы цилиндров называются так потому, что они выравниваются по границам цилиндров. На старых жестких дисках количество секторов в дорожке было постоянным; это означало, что первые секторы всех групп находились на одной пластине. Если бы не разброс административных данных, все копии суперблока находились бы на одной пластине. На новых жестких дисках количество секторов в цилиндрах различается, поэтому такой проблемы не существует, и в 11Р82 разброс административных данных уже не используется.

«Базовый» сдвиг каждой группы вычисляется на основании двух параметров из суперблока - цикла (с) и дельты {(Г). Базовый сдвиг увеличивается на (1 для каждой группы и возвращается к началу через с групп. Например, для каждой группы может вноситься смещение в 32 фрагмента, которое затем будет возвращаться к 0 после 16 групп.

На рис. 16.3 показан пример строения систем иР81 и 11Р82. В файловой системе иР81 административные данные хранятся с циклом 3, а в 11Р82 используется постоянное смещение внутри каждой группы. Фрагменты до и после административных данных могут использоваться для хранения содержимого файлов.

Рис. 16.3. иРБ1 с пятью группами и разбросом административных данных; 1^2 с пятью группами и административными данными, хранящимися с постоянным смещением

На рис. 16.4 показан пример группы. Базовый адрес удален на несколько блоков от начала группы, а резервный суперблок, дескриптор группы и таблица индексных узлов хранятся в последовательном порядке. Внутри дескриптора группы хранятся битовые карты и стандартные поля структур данных. Остальные фрагменты предназначены для содержимого файлов и каталогов.

Рис. 16.4. Пример строения группы цилиндров в Базовый адрес задается переменным количеством блоков от начала группы, а битовые карты хранятся на статическом расстоянии от базового адреса

Загрузочный код

Если файловая система UFS содержит ядро ОС, в ней также должен присутствовать загрузочный код. Он хранится в первом секторе файловой системы и следует вплоть до суперблока или структуры данных разметки диска. Возможно, для полного понимания структуры UFS стоит освежить в памяти материалы главы 6.

В BSD и Solaris используются собственные схемы создания разделов. В системах IА32 (например, x86/i386) создается один раздел, внутри которого находится один или несколько разделов BSD. Местонахождение разделов BSD определяется структурой разметки диска в секторе 1 раздела DOS. Загрузочный код находится в секторе 0, а затем в секторах 2 и 5. В файловой системе UFS1 суперблок находится в секторе 16, а в UFS2 - в секторе 128. В UFS2 загрузочный код также занимает дополнительные секторы.

В системе i386 Solaris также создаются два раздела DOS. Один имеет небольшие размеры и содержит только загрузочный код. Второй содержит файловую систему, а в его секторе 0 хранится структура данных оглавления тома VTOC (Volume Table of Contents). У дисков системы Sparc Solaris VTOC хранится в секторе 0 диска, а загрузочный код - в секторах 1-15. В новых системах Sparc Solaris вместо VTOC может использоваться таблица разделов EFI.

В файловых системах, не содержащих загрузочного кода, секторы перед суперблоком не используются. На рис. 16.5 (А) показан пример диска FreeBSD для платформы IA32, а на рис. 16.5 (В) - пример диска Sparc Solaris.

Рис. 16.5. Примеры: (А) - система IA32 с тремя разделами DOS и двумя разделами BSD внутри раздела FreeBSD, (В) - диск Sparc Solaris с двумя разделами Solaris

Пример образа

В завершение этого раздела я приведу результаты выполнения программы fsstat из пакета TSK (The Sleuth Kit) для образа UFS1. Этот образ будет использоваться как в последующих примерах этой главы, так и при ручном анализе дисковых структур в следующей главе. В действительности выходные данные fsstat занимают гораздо больше места, потому что в них включается подробная информация по каждой группе цилиндров; я приведу лишь самые существенные данные:

# fsstat -f openbsd openbsd.dd FILE SYSTEM INFORMATION

File System Type: UFS 1

Last Written: Tue Aug 3 09:14:52 2004

Last Mount Point: /mnt

METADATA INFORMATION

Inode Range: 0 - 3839 Root Directory: 2 Num of Avail Inodes: 3813 Num of Directories: 4

CONTENT INFORMATION

Fragment Range: 0 - 9999 Block Size: 8192

Fragment Size: 1024

Num of Avail Full Blocks: 1022

Num of Avail Fragments: 16

CYLINDER GROUP INFORMATION

Number of Cylinder Groups: 2 Inodes per group: 1920 Fragments per group: 8064

Group 0:

Last Written: Tue Aug 3 09:14:33 2004 Inode Range: 0 - 1919 Fragment Range: 0 - 8063 Boot Block: 0 - 7 Super Block: 8 - 15 Super Block: 16 - 23 Group Desc: 24 - 31 Inode Table: 32 - 271 Data Fragments: 272 - 8063 Global Summary (from the superblock summary area):

Num of Dirs: 2 Num of Avail Blocks: 815 Num of Avail Inodes: 1912 Num of Avail Frags: 11 Local Summary (from the group descriptor):

Num of Dirs: 2 Num of Avail Blocks: 815 Num of Avail Inodes: 1912 Num of Avail Frags: 11 Last Block Allocated: 392 Last Fragment Allocated: 272 Last Inode Allocated: 7 [...]

В выходных данных fsstat приводится общая информация - размеры блока и фрагмента, количество индексных узлов. Также в них присутствует информация по отдельным группам цилиндров, о том, какие фрагменты входят в каждую группу и какие ресурсы были выделены последними. В выходных данных объединяются данные из суперблока, из сводки групп цилиндров и из дескрипторов групп. Например, по адресу блока можно узнать, к какой группе он принадлежит, а также определить местонахождение таблицы индексных узлов и дескриптора для каждой группы. Это особенно важно для UFS1, поскольку эти административные данные хранятся с разными смещениями в группах.

Обратите внимание на присутствие двух суперблоков в первой группе. Первая копия присутствует потому, что в секторе 16 (то есть в блоке 8 данной файловой системы) всегда присутствует суперблок. Наличие второй копии объясняется тем, что в каждой группе цилиндров хранится резервная копия со смещением в 16 фрагментов.

Методы анализа

Анализ данных категории файловой системы направлен на поиск и обработку общих сведений о файловой системе с целью применения дополнительных методов анализа. В файловой системе 11Р8 анализ начинается с поиска суперблока в одном из стандартных мест. На основании данных суперблока определяются местонахождения каждой группы цилиндров и блока данных. Резервные копии суперблока присутствуют в каждой группе цилиндров.

Чтобы найти дескриптор конкретной группы, необходимо взять смещение, указанное в суперблоке, и прибавить его к базовому адресу группы. В 11Р82 базовый адрес совпадает с началом группы, но в группах цилиндров 11Р81 вносится разброс данных. Начальный адрес дескриптора вычисляется на основании параметров (дельты и цикла), хранящихся в суперблоке. Дескриптор группы используется при определении состояния выделения ресурсов группы.

Последняя важная структура данных хранится в области сводки групп цилиндров. Ее адрес задается в суперблоке, и она содержит таблицу с данными об использовании каждой группы цилиндров. Сводка предназначена для получения базовой информации о группах.

Факторы анализа

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

В суперблоке, дескрипторах групп и области присутствует разнообразная служебная информация. Если инцидент произошел совсем недавно, возможно, вам удастся прийти к каким-либо выводам относительно того, где находились удаленные файлы или какой файл был создан последним. Хранение нескольких копий служебных данных также позволяет сравнить их, если вы заподозрите постороннее вмешательство. Резервные копии суперблока хранятся в каждой группе цилиндров, а для их поиска можно воспользоваться сигнатурой этой структуры данных.

Категория содержимого

К категории содержимого относятся данные о содержимом файлов и каталогов. В этом разделе читатель узнает, где в 11Р8 хранится содержимое файлов и каталогов и как осуществляется его анализ.

Общие сведения

В иР8 содержимое файлов и каталогов хранится во фрагментах и блоках. Фрагментом называется группа смежных секторов, а блоком - группа смежных фрагментов. Каждому фрагменту назначается адрес; нумерация адресов начинается с 0. Адресация блоков осуществляется по первому фрагменту блока. Первый блок и фрагмент располагаются в первом секторе файловой системы. Минимальный размер блока 11Р8 составляет 4096 байт, а максимальное количество фрагментов в блоке равно 8. Пример связи между блоками и фрагментами показан на рис. 16.6: блок 64, содержащий фрагменты 64-71, полностью выделяется файлу, а из блока 72 выделяются фрагменты 74 и 75. Остальные фрагменты блока 72 могут выделяться другим файлам.

Рис. 16.6. Два блока ІІРБ с 8 фрагментами. Один блок выделен полностью, в другом блоке файлу выделены только два фрагмента

Двухуровневое выделение дискового пространства (блоки и фрагменты) позволяет выделять большие объемы смежных блоков без потери пространства в последнем блоке. иїїЗ пытается свести к минимуму потери пространства в последнем блоке.

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

Рассмотрим пример файловой системы с 8192 блоками и 1024 фрагментами. Для хранения файла, размер которого равен 20 ООО байт, потребуются 2 блока и 4 фрагмента. Ситуация показана на рис. 16.7: два блока начинаются во фрагментах 584 и 592. В двух блоках размещаются 16 384 байта файла, а оставшиеся 3616 байт хранятся во фрагментах 610-613. Первые два фрагмента блока используются другим файлом.

Рис. 16.7. 20 000-байтовый файл хранится в двух 8192-байтовых блоках и четырех 1024-байтовых фрагментах

Состояние выделения блока или фрагмента определяется по одной из двух битовых карт. В одной карте биты соответствуют фрагментам, а в другой - блокам; вообще говоря, обе карты должны содержать практически одинаковую информацию, но битовая карта блоков позволяет быстрее находить большие смежные блоки при создании больших файлов. Битовые карты ІШЗ отличаются от «обычных»: фактически в них хранится информация не о занятых, а о свободных кластерах. Таким образом, если бит равен 1, соответствующий блок доступен, а если бит равен 0 - блок используется.

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

Чтобы определить положение нужного бита в битовой карте конкретного блока, следует вычислить начальный блок группы и вычесть это значение из адреса блока. Пример приводился в главе 14. Блоки UFS и битовые карты фрагментов более подробно рассматриваются в главе 17.

Программа dstat из пакета TSK сообщает состояние выделения фрагмента UFS и указывает, к какой группе цилиндров он принадлежит. Пример вывода для тестового образа UFS1:

# dstat -f openbsd openbsd.dd 288 Fragment: 288 Allocated Group: 0

Алгоритмы выделения

Проектировщики UFS приложили немалые усилия к выработке стратегий выделения, обеспечивающих эффективное выделение блоков. Вероятно, аналогичные работы проводились и для коммерческих файловых систем, но их результаты не были опубликованы, и базовое тестирование вряд ли могло бы дать полное представление об используемых алгоритмах. В этом разделе приводится обзор документированных стратегий выделения в BSD, но за более подробной информацией я рекомендую обратиться к книгам «Design and Implementation of the 4.4 BSD Operating System» или «Design and Implementation of the FreeBSD Operating System». Несмотря на наличие документированной стратегии выделения, реализации ОС не обязаны ей следовать - реализация может выбрать другую стратегию по своему усмотрению.

Первое, что учитывается при выделении блоков и фрагментов, - принадлежность к группе цилиндров. Если ОС выделяет блоки для нового файла и в группе цилиндров индексного узла имеются доступные блоки, то система использует блоки из этой группы. Если при выделении блоков для существующего файла количество блоков, принадлежащих одному файлу в рамках одной группы, может ограничиваться; возможно, придется выбрать другую группу цилиндров. Например, многие ОС ограничивают количество выделяемых блоков для файлов и каталогов в одной группе на уровне 25-33 % от общего количества блоков. При достижении порогового значения выбирается новая группа. Solaris использует аналогичную стратегию: первые 12 блоков (прямые указатели) файлов выделяются в пределах одной группы цилиндров, а остальные блоки выделяются в других группах.

После выбора группы цилиндров ОС выделяет блоки, руководствуясь объемом записываемых данных. Если размер файла неизвестен или файл постепенно увеличивается, блоки выделяются последовательно с использованием стратегии поиска следующего доступного блока. Раньше для определения оптимального местонахождения блоков учитывалась ротационная задержка, но сейчас просто используется следующий смежный блок. Если размер известен заранее, данные делятся на участки; размер одного участка обычно равен 16 блокам. Для выделения блоков в пределах участка используется стратегия поиска первого доступного блока. Таким образом, для 8192-байтовых блоков размер каждого участка будет равен 128 Кбайт. Это значение настраивается на уровне файловой системы и задается в суперблоке.

Для завершающей порции данных в файле вместо полного блока выделяются фрагменты. ОС ищет серию последовательных фрагментов, размер которой до статочен для хранения данных. Смежные фрагменты не могут пересекать границу блока, а информацию о наличии фрагментов нужной длины можно получить из служебных данных файловой системы. При выделении фрагментов для последних данных файла используется стратегия поиска первого свободного фрагмента.

Если новыми данными дополняется файл, которому уже были выделены фрагменты, ОС пытается расширить выделенную серию фрагментов. Если расширение невозможно, выделяется новый набор фрагментов или полный блок, а данные перемещаются. Если файл занимает 12 полных блоков, фрагменты обычно не используются, а при расширении файла выделяются полные блоки.

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

Все протестированные мной системы В8Б и Бокнэ стирали содержимое неиспользуемых секторов в фрагментах. Следовательно, в резервном пространстве выделенных фрагментов бесполезно искать данные от удаленных файлов.

Методы анализа

Анализ данных в категории содержимого основан на поиске блока или фрагмента, просмотре его содержимого и проверке состояния выделения. Для поиска данных необходимо знать адрес фрагмента или блока. Оба размера хранятся в суперблоке; поиск выполняется простым смещением от начала файловой системы до достижения нужного адреса. Адрес блока соответствует адресу первого фрагмента в блоке.

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

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

Факторы анализа

Архитектура и стратегии выделения иРБ предоставляют ряд преимуществ экспертам, но при этом создают и целый ряд проблем. С одной стороны, привязка блоков к индексным узлам упрощает восстановление данных, а если удаленные данные хранятся в редко используемых группах, они существуют дольше, чем удаленные данные в других группах. К преимуществам также можно отнести и то, что выделение серий смежных блоков снижает фрагментацию, а это обстоятельство упрощает работу программ извлечения данных.

К проблемам иРБ можно отнести наличие завершающего фрагмента. «Хвост» файла обычно оказывается в другой группе цилиндров, поскольку для его хранения необходим лишь один фрагмент. Разброс данных усложняет их извлечение. С другой стороны, фрагменты часто позволяют восстановить больше данных, чем Ех1Х со стиранием всех байтов блока. В 11Р8 стирается только содержимое выделенных фрагментов, так что отдельные части блока продолжают существовать и после его повторного выделения.

Восстановление очень больших файлов (скажем, вложений в сообщениях электронной почты) усложняется тем, что такой файл может занимать более 25 % объема группы цилиндров; в этом случае остаток перемещается в другую группу. Кроме того, Зо1ап8 после выделения первых 12 блоков файла переходит к новой группе цилиндров, что мешает работе служебных программ извлечения данных. Конечно, ОС, создающая файловую систему, не обязана соблюдать все правила 11Р8 и следовать всем стратегиям выделения.

Категория метаданных

К категории метаданных относятся данные, содержащие информацию о файлах и каталогах. В этом разделе рассказано, где ОТЗ хранит данные и как организуется их анализ.

Общие сведения

В иР8, как и в Ех1Х, метаданные файлов и каталогов хранятся в индексных узлах. иР82 также дает возможность сохранить дополнительную информацию о файле в расширенных атрибутах. Мы рассмотрим эти структуры данных по отдельности.

Ufs1и ufs2: концепции и анализ | Криминалистический анализ файловых систем | Индексные узлы


Криминалистический анализ файловых систем



Новости за месяц

  • Март
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс