Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #82, ОКТЯБРЬ 2005 г.

Второе рождение удаленных файлов

Крис Касперски ака мыщъх

Хакер, номер #082, стр. 082-098-2


За супер-блоком идут дескрипторы групп и карты свободного пространства, в просторечии — битмапы, которые нам малоинтересны, а вот примыкающую к ним inode-таблицу мы рассмотрим поподробнее, поскольку без знания ее структуры ручное восстановление данных просто немыслимо. Таблица представляет собой массив записей типа inode, каждая из которых хранит всю информацию об одном файле: тип (обычный файл, директория, символьная ссылка и т.д.), схема размещения на диске, логический/физический размер, дата/время создания/модификации/последнего доступа/удаления, количество ссылок на файл и правда доступа:

Формат представления 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_osd1 ; значение, зависимое от ОС

40 12 x 4 i_block ; 12 DIRECT BLOCKS (ссылки на первые 12 блоков файла)

88 4 i_iblock ; 1x 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 ; наивысший размер

112 4 i_faddr ; положение последнего фрагмента

116 12 i_osd2 ; значение, зависимое от ОС

Схема размещения файла на диске организована намного проще, чем в NTFS и FAT. Каждый файл занимает один или несколько блоков. Даже если блок занят только частично, он выделяется файлу целиком (в остальных файловых системах, таких, например, как UFS, предусмотрена возможность выделения файлу только части блока, а в NTFS и ReiserFS мелкие файлы могут храниться непосредственно в самой inode, что существенно уменьшает фрагментацию и увеличивает производительность), но вернемся к ext2fs/ext3fs. Указатели на 12 первых блоков, занимаемых файлом, хранятся прямо в inode, а точнее — в массиве DIRECT BLOCKS, так же называемом массивом непосредственных блоков. Каждый элемент массива представляет собой 32-битный номер блока. Поскольку типичный размер блока составляет ~4 Кб (конкретное значение зависит от емкости диска и опций форматирования), то массив непосредственных блоков "переваривает" файлы до 4*12 = 48 Кб. Если длина файла превышает эту величину (а у подавляющего большинства файлов она превышает), приходится прибегать к блокам косвенной адресации.

Файловые системы ext2fs/ext3fs поддерживают три уровня вложенности. Первый блок косвенной адресации хранит уже не указатели на блоки занятые файлов, а указатели на дополнительные непосредственные блоки, и может адресовать до BLOCK_SIZE/sizeof(DWORD) * BLOCK_SIZE = 4096/4*4 Мб данных. Что ж! Полвека назад это была очень большая величина, но сейчас этим никого не удивишь. На этот случай предусмотрен блок двойной косвенной адресации, хранящий указатели на косвенные блоки, которые в свою очередь хранят ссылки на непосредственные блоки, что позволяет адресовать (BLOCK_SIZE/sizeof(DWORD))**2 * BLOCK_SIZE = 4096/4 ** 4096 = 4 Гб данных. Это уже внушительная величина, при которой размер файла занимает всю разрядную сетку 32-битной переменной. Большинство приложений ограничивают верхний размер обрабатываемых файлов 2 или 4 Гб. Тем не менее, файловая система способна хранить файлы намного большего размера. Это осуществляется с помощью трижды косвенного блока, указывающего на дважды косвенные блоки, каждый из которых указывает на косвенные блоки, ссылающиеся на блоки непосредственной адресации. Так что возможности ext2fs/ext3fs намного превышают емкости жестких дисков настоящего и будущего.

Назад на стр. 082-098-1  Содержание  Вперед на стр. 082-098-3