Восстановление удаленных файлов под 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 */

};


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