Восстановление удаленных файлов под BSD

         

последовательно расположенные группы цилиндров


В 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 */

/* 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 */

/* 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 */

};


Содержание раздела