Каждому файлу на диске соответствует один и только один индексный дескриптор файла, который идентифицируется своим порядковым номером - индексом файла. Это означает, что число файлов, которые могут быть созданы в файловой системе, ограничено числом индексных дескрипторов, которое либо явно задается при создании файловой системы, либо вычисляется исходя из физического объема дискового раздела.
Индексный дескриптор файла имеет следующее строение.
Название поля | Тип | Описание | |
1.2emi_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] |
Указатели на блоки, в которых записаны данные файла |
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] |
Зарезервировано |
Поле типа и прав доступа к файлу представляет собой двух- байтовое слово, каждый бит которого служит флагом, индицирующим отношение файла к определенному типу или установку одного конкретного права на файл.
Идентификатор | Значение | Назначение флага (поля) | |
1.2emS_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 |
Право на выполнение |
Среди индексных дескрипторов имеется несколько дескрипторов, которые зарезервированы для специальных целей и играют особую роль в файловой системе. Это следующие дескрипторы
Идентификатор | Значение | Описание | |
1.2emEXT2_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 |
Первый незарезервированный индексный дескриптор |
Самый важный дескриптор в этом списке - дескриптор корневого каталога. Этот дескриптор указывает на корневой каталог, который, подобно всем каталогам, состоит из записей следущей структуры:
Название поля | Тип | Описание | |
1.2eminode |
ULONG |
номер индексного дескриптора (индекс) файла | |
rec_len |
USHORT |
Длина этой записи | |
name_len |
USHORT |
Длина имени файла | |
name |
CHAR[0] |
Имя файла |
Отдельная запись в каталоге не может пересекать границу блока (то есть должна быть расположена целиком внутри одного блока). Поэтому, если очередная запись не помещается целиком в данном блоке, она переносится в следующий блок, а предыдущая запись продолжается таким образом, чтобы она заполнила блок до конца.