← Назад к вопросам

Как устроена система ext4?

1.7 Middle🔥 132 комментариев
#Операционные системы и Linux

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Основные принципы организации файловой системы ext4

ext4 (Fourth Extended Filesystem) — это современная, широко используемая журналируемая файловая система для Linux, развивающая идеи своих предшественников ext2 и ext3. Она была создана для устранения ограничений ext3 и обеспечения поддержки больших файлов и файловых систем.

Ключевые структурные элементы и организация данных

1. Блоки и суперблок

Основная единица хранения данных в ext4 — блок (обычно размером 4KB). Структура начинается с суперблока (Superblock), который содержит критическую метаинформацию о всей файловой системе: размер блока, общее количество блоков и свободных блоков, количество инодов (inode), время последнего изменения и проверки, а также информацию о журналировании. Суперблок хранится в нескольких копиях для повышения надежности.

2. Иноды (Inode) — сердце системы

Каждый файл или директория в ext4 представлен инодом (inode) — структурой данных размером 256 байт (в классической реализации), хранящей всю метаинформацию об объекте, кроме его имени.

// Примерное представление ключевых полей структуры inode в ядре Linux
struct ext4_inode {
    __le16 i_mode;        // Тип файла и права доступа
    __le16 i_uid;         // Owner UID
    __le32 i_size;        // Размер файла в байтах
    __le32 i_atime;       // Время последнего доступа
    __le32 i_ctime;       // Время последнего изменения статуса инода
    __le32 i_mtime;       // Время последнего изменения содержимого файла
    __le32 i_dtime;       // Время удаления
    __le16 i_gid;         // Owner GID
    __le16 i_links_count; // Количество жестких ссылок
    __le32 i_block[EXT4_N_BLOCKS]; // Массив указателей на блоки данных (15 элементов)
    // ... множество других полей
};

Поле i_block содержит 15 элементов, которые могут быть:

  • Прямые указатели (первые 12 элементов) — непосредственно адреса блоков данных.
  • Одноуровневый индекс (13-й элемент) — адрес блока, который сам содержит список адресов блоков данных.
  • Двухуровневый индекс (14-й элемент) — двухуровневая структура для очень больших файлов.
  • Трехуровневый индекс (15-й элемент) — трехуровневая структура для гигантских файлов (до 4TB в ext4).

3. Дескрипторы групп блоков и битмапы

Файловая система делится на группы блоков (Block Groups) для улучшения производительности и локализации данных. Каждая группа содержит:

  • Суперблок (резервная копия) и дескриптор группы (Group Descriptor), описывающий группу.
  • Битмапу блоков — битовую маску, показывающую, какие блоки в группе свободны.
  • Битмапу инодов — аналогичную маску для свободных инодов.
  • Таблицу инодов (Inode Table) — область, хранящую сами структуры inode.
  • Блоки данных — основное пространство для содержимого файлов.

Механизмы хранения данных и метаданных

Хранение содержимого файлов

  • Малые файлы: адреса блоков хранятся прямо в массиве i_block инода.
  • Большие файлы: используются индексы (один, два или три уровня) для организации эффективного дерева указателей.

Хранение директорий

Директория в ext4 — это специальный файл, содержимое которого представляет собой список записей (directory entries или dentries).

// Упрощенная структура записи директории в ext4
struct ext4_dir_entry {
    __le32 inode;          // Номер инода файла
    __le16 rec_len;        // Длина записи (включая имя)
    __le16 name_len;       // Длина имени файла
    char name[EXT4_NAME_LEN]; // Имя файла (до 255 байт)
};

Для повышения производительности поиска в больших директориях ext4 поддерживает индексированные директории с использованием хэш-деревьев.

Журналирование (Journaling) и надежность

Журналирование — ключевая особенность ext4, обеспечивающая целостность данных после сбоев. Система использует механизм метаданных журналирования (по умолчанию): перед изменением структур файловой системы (иноды, дескрипторы групп) запись об операции помещается в журнал (специальный файл или область). После успешного завершения операции журнал очищается. При сбое система может восстановить состояние, "воспроизведя" записи журнала.

Типы журналирования:

  • Journal — журналирование всех данных и метаданных (надежно, но медленно).
  • Ordered (по умолчанию) — журналирование только метаданных, но блоки данных записываются перед соответствующими метаданными в журнал.
  • Writeback — журналирование только метаданных без гарантий порядка записи данных (быстрее).

Современные оптимизации ext4

  • Extents вместо традиционных блоков: вместо хранения списка отдельных блоков больших файлов, ext4 использует экстенты (extents) — непрерывные диапазоны блоков, что сокращает объем метаданных и повышает производительность.
  • Многоблоковые выделения: предварительное выделение блоков при расширении файлов для снижения фрагментации.
  • Отложенное выделение инодов: оптимизация для снижения нагрузки при массовом создании файлов.
  • Проверка целостности (fsck): ускоренная проверка благодаря журналированию и другим улучшениям.

Взаимодействие с ядром Linux

В ядре Linux ext4 реализована как модуль файловой системы (fs/ext4/), который взаимодействует с VFS (Virtual File System). VFS предоставляет абстрактный интерфейс, а конкретная файловая система (ext4) реализует операции (open, read, write, mkdir через свои функции ext4_file_open, ext4_read, ext4_write, ext4_mkdir).

Таким образом, ext4 представляет собой сложную, но эффективную иерархическую структуру, сочетающую надежность журналирования, масштабируемость для больших объемов данных и множество оптимизаций для современных workloads.

Как устроена система ext4? | PrepBro