Каждому файлу на диске соответствует один и только один индексный дескриптор файла, который идентифицируется своим порядковым номером — индексом файла. Это означает, что число файлов, которые могут быть созданы в файловой системе, ограничено числом индексных дескрипторов, которое либо явно задается при создании файловой системы, либо вычисляется исходя из физического объема дискового раздела.
Строение индексного дескриптора файла приведено в табл. 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_links_count
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)
Инлексный дескриптор каталога для удаленных файлов (Undelete directory inode)
EXT2_FIRST_INO
11
Первый незарезервированный индексный дескриптор
Самый важный дескриптор в этом списке — дескриптор корневого каталога. Этот дескриптор указывает на корневой каталог, который, подобно всем каталогам, представляет собой связанный список, состоящий из записей переменной длины. Каждая запись имеет следующую структуру (табл. 16.7):
Таблица 16.7. Структура дескриптора, описывающего корневой каталог
Название поля
Тип
Описание
Inode
ULONG
Номер индексного дескриптора (индекс) файла
Rec_len
USHORT
Длина этой записи
Name_len
USHORT
Длина имени файла
Name
CHAR[0]
Имя файла
Использование записей переменной длины позволяет использовать длинные имена файлов без пустой траты дискового пространства. Отдельная запись в каталоге не может пересекать границу блока (т. е. должна быть расположена целиком внутри одного блока). Поэтому, если очередная запись не помещается целиком в данном блоке, она переносится в следующий блок, а предыдущая запись продолжается таким образом, чтобы она заполнила блок до конца.