искусственное дыхание КРИС КАСПЕРСКИ АКА МЫЩЪХ Спецвыпуск: Хакер, номер #069, стр. 069-054-6 Структура inode в USF2 struct ufs2_dinode { /* 0x00 */ u_int16_t di_mode; /* 0: IFMT, permissions; see below. */ /* 0x02 */ int16_t di_nlink; /* 2: File link count. */ /* 0x04 */ u_int32_t di_uid; /* 4: File owner. */ /* 0x08 */ u_int32_t di_gid; /* 8: File group. */ /* 0x0C */ u_int32_t di_blksize; /* 12: Inode blocksize. */ /* 0x10 */ u_int64_t di_size; /* 16: File byte count. */ /* 0x18 */ u_int64_t di_blocks; /* 24: Bytes actually held. */ /* 0x20 */ ufs_time_t di_atime; /* 32: Last access time. */ /* 0x28 */ ufs_time_t di_mtime; /* 40: Last modified time. */ /* 0x30 */ ufs_time_t di_ctime; /* 48: Last inode change time. */ /* 0x38 */ ufs_time_t di_birthtime; /* 56: Inode creation time. */ /* 0x40 */ int32_t di_mtimensec; /* 64: Last modified time. */ /* 0x44 */ int32_t di_atimensec; /* 68: Last access time. */ /* 0x48 */ int32_t di_ctimensec; /* 72: Last inode change time. */ /* 0x4C */ int32_t di_birthnsec; /* 76: Inode creation time. */ /* 0x50 */ int32_t di_gen; /* 80: Generation number. */ /* 0x54 */ u_int32_t di_kernflags; /* 84: Kernel flags. */ /* 0x58 */ u_int32_t di_flags; /* 88: Status flags (chflags). */ /* 0x5C */ int32_t di_extsize; /* 92: External attributes block. */ /* 0x60 */ ufs2_daddr_tdi_extb[NXADDR];/* 96: External attributes block. */ /* 0x70 */ ufs2_daddr_tdi_db[NDADDR]; /* 112: Direct disk blocks. */ /* 0xD0 */ ufs2_daddr_tdi_ib[NIADDR]; /* 208: Indirect disk blocks. */ /* 0xE8 */ int64_t di_spare[3]; /* 232: Reserved; currently unused */ }; Имена файлов хранятся в директориях. В inode их нет. С точки зрения UFS, директории являются обыкновенными файлами (ну, не совсем обыкновенными) и могут храниться в любом месте, принадлежащем группе цилиндров. Файловая система UFS поддерживает несколько типов хеширования директорий, однако на структуре хранения имен это никак не отражается. Имена хранятся в блоках, называемых DIRBLKSIZ в структурах типа direct, выровненных по 4-байтовой границе. Структура direct определена в файле /src/ufs/ufs/dir.h и содержит: номер inode, описывающий данный файл, тип файла, его имя, а так же длину самой структуры direct, используемую для нахождения следующего direct'а в блоке. Структура direct, отвечающая за хранение имен файлов и директорий struct direct { /* 0x00 */ u_int32_t d_ino; /* inode number of entry */ /* 0x04 */ u_int16_t d_reclen; /* length of this record */ /* 0x06 */ u_int8_t d_type; /* file type, see below */ /* 0x07 */ u_int8_t d_namlen; /* length of string in d_name */ /* 0x08 */ char d_name[MAXNAMLEN + 1];/* name with length <= MAXNAMLEN */ }; [что происходит при удалении файла.] При удалении файла на UFS-разделе происходит следующее (события перечислены в порядке расположения соответствующих структур в разделе и могут не совпадать с порядком их возникновения): 1 В суперблоке обновляется поле fs_time (время последнего доступа к разделу). 2 В суперблоке обновляется структура fs_cstotal (количество свободных inode и блоков данных в разделе). |