16.3. Индексные дескрипторы файлов

We use cookies. Read the Privacy and Cookie Policy

16.3. Индексные дескрипторы файлов

Каждому файлу на диске соответствует один и только один индексный дескриптор файла, который идентифицируется своим порядковым номером - индексом файла. Это означает, что число файлов, которые могут быть созданы в файловой системе, ограничено числом индексных дескрипторов, которое либо явно задается при создании файловой системы, либо вычисляется исходя из физического объема дискового раздела.

Строение индексного дескриптора файла приведено в табл. 16.4.

Таблица 16.4. Структура индексного дескриптора

Название поля Тип Описание i_mode USHORT Тип и права доступа к данному файлу i_uid USHORT Идентификатор владельца файла (Owner Uid) i_size ULONG Размер файла в байтах i_atime ULONG Время последнего обращения к файлу (Access time) i_ctime ULONG Время создания файла i_mtime ULONG Время последней модификации файла i_dtime ULONG Время удаления файла i_gid USHORT Идентификатор группы (GID) i_link_scount USHORT Счетчик числа связей (Links count) i_blocks ULONG Число блоков, занимаемых файлом i_flags ULONG Флаги файла (File flags) i_reserved1 ULONG Зарезервировано для ОС i_block ULONG[15] Указатели на блоки, в которых записаны данные файла (это поле подробно описано в разд. 16.4) i_version ULONG Версия файла (для NFS) i_file_acl ULONG ACL файла i_dir_acl ULONG ACL каталога i_faddr ULONG Адрес фрагмента (Fragment address) i_frag UCHAR Номер фрагмента (Fragment number) i_fsize UCHAR Размер фрагмента (Fragment size) i_pad1 USHORT Заполнение i_reserved2 ULONG[2] Зарезервировано

Поле типа и прав доступа к файлу представляет собой двухбайтовое слово, каждый бит которого служит флагом, индицирующим отношение файла к определенному типу или установку одного конкретного права на файл.

Таблица 16.5. Структура поля, задающего тип и права доступа

Идентификатор Значение Назначение флага (поля) S_IFMT F000 Маска для типа файла S_IFSOCK A000 Доменное гнездо (socket) S_IFLNK C000 Символическая ссылка S_IFREG 8000 Обычный (regular) файл S_IFBLK 6000 Блок-ориентированное устройство S_IFDIR 4000 Каталог S_IFCHR 2000 Байт-ориентированное (символьное) устройство S_IFIFO 1000 Именованный канал (fifo) S_ISUID 0800 SUID - бит смены владельца S_ISGID 0400 SGID - бит смены группы S_ISVTX 0200 Бит сохранения задачи (sticky bit) S_IRWXU 01C0 Маска прав владельца файла S_IRUSR 0100 Право на чтение S_IWUSR 0080 Право на запись S_IXUSR 0040 Право на выполнение S_IRWXG 0038 Маска прав группы S_IRGRP 0020 Право на чтение S_IWGRP 0010 Право на запись S_IXGRP 0008 Право на выполнение S_IRWXO 0007 Маска прав остальных пользователей S_IROTH 0004 Право на чтение S_IWOTH 0002 Право на запись S_IXOTH 0001 Право на выполнение

Среди индексных дескрипторов имеется несколько дескрипторов, которые зарезервированы для специальных целей и играют особую роль в файловой системе (табл. 16.6).

Таблица 16.6. Особые индексные дескрипторы

Идентификатор Значение Описание EXT2_BAD_INO 1 Индексный дескриптор, в котором перечислены адреса дефектных блоков на диске (Bad blocks inode) EXT2_ROOT_INO 2 Индексный дескриптор корневого каталога файловой системы (Root inode) EXT2_ACL_IDX_INO 3 ACL inode EXT2_ACL_DATA_INO 4 ACL inode EXT2_BOOT_LOADER_INO 5 Индексный дескриптор загрузчика (Boot loader inode) EXT2_UNDEL_DIR_INO 6 Индексный дескриптор каталога для удаленных файлов (Undelete directory inode) EXT2_FIRST_INO 11 Первый незарезервированный индексный дескриптор

Самый важный дескриптор в этом списке - дескриптор корневого каталога. Этот дескриптор указывает на корневой каталог, который, подобно всем каталогам, представляет собой связанный список, состоящий из записей переменной длины. Каждая запись имеет следующую структуру (табл. 16.7):

Таблица 16.7. Структура дескриптора, описывающего корневой каталог

Название поля Тип Описание Inode ULONG Номер индексного дескриптора (индекс) файла Rec_len USHORT Длина этой записи Name_len USHORT Длина имени файла Name CHAR[0] Имя файла

Использование записей переменной длины позволяет использовать длинные имена файлов без пустой траты дискового пространства. Отдельная запись в каталоге не может пересекать границу блока (т. е. должна быть расположена целиком внутри одного блока). Поэтому, если очередная запись не помещается целиком в данном блоке, она переносится в следующий блок, а предыдущая запись продолжается таким образом, чтобы она заполнила блок до конца.