Linux для пользователя

       

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


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

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

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

Название поляТипОписаниеi_modeUSHORTТип и права доступа к данному файлуi_uidUSHORTИдентификатор владельца файла (Owner Uid)i_sizeULONGРазмер файла в байтахi_atimeULONGВремя последнего обращения к файлу (Access time)i_ctimeULONGВремя создания файлаi_mtimeULONGВремя последней модификации файлаi_dtimeULONGВремя удаления файлаi_gidUSHORTИдентификатор группы (GID)i_links_countUSHORTСчетчик числа связей (Links count)i_blocksULONGЧисло блоков, занимаемых файломi_flagsULONGФлаги файла (File flags)i_reserved1ULONGЗарезервировано для ОСi_blockULONG[15]Указатели на блоки, в которых записаны данные файла (это поле подробно описано в разд. 16.4)i_versionULONGВерсия файла (для NFS)i_file_aclULONGACL файлаi_dir_aclULONGACL каталогаi_faddrULONGАдрес фрагмента (Fragment address)i_fragUCHARНомер фрагмента (Fragment number)i_fsizeUCHARРазмер фрагмента (Fragment size)i_pad1USHORTЗаполнение i_reserved2ULONG[2]Зарезервировано

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

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

ИдентификаторЗначениеНазначение флага (поля)S_IFMTF000Маска для типа файлаS_IFSOCKA000Доменное гнездо (socket)S_IFLNKC000Символическая ссылкаS_IFREG8000Обычный (regular) файлS_IFBLK6000Блок-ориентированное устройствоS_IFDIR4000КаталогS_IFCHR2000Байт-ориентированное (символьное) устройствоS_IFIFO1000Именованный канал (fifo)S_ISUID0800SUID — бит смены владельцаS_ISGID0400SGID — бит смены группыS_ISVTX0200Бит сохранения задачи (sticky bit)S_IRWXU01C0Маска прав владельца файлаS_IRUSR0100Право на чтениеS_IWUSR0080Право на записьS_IXUSR0040Право на выполнениеS_IRWXG0038Маска прав группыS_IRGRP0020Право на чтениеS_IWGRP0010Право на записьS_IXGRP0008Право на выполнениеS_IRWXO0007Маска прав остальных пользователейS_IROTH0004Право на чтениеS_IWOTH0002Право на записьS_IXOTH0001Право на выполнение


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

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

ИдентификаторЗначениеОписаниеEXT2_BAD_INO1Индексный дескриптор, в котором перечислены адреса дефектных блоков на диске (Bad blocks inode)EXT2_ROOT_INO2Индексный дескриптор корневого каталога файловой системы (Root inode)EXT2_ACL_IDX_INO3ACL inodeEXT2_ACL_DATA_INO4ACL inodeEXT2_BOOT_LOADER_INO5Индексный дескриптор загрузчика (Boot loader inode)EXT2_UNDEL_DIR_INO6Инлексный дескриптор каталога для удаленных файлов (Undelete directory inode)EXT2_FIRST_INO11Первый незарезервированный индексный дескриптор

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

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

Название поляТипОписаниеInodeULONGНомер индексного дескриптора (индекс) файлаRec_lenUSHORTДлина этой записиName_lenUSHORTДлина имени файлаNameCHAR[0]Имя файла

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

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