искусственное дыхание КРИС КАСПЕРСКИ АКА МЫЩЪХ Спецвыпуск: Хакер, номер #069, стр. 069-054-3 Среди прочей информации суперблок содержит: - cblkno — смещение первой группы блока цилиндров, измеряемый в фрагментах, отсчитываемых от начала раздела; - fs_iblkno — смещение первой inode в первой группе цилиндров (фрагменты от начала раздела); - fs_dblkno — смещение первого блока данных в первой группе цилиндров (фрагменты от начала раздела); - fs_ncg — количество групп цилиндров (штуки); - fs_bsize – размер одного блока в байтах; - fs_fsize — размер одного фрагмента в байтах; - fs_frag — количество фрагментов в блоке; - 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 */ /* 0x3С */ 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 */ |