последовательно расположенные группы цилиндров
В UFS cуперблок располагается по смещению 8192 байт от начала раздела, что соответствует 16-сектору. В UFS2 он "переехал" на 65536 байт (128 секторов) от начала, освобождая место для дисковой метки и первичного загрузчика операционной системы, а для действительно больших (в исходных текстах — piggy, т. е. "свинских") систем предусмотрена возможность перемещения суперблока по адресу 262144 байт (целых 512 секторов)!
Среди прочей информации суперблок содержит:
q cblkno — смещение первой группы блока цилиндров, измеряемый в фрагментах, отсчитываемых от начала раздела;
q fs_iblkno — смещение первой inode в первой группе цилиндров (фрагменты от начала раздела);
q fs_dblkno — смещение первого блока данных в первой группе цилиндров (фрагменты от начала раздела);
q fs_ncg — кол-во групп цилиндров (штуки);
q fs_bsize – размер одного блока в байтах;
q fs_fsize — размер одного фрагмента в байтах;
q fs_frag — кол-во фрагментов в блоке;
q fs_fpg – размер каждой группы цилиндров, выраженный в блоках (так же может быть найден через fs_cgsize);
Для перевода смещений, выраженных в фрагментах, в номера секторов, служит следующая формула: sec_n(fragment_offset) = fragment_offset*(fs_bsize/fs_frag/512) или ее более короткая разновидность: sec_n(fragment_offset) = fragment_offset*fs_fsize
/512;
Структура суперблока определена в файле /src/ufs/ffs/fs.h и в упрощенном виде выглядит так:
struct fs {
/* 0x00 */ int32_t fs_firstfield; /* historic file system linked list, */
/* 0x04 */ int32_t fs_unused_1; /* used for incore super blocks */
/* 0x08 */ааа ufs_daddr_t fs_sblkno;аааа аааааа /* addr of super-block in filesys */
/* 0x0C */ааа ufs_daddr_t fs_cblkno;ааааааааааа /* offset of cyl-block in filesys */
/* 0x10 */ааа ufs_daddr_t fs_iblkno;ааааааааааа /* offset of inode-blocks in filesys */
/* 0x14 */ааа ufs_daddr_t fs_dblkno;аааа аааааа /* offset of first data after cg */
/* 0x18 */ааа int32_tаааааа fs_cgoffset;ааааааа /* cylinder group offset in cylinder */
/* 0x1C */ааа int32_tаааааа fs_cgmask;ааааааааа /* used to calc mod fs_ntrak */
/* 0x20 */ааа time_t аааааа аfs_time;ааааааааааа /* last time written */
/* 0x24 */ааа int32_tаааааа fs_size;ааааааааааа /* number of blocks in fs */
/* 0x28 */ааа int32_tаааааа fs_dsize;аааааааааа /* number of data blocks in fs */
/* 0x2C */ааа int32_tаааааа fs_ncg;аааааааааааа /* number of cylinder groups */
/* 0x30 */ааа int32_tаааааа fs_bsize;аааааааааа /* size of basic blocks in fs */
/* 0x34 */ааа int32_tаааааа fs_fsize;аааааааааа /* size of frag blocks in fs */
/* 0x38 */ааа int32_tаааааа fs_frag;ааааааааааа /* number of frags in a block in fs */
/* these are configuration parameters */
/* 0x3T */ааа int32_tаааааа fs_minfree;а аааааа /* minimum percentage of free blocks */
/* 0x40 */ааа int32_tаааааа fs_rotdelay; аааааа /* num of ms for optimal next block */
/* 0x44 */ааа int32_tаааааа fs_rps;аааааааааааа /* disk revolutions per second */
/* sizes determined by number of cylinder groups and their sizes */
/* 0x98 */ааа ufs_daddr_t fs_csaddr;ааааааааааа /* blk addr of cyl grp summary area */
/* 0x9C */ааа int32_tаааааа fs_cssize;ааааааааа /* size of cyl grp summary area */
/* 0xA0 */ааа int32_tаааааа fs_cgsize;ааааааааа /* cylinder group size */
/* these fields can be computed from the others */
/* 0xB4 */ааа int32_tаааааа fs_cpg;аааааааааааа /* cylinders per group */
/* 0xB8 */ааа int32_tаааааа fs_ipg;аааааааааааа /* inodes per group */
/* 0xBC */ааа int32_tаааааа fs_fpg;аааааааааааа /* blocks per group * fs_frag */
/* these fields are cleared at mount time */
/* 0xD0 */ааа int8_tаа fs_fmod;ааааааааа /* super block modified flag */
/* 0xD1 */ааа int8_tаа fs_clean;аааааааа /* file system is clean flag */
/* 0xD2 */ааа int8_t аааааа аfs_ronly;аааааааааа /* mounted read-only flag */
/* 0xD3 */ааа int8_tаа fs_flags;аааааааа /* see FS_ flags below */
/* 0xD4 */ааа u_char fs_fsmnt[MAXMNTLEN];ааааа /* name mounted on */
};