/* 0xD3 */ int8_t fs_flags; /* См. поле fs_ flags */
/* 0xD4 */ u_char fs_fsmnt[MAXMNTLEN]; /* Путь монтирования фс */
};
За концом суперблока, на некотором отдалении от него, находится первая группа цилиндров. В начале каждой группы расположена служебная структура
cg
, представляющая собой описатель группы цилиндров и содержащая магическую последовательность
55h 02h 09h
, по которой все уцелевшие группы можно найти даже при полностью испорченном суперблоке. Штатным образом стартовые адреса всех последующих групп вычисляются путем умножения номера группы на ее размер, содержащийся в поле
fs_cgsize
.
Другие важные параметры:
□
cg_cgx
— порядковый номер группы, отсчитываемый от нуля;
□
cg_old_niblk
— количество inode в данной группе;
□
cg_ndblk
— количество блоков данных в данной группе;
□
csum
— количество свободных inode и блоков данных в данной группе;
□
cg_iusedoff
— смещение карты занятых inode, отсчитываемое от начала данной группы (в байтах);
□
cg_freeoff
— смещение карты свободного пространства (байты от начала группы).
Структура
cg
определена в файле /src/ufs/ffs/fs.h и выглядит следующим образом — листинг 8.8.
Листинг 8.8. Структура описателя группы цилиндров
#define СG_MAGIC 0x090255
#define MAXFRAG 8
struct cg {
/* 0x00 */ int32_t cg_firstfield; /* Связный список групп цилиндров */
/* 0x00 */ u_int8_t cg_space[1]; /* Место для карт гц */
/* реально больше */
Между описателем группы цилиндров и группой inode расположены карта занятых inode и карта свободного дискового пространства, представляющие собой обыкновенные битовые поля, точно такие же, как и в NTFS. При восстановлении удаленных файлов без этих карт обойтись невозможно. Они существенно сужают круг поиска, что особенно хорошо заметно на дисках, заполненных более чем наполовину.
За картами следует массив 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.