Восстановление удаленных файлов под ext2fs
Файловая система ext2fs все еще остается базовой файловой системой для многих клонов Linux, поэтому рассмотрим ее первой. Концепции, которые она исповедует, во многом схожи с NTFS, так что культурного шока при переходе с NTFS на ext2fs вы не испытаете. Подробное описание структуры хранения данных ищите в документе 'Design and Implementation of the Second Extended Filesystem' (см. список рекомендованной литературы и ресурсов Интернета в данном разделе), а также книге Эндрю Таненбаума 'Operating Systems: Design and Implementation', электронную версию которой можно раздобыть в e-Mule. Исходные тексты дисковых утилит (драйвер файловой системы, lde, debugfs) также не помешают.
В начале диска расположен загрузочный сектор, который на незагрузочных разделах может быть пустым. За ним по смещению 1024 байта от начала первого сектора лежит суперблок (super-block), содержащий ключевую информацию о структуре файловой системы. В FAT и NTFS эта информация хранится непосредственно в загрузочном секторе. В первую очередь нас будет интересовать 32-разрядное поле s_log_block_size, расположенное по смещению 18h байт от начала суперблока. Здесь хранится размер одного 200h. В естественных единицах это будет звучать так: block_size == 200h << s_log_block_size (байт). То есть если s_log_block_size равен нулю, размер одного блока составляет 400h байт или два стандартных сектора. Структура дискового тома, отформатированного под ext2fs, показана в листинге 8.4.
Листинг 8.4. Структура дискового тома, размеченного под ext2fs
смещение размер описание
-------- ------ --------
0 1 boot record ; Загрузочный сектор
-- block group 0 -- ; Группа блоков 0
(1024 bytes) 1 superblock ; Суперблок
2 1 group descriptors ; Дескриптор группы
3 1 block bitmap ; Карта свободных блоков
4 1 inode bitmap ; Карта свободных inode
5 214 inode table ; Массив inode
; (сведения о файлах)
219 7974 data blocks ; Блоки данных
; (файлы, каталоги)
-- block group 1 -- ; Группа блоков 1
8193 1 superblock backup ; Копия суперблока
8194 1 group descriptors backup ; Копия дескриптора группы
8195 1 block bitmap ; Карта свободных блоков
8196 1 inode bitmap ; Карта свободных inode
8197 214 inode table ; Массив inode
; (сведения о файлах)
8408 7974 data blocks ; Блоки данных
; (файлы, каталоги)
-- block group 2 -- ; Группа блоков 2
16385 1 block bitmap ; Карта свободных блоков
16386 1 inode bitmap ; Карта свободных inode
16387 214 inode table ; Массив inode
; (сведения о файлах)
16601 3879 data blocks ; Блоки данных
; (файлы, каталоги)
Вслед за суперблоком идут
Листинг 8.5. Формат представления inode
смещение размер описание
-------- ------ --------
0 2 i_mode ; Формат представления
2 2 i_uid ; Uid пользователя
4 4 i_size ; Размер файла в байтах
8 4 i_atime ; Время последнего доступа к файлу
12 4 i_ctime ; Время создания файла
16 4 i_mtime ; Время модификации файла
20 4 i_dtime ; Время удаления файла
24 2 i_gid ; Gid группы
26 2 i_links_count ; Количество ссылок на файл (0 — файл удален)
28 4 i_blocks ; Количество блоков, принадлежащих файлу
32 4 i_flags ; Различные флаги
36 4 i_osdl ; Значение, зависящее от ОС
40 12 x 4 i_block ; Ссылки на первые 12 блоков файла
88 4 i_iblock ; 1х INDIRECT BLOCK
92 4 i_2iblock ; 2x INDIRECT BLOCK
96 4 i_3iblock ; 3x INDIRECT BLOCK
100 4 i_generation ; Поколение файла (используется NFS)
104 4 i_file_acl ; Внешние атрибуты
108 4 i_dir_acl ; higher size
112 4 i_faddr ; Положение последнего фрагмента
116 12 i_osd2 ; Структура, зависящая от ОС
Первые 12 блоков, занимаемых файлом, называются непосредственными блоками (для наглядности они выделены полужирным шрифтом). Они хранятся в массиве DIRECT BLOCKS непосредственно в теле inode. Каждый элемент массива представляет собой 32-битный номер блока. При среднем значении BLOCK_SIZE, равном 4 Кбайт, непосредственные блоки могут адресовать до 4×12 == 48 Кбайт данных. Если файл превышает этот размер, создаются один или несколько блоков косвенной адресации (INDIRECT BLOCK). Первый блок косвенной адресации (1x INDIRECT BLOCK или просто INDIRECT BLOCK) хранит ссылки на другие непосредственные блоки. Адрес этого блока хранится в поле i_indirect_block в inode. Как легко вычислить, он адресует порядка BLOCK_SIZE/sizeof(DWORD) * BLOCK_SIZE == 4096/4 *4 Мбайт данных. Если этого окажется недостаточно, создается косвенный блок двойной косвенной адресации (2х INDIRECT BLOCK или DOUBLE INDIRECT BLOCK), хранящий указатели на косвенные блоки, что позволяет адресовать (BLOCK_SIZE/sizeof(DWORD)) **2* BLOCK_SIZE =4096/4 ** 4096 == 4 Гбайт данных. Если же и этого все равно недостаточно, создается блок тройной косвенной адресации (3х INDIRECT BLOCK или TRIPLE INDIRECT BLOCK), содержащий ссылки на блоки двойной косвенной адресации. Иерархия
