искусственное дыхание КРИС КАСПЕРСКИ АКА МЫЩЪХ Спецвыпуск: Хакер, номер #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 был существенно изменен — появилось множество новых полей, удвоилась ширина адресных полей и т. д. Что это обозначает в практическом плане? Смещения всех полей изменились, только и всего, а общий принцип работы остался прежним. |