Добавить в цитаты Настройки чтения

Страница 64 из 91

За картами следует массив inode, смещение которого содержится в поле cg_iusedoff (адрес первой группы inode продублирован в суперблоке). По сути, в 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 определена в файле /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: Блок внешних атрибутов */