101
Каждая строка Inode Table имеет размер 128 байт и имеет структуру индексного дескриптора файлов, рассмотренного ниже. Количество строк Inode Table, а следовательно, и размер таблицы, задается при создании файловой системы.
Замечание
Каждый файл требует одной записи в таблицу дескрипторов. Поэтому размер этих таблиц нужно предусмотреть заранее.
Среди индексных дескрипторов имеется несколько значений дескрипторов, которые зарезервированы для специальных целей и играют особую роль в файловой системе.
Замечание
Значения этих дескрипторов, которые перечислены в таблице 4.7, не могут быть использованы для других целей.
Таблица 4.7 - Специальные индексные дескрипторы
Идентификатор |
Знач. Описание |
Индексный дескриптор, в котором перечисле- EXT2_BAD_INO 1 ны адреса дефектных блоков на диске (Bad
blocks inode).

EXT2_ROOT_INO
EXT2_ACL_IDX_INO

EXT2_ACL_DATA_INO
EXT2_BOOT_LOADER_INO

EXT2_UNDEL_DIR_INO EXT2_FIRST_INO
2Индексный дескриптор корневого каталога файловой системы (Root inode).

3 
ACL inode.
4
ACL inode.
5Индексный дескриптор загрузчика (Boot loader inode).

6 
Undelete directory inode.
11Первый незарезервированный индексный дескриптор.
Самый важный дескриптор в этом списке - дескриптор корневого каталога.
Каталог файловой системы - файл, состоящий из записей переменной длины.
Таблица 4.8 - Структура файла корневого каталога
Название поля |
Тип |
Описание |
inode |
ULONG |
Номер индексного дескриптора (индекс) файла |
rec_len |
USHORT |
Длина этой записи |
name_len |
USHORT |
Длина имени файла |
name |
CHAR[0] |
Первый символ имени файла |
102
Замечание
Отдельная запись в каталоге не может пересекать границу блока, то есть должна быть расположена целиком внутри одного блока.
Если очередная запись каталога не помещается целиком в данном блоке, то она переносится в следующий блок, а предыдущая запись продолжается таким образом, чтобы она заполнила блок до конца.
Индексные дескрипторы файлов:
Вся информация о файле хранится в индексном десткрипторе (Inode).
Число файлов, которое может быть создано в файловой системе, ограничено числом индексных дескрипторов, которое:
•либо явно задается, при создании файловой системы;
•либо вычисляется, исходя из физического объема дискового раздела.
Размер индексного дескриптора = 32 * 4 = 128 байт. Структура индексного дескриптора приведена в таблице 4.9.
Таблица 4.9 - Структура индексного дескриптора файла
Название |
Тип |
|
поля |
||
|
||
i_mode |
USHORT |
|
i_uid |
USHORT |
|
i_size |
ULONG |
|
i_atime |
ULONG |
|
i_ctime |
ULONG |
|
i_mtime |
ULONG |
|
i_dtime |
ULONG |
|
i_gid |
USHORT |
|
i_links_count |
USHORT |
|
i_blocks |
ULONG |
|
i_flags |
ULONG |
|
i_reserved1 |
ULONG |
|
i_block |
ULONG[ |
|
15] |
||
|
||
i_version |
ULONG |
|
i_file_acl |
ULONG |
|
i_dir_acl |
ULONG |
|
i_faddr |
ULONG |
|
i_frag |
UCHAR |

Описание
Тип и права доступа к данному файлу.

Идентификатор владельца файла (Owner Uid).
Размер файла в байтах.

Время последнего обращения к файлу (Access time).
Время создания файла.

Время последней модификации файла.
Время удаления файла.

Идентификатор группы (GID).
Счетчик числа связей (Links count).

Число блоков, занимаемых файлом.
Флаги файла (File flags)

Зарезервировано для ОС
Указатели на блоки данных, которые рассмотрены далее в разделе «Система адресации данных»

Версия файла (для NFS)
ACL файла - Access Control List – список доступа

ACL каталога - Access Control List – список доступа
Адрес фрагмента (Fragment address) 
Номер фрагмента (Fragment number)
|
|
103 |
i_fsize |
UCHAR |
Размер фрагмента (Fragment size) |
i_pad1 |
USHORT |
Заполнение |
i_reserved2 |
2]ULONG[ |
Зарезервировано |
Среди множества полей индесного десткриптора файла, более подробно мы рассмотрим i_mode и i_block.
Поле i_mode - тип и права доступа к файлу.
Оно является двух-байтовым словом, каждый бит которого служит флагом, индицирующим отношение файла к определенному типу или установку одного конкретного права на файл (таблица 4.10).
Таблица 4.10 - Поле прав доступа к файлу
Идентификатор |
Значение |
Назначение флага (поля) |
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 |
Право на запись |
|
|
104 |
S_IXGRP |
0008 |
Право на выполнение |
S_IRWXO |
0007 |
Маска прав остальных пользователей |
S_IROTH |
0004 |
Право на чтение |
S_IWOTH |
0002 |
Право на запись |
S_IXOTH |
0001 |
Право на выполнение |
Система адресации данных - одна из самых существенных составных частей файловой системы. Именно она позволяет находить нужный файл среди множества как пустых, так и занятых блоков на диске.
В ext2fs, она реализуется полем i_block индексного дескриптора файла.
Поле i_block в индексном дескрипторе файла представляет собой массив из 15 адресов блоков, что наглядно демонстрируется рисунком 4.6.
Рисунок 4.6 - Адресация блоков файла с помощью i_block
105
Первые 12 адресов в этом массиве i_block[0 - 11] = EXT2_NDIR_BLOCKS [0 - 11] - прямые ссылки (адреса) на номера блоков, в которых хранятся данные из файла.
Следующий адрес i_block[12] = EXT2_IND_BLOCK является косвенной ссылкой на блок, в котором хранится список следующих адресов блоков с данными для этого файла:
Количество адресов = (размер_блока / размер_ULONG)
Следующий адрес i_block[13] = EXT2_DIND_BLOCK указывает на блок двойной косвенной адресации (double indirect block). Этот блок содержит список адресов блоков, которые в свою очередь содержат списки адресов следующих блоков данных того файла, который задается данным индексным дескриптором:
Количество адресов = (размер_блока / размер_ULONG)2
Последний адрес i_block[14] = EXT2_TIND_BLOCK указывает на блок тройной косвенной адресации:
Количество адресов = (размер_блока / размер_ULONG)3
Все оставшееся место, в группе блоков, отводится для хранения файлов. Таким образом, прочитав суперблок, мы можем:
•определить адреса групп блоков данных прочитать групповые дескрипторы;
•из групповых дескрипторов определяем положение и размер индексных дескрипторов файлов;
•просматривая таблицу индексных дескрипторов файлов, мы определяем, что
описывает дескриптор: файл, каталог, символьное или блочное устройство, другие объекты;
•по дескрипторам каталогов мы читаем блоки данных, в которых записаны
имена файлов, каталогов, других устройств и соответствующие номера записей в таблице индексных дескрипторов файлов;
•номера свободных блоков и индексных дескрипторов файлов мы определяет по соответствующим битовым таблицам (картам).