Литмир - Электронная Библиотека
Содержание  
A
A

<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. При восстановлении удаленных файлов без этих карт обойтись невозможно. Они существенно сужают круг поиска, что особенно хорошо заметно на дисках, заполненных более чем наполовину.

63
{"b":"837815","o":1}