- •Приложение 2 архитектурные особенности файловой системы ext4fs
- •Использование экстентов
- •Новые алгоритмы выделения блоков и индексных дескрипторов
- •Формат индексного дескриптора
- •Суперблок и описатели групп блоков
- •Формат индексного дескриптора
- •Расширенные атрибуты
- •4 Нулевых байта
- •Формат директорий
- •Формат дерева экстентов
- •Принципы выделения блоков и индексных дескрипторов
- •Выделение блоков
- •Резервирование блоков
- •Выделение индексных дескрипторов
- •Журналирование
Формат директорий
В ext3 директория представляет собой фиксированный список сопоставлений индексного дескриптора файла и его имени. Структура записи в директории показана в табл. П.2.11.
Таблица П.2.11
Структура записи в директории в ext3
Размер, байт |
Поле |
4 |
Индексный дескриптор |
2 |
Длина записи |
2 |
Длина имени файла |
255 |
Имя файла |
В ext4 структура записи в директории претерпела небольшие изменения, что показано в табл. П.2.12.
Таблица П.2.12
Структура записи в директории в ext4
Размер, байт |
Поле |
4 |
Индексный дескриптор |
2 |
Длина записи |
1 |
Длина имени файла |
1 |
Тип файла |
255 |
Имя файла |
Типы файлов: 0 – неизвестный, 1 – обычный, 2 – каталог, 3 – файл символьного устройства, 4 – файл блочного устройства, 5 – именованный канал, 6 – сокет, 7 – символическая ссылка.
В ext4 для превышения лимита в 32 000 подкаталогов введено индексирование директорий. Если установлен соответствующий флаг файловой системы, записи в директориях хэшируются. Неиндексированная директория занимает минимум 1 блок. Минимальный размер индексированной директории должен составлять 3 блока. 0-й блок при этом становится корнем дерева, остальные становятся «листьями».
Блоки-«листья» представляют собой традиционный список имен файлов и индексных дескрипторов. Поэтому, если корень дерева окажется поврежденным, можно будет отыскать файлы, используя традиционную схему. Корень дерева содержит хэш-функции блоков-«листьев», каждый такой хэш представляет последовательность записей директории. Хэш в ext4 может быть как 32-битным, так и 64-битным. Для обеспечения совместимости с файловыми системами, не использующими индексирование, первые 8 байтов корня дерева содержат указание на следующий блок директории, т. е. ядро, не поддерживающее индексирование, будет игнорировать набор хэш-функций как удаленные из директории файлы.
Хэш-версии (алгоритмы хэширования) определяются в суперблоке файловой системы и могут принимать следующие значения: 0 – LEGACY, 1 – HALF MD4, 2 – TEA, 3 – LEGACY UNSIGNED, 4 – HALF MD4 UNSIGNED, 5 – TEA UNSIGNED.
Для хэширования используется так называемое «зерно» – некоторое инициализирующее значение, которое также определено в соответствующем поле суперблока. Если зерно содержит нули по какой-то причине, используется зерно по умолчанию [15].
Реализация Н-дерева сейчас ограничена 510 – 511 4-килобайтными блоками-«листьями»: именно такое количество может быть проиндексировано 2-уровневым деревом (дерево должно иметь постоянную глубину). Возможно, в будущем количество уровней увеличат до 3. Также в директориях существует ограничение на размер файла в 2 Гб, потому что размер поля i_size в директории ограничен 32 битами [17].
Предполагается целиком помещать индексный дескриптор директории в саму директорию для ускорения чтения-записи при обращении к функции readdir. Также предполагается при динамическом выделении индексных дескрипторов использовать директории как контейнер для таблицы индексных дескрипторов. Для файлов, имеющих жесткие ссылки в других директориях, проблему решает счетчик числа связей в индексном дескрипторе.
Также разработчики предлагают хранить одно или несколько имен файлов в самом индексном дескрипторе в поле расширенных атрибутов файла. Имя должно хранить номер индексного дескриптора директории, к которой файл принадлежит [16].
Удаление файла из директории в англоязычной литературе носит название unlink, то есть удаление ссылки. На самом деле при удалении файла в предыдущей записи директории модифицируется поле «длина записи», которое может указывать на конец директории или на следующую запись. Сам индексный дескриптор и имя файла остаются в директории и могут быть прочитаны, что используется некоторыми программами по восстановлению файлов [17].
При чтении директорий с диска игнорируются ошибки ввода/вывода, чтобы у пользователей была возможность восстановить часть данных, если в директории есть сбойные сектора [18].