- •Приложение 2 архитектурные особенности файловой системы ext4fs
- •Использование экстентов
- •Новые алгоритмы выделения блоков и индексных дескрипторов
- •Формат индексного дескриптора
- •Суперблок и описатели групп блоков
- •Формат индексного дескриптора
- •Расширенные атрибуты
- •4 Нулевых байта
- •Формат директорий
- •Формат дерева экстентов
- •Принципы выделения блоков и индексных дескрипторов
- •Выделение блоков
- •Резервирование блоков
- •Выделение индексных дескрипторов
- •Журналирование
Формат индексного дескриптора
Формат индексного дескриптора описан в заголовочном файле ext4.h как структура ext4_inode, формат приведен в табл. П.2.6.
Ext4, как и предыдущая файловая система, резервирует некоторые индексные дескрипторы, например 2-й отводится для корневой директории, 8-й – для журнала транзакций. В ext4 по умолчанию используются 256-байтные индексные дескрипторы. Чтобы не переписывать заново многочисленные функции ядра и утилиту проверки файловой системы e2fsck, первые 128 байтов индексного дескриптора оставили фактически без изменений [15]. Обобщенная структура индексного дескриптора представлена на рис. П.2.5.
Рис. П.2.5. Индексный дескриптор в ext4
Фиксированные поля выделяются динамически, в зависимости от того, какая информация есть у текущего ядра об этих полях. Размер области фиксированных полей хранится в каждом индексном дескрипторе в поле i_extra_isize. В самом суперблоке также содержатся два поля: s_min_extra_isize, которое гарантирует минимальный объем области фиксированных полей в каждом индексном дескрипторе, и s_want_extra_isize, которое указывает на желаемый размер области фиксированных полей во вновь создаваемом индексном дескрипторе, но вовсе не гарантирует, что именно такой объем будет в нем выделен [18].
Таблица П.2.6
Формат индексного дескриптора
Размер, байт |
Смещение (dec) |
Смещение (hex) |
Назначение |
2 |
0 |
0 |
Тип файла и права доступа к нему |
2 |
2 |
2h |
Младшие 16 бит идентификатора пользователя |
4 |
4 |
4h |
Размер файла в байтах |
4 |
8 |
8h |
Время последнего доступа |
4 |
12 |
Ch |
Время изменения индексного дескриптора |
4 |
16 |
10h |
Время последнего изменения данных файла |
4 |
20 |
14h |
Время удаления файла |
2 |
24 |
18h |
Младшие 16 бит идентификатора группы |
2 |
26 |
1Ah |
Число жестких ссылок на файл |
4 |
28 |
1Ch |
Число блоков или секторов, занимаемых файлом |
4 |
32 |
20h |
Флаги файла |
4 |
36 |
24h |
Зарезервировано для ОС |
15х4 или 5х12 |
40 |
28h |
В зависимости от способа адресации 15 указателей на блоки данных или 1 заголовок экстента (12 байтов) и непосредственно 4 экстента |
4 |
100 |
64h |
Версия файла (для NFS) |
4 |
104 |
68h |
ACL файла |
4 |
108 |
6Ch |
Старшие 32 бита размера файла в байтах |
4 |
112 |
70h |
Устаревшее поле: адрес фрагмента |
12 |
116 |
74h |
Структура, зависящая от типа ОС, определяющая номера фрагментов |
2 |
128 |
80h |
Размер фиксированных полей inode |
2 |
130 |
82h |
Зарезервировано |
4 |
132 |
84h |
Дополнительные 32 бита ctime |
4 |
136 |
88h |
Дополнительные 32 бита mtime |
4 |
140 |
8Ch |
Дополнительные 32 бита atime |
4 |
144 |
90h |
Время создания файла |
4 |
148 |
94h |
Дополнительные 32 бита к ВО создания файла |
4 |
152 |
98h |
Старшие 32 бита версии файла |
Оставшееся пространство в индексном дескрипторе может быть использовано для хранения быстрых расширенных атрибутов файла. Это позволяет не искать каждый раз внешний блок данных с расширенными атрибутами, что для некоторых приложений может весьма увеличить производительность [15].
В ext4 поле, где располагалось время создания файла, заменили на поле с временной отметкой последнего изменения индексного дескриптора. Время создания файла вынесено за пределы стандартных полей.
Индексный дескриптор содержит флаги, которые называются файловыми атрибутами и выводятся утилитой lsattr. Эти флаги приведены в табл. П.2.7.
Таблица П.2.7
Флаги индексного дескриптора
Флаг |
Название |
Описание |
0х00000001 |
SECRM_FL |
Безопасное удаление файла |
0x00000002 |
UNRM_FL |
Неудаляемый файл |
0x00000004 |
COMPR_FL |
Сжатый файл |
0х00000008 |
SYNC_FL |
Синхронное обновление |
0х00000010 |
IMMUTABLE_FL |
Неизменяемый файл |
0х00000020 |
APPEND_FL |
Любая запись может только добавляться в конец файла |
0х00000040 |
NODUMP_FL |
Не дампировать данные файла |
0х00000080 |
NOATIME_FL |
Не обновлять время последнего доступа к файлу |
0х00004000 |
JOURNAL_DATA_FL |
Данные файла должны журналироваться |
0х00040000 |
HUGE_FILE_FL |
Гигантский файл. Размер файла указывается в логических блоках, а не в секторах |
0х00080000 |
EXTENTS_FL |
Файл использует экстенты |