Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Файловая система Ex2.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
26.98 Кб
Скачать

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

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

Следующие два раздела посвящены тому, как организовано хранение файлов в ext2/3, и что происходит, когда пользователь выполняет команду rm. Последующие разделы описывают технику восстановления, основанную на информации первых двух.

Анатомия файловой системы ext2/ext3

В начале раздела расположен boot-сектор длиной 1024 байта. Он используется некоторыми загрузчиками для хранения своей второй части (например, Grub записывает туда код Stage 1.5). Далее следует супер-блок, в котором хранится ключевая информация о структуре файловой системы (своего рода главный конфиг). Чтобы прочитать информацию супер-блока можно использовать следующую команду:

# tune2fs -l /dev/hda1

На экране появится информация, отражающая текущее состояние файловой системы, а также значения, заданные при ее создании и неизменяемые со временем. Одно из таких значений – «Block size», которое, скорее всего, будет равно 4096, то есть 4 Кб. Это размер одного блока файловой системы, базовой неделимой единицы хранимой информации. Все, что находится в ФС, разбито на огромное количество таких блоков, и даже если размер файла меньше размера блока, для его хранения будет использован целый блок, а большие файлы могут занимать сотни тысяч блоков.

Общее количество блоков файловой системы прописано в поле «Block count», а количество свободных – во «Free blocks». Сразу за супер-блоком следуют дескрипторы групп и карты свободного пространства (битмапы), на которых мы не будем останавливаться. А вот расположенная сразу за ними inode-таблица вызывает особый интерес, потому как именно она является централизованным хранилищем всей информации о каждом файле. Таблица представляет собой массив структур типа ext2_inode, размер которого задается во время создания файловой системы и не изменяется со временем (смотри поле «Inode Count» супер-блока). Каждый элемент этого массива описывает один файл и хранит такую информацию, как тип (обычный, каталог, ссылка и т.д.), схема размещения на диске, логический/физический размер, дата/время создания/модификации/последнего доступа/удаления, количество ссылок на файл и правда доступа. Структура ext2_inode, выступающая в роли элемента массива, определена в файле source/include/linux/ext2_fs.h и выглядит так:

struct ext2_inode {

__u16 i_mode; /* Режим доступа к файлу */

__u16 i_uid; /* UID владельца файла */

__u32 i_size; /* Размер файла в байтах */

__u32 i_atime; /* Время последнего доступа */

__u32 i_ctime; /* Время создания */

__u32 i_mtime; /* Время модификации */

__u32 i_dtime; /* Время удаления */

__u16 i_gid; /* GID группы */

__u16 i_links_count; /* Количество ссылок на файл (0 - файл удален) */

__u32 i_blocks; /* Количество блоков, принадлежащих файлу */

__u32 i_flags; /* Разные флаги */

union osd1; /* Зависимые от ОС значения */

__u32 i_block [EXT2_N_BLOCKS]; /* Ссылки на блоки */

__u32 i_version; /* Версия файла (используется NFS) */

__u32 i_file_acl; /* ACL-атрибуты файла */

__u32 i_dir_acl; /* ACL-атрибуты каталога (наследуются во время создания файла) */

__u32 i_faddr; /* Положение последнего фрагмента */

union osd2; /* Зависимые от ОС значения */

};

#define EXT2_DIR_BLOCKS 12

#define EXT2_IND_BLOCK EXT2_DIR_BLOCKS

#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)

#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)

#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)

Ссылки на закрепленные за файлом блоки хранятся в массиве i_block, первые 12 элементов которого представляют собой 32-битные адреса первых 12 блоков файла. Их называют блоками с прямой адресацией. Тринадцатый элемент массива хранит ссылку на блок, хранящий адреса следующих блоков данных («блок косвенной адресации»). Четырнадцатый элемент массива - ссылка на блок, хранящий ссылки на блоки косвенной адресации («двойной блок косвенной адресации»). И, наконец, в 15 элементе массива хранится ссылка на блок, содержащий ссылки на блоки двойной косвенной адресации.

Такая вот путаная (но эффективная) древовидная схема размещения данных в файловых системах ext2 и ext3. При этом блоки косвенной адресации не обязательно должны следовать друг за другом, для файловой системы – это точно такие же блоки данных. Для их распределения используется стандартный механизм, который может вернуть ссылку на блок, расположенный в любой точке раздела. В результате схема размещения данных файла может оказаться разбросанной по всему разделу. Это хорошо для устойчивости файла к разрушению, но плохо с точки зрения простоты его последующего восстановления.

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

struct ext2_dir_entry_2 {

__u32 inode; /* Ссылка на inode */

__u16 rec_len; /* Длина данной записи */

__u8 name_len; /* Длина имени файла */

__u8 file_type; /* Тип файла */

char name [EXT2_NAME_LEN]; /* Имя файла */

};

#define EXT2_NAME_LEN 255

Когда приложение выполняет системный вызов open() или creat() для создания файла, ядро заполняет свободный inode в inode-таблице новыми данными. Затем добавляет в текущий каталог новую запись типа ext2_dir_entry_2, записывает в нее имя файла (поле name), его тип (file_type) и помещает ссылку на созданный inode в одноименное поле. В итоге, пройдя по цепочке структур и массивов в обратном порядке, можно быстро найти данные, закрепленные за файлом - пока он жив.