Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #69, АВГУСТ 2006 г.

искусственное дыхание

КРИС КАСПЕРСКИ АКА МЫЩЪХ

Спецвыпуск: Хакер, номер #069, стр. 069-054-5


За картами следует массив inode, смещение которого содержится в поле cg_iusedoff (адрес первой группы inode продублирован в суперблоке). В UFS inode играет ту же самую роль, что и FILE Record в NTFS (в FAT прямых аналогов нет). Здесь сосредоточена вся информация о файле: тип файла (обычный файл, директория, символьная ссылка и т. д.), логический и физический размер, схема размещения на диске, время создания, модификации, последнего доступа и удаления, права доступа и количество ссылок на файл.

По сути, в UFS структура inode ничем не отличается от ext2fs, только расположение полей другое. К тому же имеется только один блок косвенной адресации вместо трех, но это уже детали, в которые не будем углубляться (иначе или зависнем, или завязнем). Лучше рассмотрим назначение фундаментальных полей, к числу которых принадлежат:

- di_nlink — количество ссылок на файл (0 означает «удален»);

- di_size — размер файла в байтах;

- di_atime/di_atimensec — время последнего доступа к файлу;

- di_mtime/di_mtimensec — время последней модификации;

- di_ctime/di_ctimensec – время последнего изменения inode;

- di_db – адреса первых 12-ти блоков данных файла, отсчитываемые в фрагментах от начала группы цилиндров;

- di_ib — адреса блоков косвенной адресации (фрагменты от начала группы).

Структура inode в USF1 (определена в файле /src/ufs/ufs/dinode.h)

struct dinode {

/* 0x00 */ u_int16_t di_mode; /* 0: IFMT, permissions; see below. */

/* 0x02 */ int16_t di_nlink; /* 2: File link count. */

/* 0x04 */ union {

u_int16_t oldids[2]; /* 4: Ffs: old user and group ids. */

int32_t inumber; /* 4: Lfs: inode number. */

} di_u;

/* 0x08 */ u_int64_t di_size; /* 8: File byte count. */

/* 0x10 */ int32_t di_atime; /* 16: Last access time. */

/* 0x14 */ int32_t di_atimensec; /* 20: Last access time. */

/* 0x18 */ int32_t di_mtime; /* 24: Last modified time. */

/* 0x1C */ int32_t di_mtimensec; /* 28: Last modified time. */

/* 0x20 */ int32_t di_ctime; /* 32: Last inode change time. */

/* 0x24 */ int32_t di_ctimensec; /* 36: Last inode change time. */

/* 0x28 */ ufs_daddr_t di_db[NDADDR]; /* 40: Direct disk blocks. */

/* 0x58 */ ufs_daddr_t di_ib[NIADDR]; /* 88: Indirect disk blocks. */

/* 0x64 */ u_int32_t di_flags; /* 100: Status flags (chflags). */

/* 0x68 */ int32_t di_blocks; /* 104: Blocks actually held. */

/* 0x6C */ int32_t di_gen; /* 108: Generation number. */

/* 0x70 */ u_int32_t di_uid; /* 112: File owner. */

/* 0x74 */ u_int32_t di_gid; /* 116: File group. */

/* 0x78 */ int32_t di_spare[2]; /* 120: Reserved; currently unused */

};

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

Назад на стр. 069-054-4  Содержание  Вперед на стр. 069-054-6