Восстановление данных. Практическое руководство
За картами следует массив inode, смещение которого содержится в поле
(адрес первой группы inode продублирован в суперблоке). По сути, в UFS структура inode ничем не отличается от ext2fs, только расположение полей другое. К тому же, имеется только один блок косвенной адресации вместо трех, но это уже детали, не имеющие большого практического значения. Рассмотрим назначение фундаментальных полей, к числу которых принадлежат:cg_iusedoff□
— количество ссылок на файл (0 означает "удален");di_nlink□
— размер файла в байтах;di_size□
/di_atime— время последнего доступа к файлу;di_atimensec□
/di_mtime— время последней модификации;di_mtimensec□
/di_ctime— время последнего изменения inode;di_ctimensec□
— адреса первых 12 блоков данных файла, отсчитываемые во фрагментах от начала группы цилиндров;di_db□
— адрес блоков косвенной адресации (фрагменты от начала группы).di_ibСама структура inode определена в файле /src/ufs/ufs/dinode.h. Для UFS1 эта структура выглядит, как показано в листинге 8.9 и на рис. 8.11.
Рис. 8.11. Схематичное изображение inode
Листинг 8.9. Структура inode в UFS1
struct dinode {/* 0x00 */ uint16_t di_mode; /* 0: IFMT, права доступа; *//* см. ниже *//* 0x02 */ int16_t di_nlink; /* 2: Счетчик ссылок *//* 0x04 */ union {uint16_t oldids[2]; /* 4: Ffs: старые ID *//* пользователя и группы */int32_t inumber; /* 4: Lfs: номер inode */} di_u;/* 0x08 */ u_int64_t di_size; /* 8: Счетчик байтов файла *//* 0x10 */ int32_t di_atime; /* 16: Время последнего доступа *//* 0x14 */ int32_t di_atimensec; /* 20: Время последнего доступа *//* 0x18 */ int32_t di_mtime; /* 24: Время последней *//* модификации *//* 0x1C */ int32_t di_mtimensec; /* 28: Время последней *//* модификации *//* 0x20 */ int32_t di_ctime; /* 32: Время последнего *//* изменения inode *//* 0x24 */ int32_t di_ctimensec; /* 36: Время последнего *//* изменения inode *//* 0x28 */ ufs_daddr_t di_db[NDADDR]; /* 40: Непоср. дисковые блоки *//* 0x58 */ ufs_daddr_t di_ib[NIADDR]; /* 88: Косв. дисковые блоки *//* 0x64 */ u_int32_t di_flags; /* 100: Флаги статуса (chflags) *//* 0x68 */ int32_t di_blocks; /* 104: Факт, занятые блоки *//* 0x6C */ int32_t di_gen; /* 108: Номер генерации *//* 0x70 */ u_int32_t di_uid; /* 112: Владелец файла *//* 0x74 */ u_int32_t di_gid; /* 116: Группа файла *//* 0x78 */ int32_t di_spare[2]; /* 120: Зарезервировано */};В UFS2 формат inode был существенно изменен — появилось множество новых полей, удвоилась ширина адресных полей (листинг 8.10). Что это обозначает для нас в практическом плане? Смещения всех полей изменились, только и всего, а общий принцип работы с индексными дескрипторами остался прежним.
Листинг 8.10. Структура inode в USF2
struct ufs2_dinode {/* 0x00 */ u_int16_t di_mode; /* 0: IFNT, права доступа; *//* см. ниже *//* 0x02 */ int16_t di_nlink; /* 2: Счетчик ссылок *//* 0x04 */ u_int32_t di_uid; /* 4: Владелец файла *//* 0x08 */ u_int32_t di_gid; /* 8: Группа файла *//* 0x0C */ u_int32_t di_blksize; /* 12: Размер блока Inode *//* 0x10 */ u_int64_t di_size; /* 16: Счетчик байтов файла *//* 0x18 */ u_int64_t di_blocks; /* 24: Практически занятые байты *//* 0x20 */ ufs_time_t di_atime; /* 32: Время последнего доступа *//* 0x28 */ ufs_time_t di_mtime; /* 40: Время последней *//* модификации *//* 0x30 */ ufs_time_t di_ctime; /* 48: Время последнего *//* изменения inode *//* 0x38 */ ufs_time_t di_birthtime; /* 56: Время создания Inode *//* 0x40 */ int32_t di_mtimensec; /* 64: Время последней *//* модификации *//* 0x44 */ int32_t di_atimensec; /* 68: Время последнего доступа *//* 0x48 */ int32_t di_ctimensec; /* 72: Время последнего доступа *//* 0x4C */ int32_t di_birthnsec; /* 76: Время создания Inode *//* 0x50 *<b>/ int32_t di_gen;</b> /* 80: Номер генерации *//* 0x54 */ u_int32_t di_kernflags; /* 84: Флаги ядра *//* 0x58 */ u_int32_t di_flags; /* 88: Флаги статуса (chflags) *//* 0x5C */ int32_t di_extsize; /* 92: Блок внешних атрибутов *//* 0x60 */ ufs2_daddr_t di_extb[NXADDR]; /* 96: Блок внешних атрибутов */
