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

         

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


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

За картами следует массив inod'ов, смещение которого содержится в поле cg_iusedoff (адрес первой группы inode продублирован в суперблоке). По сути, в UFS структура inode ничем не отличается от ext2fs, только расположение полей другое. К тому же имеется только один блок косвенной адресации вместо трех, но это уже детали, в которые не будет углубляться (иначе или зависнем или завязнем), а лучше рассмотрим назначение фундаментальных полей, к числу которых принадлежат:

q       di_nlink — кол-во ссылок на файл (0 означает "удален");

q       di_size — размер файла в байтах;

q       di_atime/di_atimensec — время последнего доступа к файлу;

q       di_mtime/di_mtimensec — время последней модификации;

q       di_ctime/di_ctimensec – время последнего изменения inode;

q       di_db – адреса первых 12-блоков данных файла, отсчитываемые в фрагментах от начала группы цилиндров;

q       di_ib — адрес блоков косвенной адресации (фрагменты от начала группы);

Сама структура inode определена в файле /src/ufs/ufs/dinode.h и для UFS1 выглядит так:

struct dinode {

/* 0x00 */    u_int16_t     di_mode;      /*   0: IFMT, permissions; see below. */

/* 0x02 */    int16_t              di_nlink;     /*   2: File link count. */

/* 0x04 */    union {

              u_int16_t oldids[2];       /*   4: Ffs: old user and group ids. */




              int32_t         inumber;           /*   4: Lfs: inode number. */

       } di_u;

/* 0x08 */    u_int64_t     di_size;      /*   8: File byte count. */

/* 0x10 */    int32_t              di_atime;     /*  16: Last access time. */

/* 0x14 */    int32_t              di_atimensec; /*  20: Last access time. */

/* 0x18 */    int32_t              di_mtime;     /*  24: Last modified time. */

/* 0x1C */    int32_t              di_mtimensec; /*  28: Last modified time. */

/* 0x20 */    int32_t              di_ctime;     /*  32: Last inode change time. */

/* 0x24 */    int32_t              di_ctimensec; /*  36: Last inode change time. */

/* 0x28 */    ufs_daddr_t   di_db[NDADDR];       /*  40: Direct disk blocks. */

/* 0x58 */    ufs_daddr_t   di_ib[NIADDR];       /*  88: Indirect disk blocks. */

/* 0x64 */    u_int32_t     di_flags;     /* 100: Status flags (chflags). */

/* 0x68 */    int32_t              di_blocks;    /* 104: Blocks actually held. */

/* 0x6C */    int32_t              di_gen;              /* 108: Generation number. */

/* 0x70 */    u_int32_t     di_uid;              /* 112: File owner. */

/* 0x74 */    u_int32_t     di_gid;              /* 116: File group. */

/* 0x78 */    int32_t              di_spare[2];  /* 120: Reserved; currently unused */

};


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