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

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

<b>/* 0x34 */ int32_t fs_fsize;         /* Размер фрагментов блоков в фс */</b>

<b>/* 0x38 */ int32_t fs_frag;          /* Количество фрагментов в блоке в фс */</b>

/* Параметры конфигурации */

/* 0x3C */ int32_t fs_minfree;       /* Мин. процент свободных блоков */

/* 0x40 */ int32_t fs_rotdelay;      /* Мин. задержка (мс) для оптимального

                                        след. блока */

/* 0x44 */ int32_t fs_rps;           /* Обороты диска в минуту */

/* Размеры, определяемое кол-вом гц и их размерами */

/* 0x98 */ ufs_daddr_t fs_csaddr;     /* Адрес блока информации гц */

/* 0х9С */ int32_t fs_cssize;         /* Размер блока информации гц */

<b>/* 0xA0 */ int32_t fs_cgsize;         /* Размер группы цилиндров */</b>

/* Поля, которые могут быть вычислены на основании остальных */

/* 0хВ4 */ int32_t fs_cpg;             /* Кол-во цилиндров в группе */

/* 0xB8 */ int32_t fs_ipg;             /* Кол-во Inode на группу */

<b>/* 0xBC */ int32_t fs_fpg;             /* Кол-во блоков в группе * fs_frag */</b>

/* Поля, очищаемые при монтировании */

/* 0xD0 */ int8_t fs_fmod;             /* Флаг модификации суперблока */

/* 0xD1 */ int8_t fs_clean;            /* Флаг &quot;чистой&quot; (clean) фс */

/* 0xD2 */ int8_t fs_ronly;            /* Флаг защиты от записи */

/* 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;     /* Связный список групп цилиндров */

<b>/* 0x04 */ int32_t cg_magic;          /* Магическая последовательность */</b>

/* 0x08 */ int32_t cg_old_time;       /* Время последней записи */

<b>/* 0x0C */ int32_t cg_cgx;            /* Мы находимся в гц номер cgx */</b>

/* 0x10 */ int16_t cg_old_ncyl;       /* Кол-во цилиндров в этой гц */

<b>/* 0x12 */ int16_t cg_old_niblk;      /* Кол-во блоков inode в этой гц */</b>

<b>/* 0x14 */ int32_t cg_ndblk;          /* Кол-во блоков данных в этой гц */</b>

<b>/* 0x18 */ struct csum cg_cs;         /* Краткое описание цилиндра */</b>

/* 0x28 */ int32_t cg_rotor;          /* Положение посл. исп. блока */

/* 0x2C */ int32_t cg_frotor;         /* Положение посл. исп. фрагмента */

/* 0x30 */ int32_t cg_irotor;         /* Положение посл. исп. inode */

/* 0x34 */ int32_t cg_frsum[MAXFRAG]; /* Счетчик доступных фрагментов */

/* 0x54 */ int32_t cg_old_btotoff;    /* (int32) блоков на цилиндр */

/* 0x58 */ int32_t cg_old_boff;       /* (u_int16) своб. позиций блоков */

<b>/* 0x5C */ int32_t cg_iusedoff;       /* (u_int8) карта исп. inode */</b>

<b>/* 0x60 */ int32_t сg_freeoff;        /* (u_int8) карта своб. блоков */</b>

/* 0x64 */ int32_t cg_nextfreeoff;    /* (u_int8) след. своб. блок */

/* 0x68 */ int32_t cg_clustersumoff;  /* (u_int32) счетчик своб. кластеров */

/* 0x6C */ int32_t cg_clusteroff;     /* (u_int8) карта своб. кластеров */

/* 0x70 */ int32_t cg_nclusterblks;   /* Кол-во кластеров в этой гц */

/* 0x74 */ int32_t cg_niblk;          /* Кол-во блоков inode в этой гц */

/* 0x78 */ int32_t cg_initediblk;     /* Посл. инициализированный inode */

/* 0х7С */ int32_t cg_sparecon32[3];  /* Зарезервировано */

/* 0x00 */ ufs_time_t cg_time;        /* Время последней записи */

/* 0x00 */ int64_t cg_sparecon64[3];  /* Зарезервировано */

/* 0x00 */ u_int8_t cg_space[1];      /* Место для карт гц */

/* реально больше */

Между описателем группы цилиндров и группой inode расположены карта занятых inode и карта свободного дискового пространства, представляющие собой обыкновенные битовые поля, точно такие же, как и в NTFS. При восстановлении удаленных файлов без этих карт обойтись невозможно. Они существенно сужают круг поиска, что особенно хорошо заметно на дисках, заполненных более чем наполовину.