Visitar URL original
ext4 — Вікіпедія
Перейти до вмісту

ext4

Очікує на перевірку
Матеріал з Вікіпедії — вільної енциклопедії.
ext4
РозробникЕндрю Мортонd, Мінмін Цаоd і Теодор Цаоd Редагувати інформацію у Вікіданих
Повна назваFourth extended filesystem
Представлено24 грудня 2008 року (Linux 2.6.28; стабільна підтримка)
Структура
Вміст директорійлінійні записи каталогів, індекс HTree (хешоване дерево)
Виділення простору під файлиекстенти, індексні дескриптори, бітові карти
Збійні секториспеціальний індексний дескриптор збійних блоків
Обмеження
Максимальний розмір файлу16 ТіБ за розміру блока 4 КіБ і використання екстентів
Максимум файлівдо 232 індексних дескрипторів (кількість визначається під час форматування)
Максимальна довжина імені файлу255 байтів
Максимальний розмір томузалежить від розміру блока й підтримки 64bit (див. текст)
Допустимі символи в назвахдовільні байти, крім NUL і /; необов'язкова підтримка Unicode для casefold
Можливості
Дати що записуютьсязміна даних (mtime), зміна метаданих (ctime), доступ (atime), створення (crtime), вилучення (dtime)
Діапазон дат13 грудня 1901 — 10 травня 2446 року (для розширених часових позначок)
Точність збереження дати1 наносекунда (для розширених часових позначок)
Потоки метаданихні
Атрибутирозширені атрибути, ACL, квоти користувачів, груп і проєктів
Управління правами доступуPOSIX, ACL
Стисканнявбудоване прозоре стиснення відсутнє
Шифруваннятак, через fscrypt
Операційні системи в яких підтримуєтьсяLinux; для інших ОС існують сторонні засоби доступу

ext4 (від англ. Fourth extended filesystem — «четверта розширена файлова система») — журнальована файлова система загального призначення, розроблена для Linux як подальший розвиток ext3. Зберігаючи спорідненість із ext2 та ext3, ext4 підтримує екстенти, відкладене виділення блоків, перевірку контрольних сум метаданих, більші файлові системи та низку додаткових можливостей, зокрема шифрування файлів.[1][2]

ext4 використовується для зберігання даних на різних видах блокових пристроїв, зокрема жорстких дисках і твердотілих накопичувачах. Її формат поєднує структури, успадковані від ext2/ext3, з новими механізмами розміщення файлів та захисту метаданих. Як і інші журнальовані файлові системи, ext4 спрямована на збереження узгодженості своїх структур після аварійного завершення роботи, але саме журналювання не замінює резервного копіювання файлів.[3]

Історія

[ред. | ред. код]

Розробка ext4 розпочалася як продовження ext3 з метою подолання обмежень розміру та підвищення ефективності розподілу дискового простору. У жовтні 2006 року експериментальну реалізацію включили до гілки ядра 2.6.19-rc1-mm1, яку супроводжував Ендрю Мортон. Невдовзі початковий код ext4 потрапив і до основної гілки розробки Linux, однак упродовж наступних років файлова система залишалася експериментальною.[4][5]

До складу ядра Linux 2.6.28, випущеного 24 грудня 2008 року, ext4 увійшла вже без експериментального статусу. Надалі її розвиток відбувався в межах основної гілки ядра Linux та набору утиліт e2fsprogs.[6][2]

Архітектура

[ред. | ред. код]

Групи блоків та індексні дескриптори

[ред. | ред. код]

Простір ext4 поділяється на групи блоків. Вони містять ділянки для даних файлів, бітові карти використання блоків та індексних дескрипторів, а також таблиці індексних дескрипторів (англ. inode). Індексний дескриптор зберігає відомості про файл — його розмір, права доступу, часові позначки та спосіб розміщення даних. Імена файлів зберігаються в записах каталогів, які пов'язують ім'я з номером дескриптора.[7][8]

Типовий розмір блока — 4 КіБ, хоча можливі інші значення залежно від налаштувань файлової системи та платформи. Механізм flex_bg дає змогу групувати службові структури декількох груп блоків, залишаючи більші безперервні ділянки для файлів. «Лінива» ініціалізація (англ. lazy initialization) дозволяє завершувати очищення частини таблиць індексних дескрипторів у фоновому режимі після форматування, скорочуючи час початкового створення файлової системи.[7][2]

Екстенти та виділення дискового простору

[ред. | ред. код]

На відміну від традиційної схеми непрямих вказівників на окремі блоки в ext2/ext3, ext4 зазвичай застосовує екстенти — записи, кожен із яких описує послідовність суміжних блоків файла. Екстенти організовано у вигляді дерева, корінь якого міститься в індексному дескрипторі. Це скорочує обсяг службових даних для великих файлів і полегшує пошук їхніх ділянок на носії.[9]

ext4 також використовує виділення кількох блоків за одну операцію (англ. multiblock allocation) та відкладене виділення (англ. delayed allocation). За відкладеного виділення ядро спочатку накопичує зміни в пам'яті й вибирає фізичні блоки пізніше, коли дані мають бути записані. Це може поліпшувати розміщення суміжних блоків і зменшувати фрагментацію, хоча результат залежить від навантаження й наявного вільного простору. Для вже фрагментованих файлів з екстентами існує утиліта e4defrag.[1][10]

За ввімкненої можливості bigalloc блоки можуть виділятися більшими кластерами. Це зменшує накладні витрати при роботі з великими файлами, проте такий спосіб розподілу не завжди доцільний для великої кількості малих файлів.[2]

Каталоги

[ред. | ред. код]

Записи невеликих каталогів можуть зберігатися послідовно, а для прискорення пошуку в каталогах із багатьма записами застосовується індекс HTree (англ. hashed tree). Він використовує хешування імен та деревоподібний індекс; його не слід ототожнювати зі звичайним B-деревом. Можливості dir_nlink та large_dir збільшують масштабованість каталогів і усувають частину обмежень попередніх реалізацій.[11][2]

Журналювання та цілісність даних

[ред. | ред. код]

Для журналювання ext4 використовує підсистему JBD2. Журнал містить записи про операції з метаданими, які дають змогу після нештатного вимкнення повторно застосувати завершені транзакції або відкинути незавершені. Журнал може розташовуватися всередині файлової системи чи на окремому пристрої.[3]

Режим журналювання визначається параметром монтування data=:

  • ordered — режим за замовчуванням: дані файла записуються на основний носій до фіксації пов'язаних із ними метаданих у журналі;
  • writeback — журналюються метадані без забезпечення такого порядку запису даних; після збою можливий вміст файла, що не відповідає останнім змінам метаданих;
  • journal — через журнал передаються як метадані, так і дані файлів; це збільшує кількість операцій запису.[1]

Для збереження потрібної послідовності операцій із журналом застосовуються бар'єри запису та відповідні механізми синхронізації накопичувача. Вимкнення цих механізмів за наявності енергозалежного кешу може призвести до втрати узгодженості даних під час збою живлення. Журналювання забезпечує відновлення службових структур, але не гарантує збереження всіх останніх змін у вмісті файлів; для цього важливі також правила синхронізації записів застосунками.[1]

Підтримка контрольних сум журналу та можливість metadata_csum дозволяють виявляти пошкодження низки службових структур, зокрема суперблока, бітових карт, індексних дескрипторів і вузлів дерева екстентів. Це не означає автоматичної перевірки контрольними сумами вмісту кожного звичайного файла.[12]

Починаючи з ядра Linux 5.10, ext4 підтримує механізм швидких фіксацій (англ. fast commits), який за відповідної конфігурації зменшує обсяг інформації про деякі зміни метаданих, що записується під час журналювання.[3][2]

Розміри та обмеження

[ред. | ред. код]

Граничні розміри залежать від розміру блока, формату адресації та підтримки відповідних можливостей ядром і службовими утилітами. Для поширеної конфігурації з блоком 4 КіБ документація ядра Linux наводить такі значення:[13]

ХарактеристикаЗначення та умови
Найбільший файл16 ТіБ за використання екстентів
Кількість індексних дескрипторівТеоретично до 232; фактична кількість резервується під час створення файлової системи
Розмір файлової системи без 64bitДо 16 ТіБ (232 блоків по 4 КіБ)
64-бітна адресація блоківТеоретичний адресний простір до 64 ЗіБ за блока 4 КіБ; реальні межі нижчі й залежать від реалізації, формату екстентів та інструментів
Довжина одного компонента імені файлаДо 255 байтів

Формат екстентів використовує 48-бітні адреси фізичних блоків, тому сам лише 64-бітний розмір простору адресації не означає можливості розміщувати довільні файли на всій його протяжності. Вказані величини є межами формату, а не гарантією створення чи монтування томів такого розміру на будь-якій системі.[13]

У звичайному режимі імена файлів є послідовностями байтів; недопустимі нульовий байт та символ /, що відділяє компоненти шляху. За ввімкненої можливості casefold для вибраних каталогів доступний пошук імен без урахування регістру з використанням правил нормалізації Unicode; написання імен на носії при цьому зберігається.[11][1]

Часові позначки

[ред. | ред. код]

ext4 зберігає час останнього доступу (atime), зміни вмісту (mtime), зміни метаданих (ctime) та створення файла (crtime). Додаткові поля розширених індексних дескрипторів забезпечують точність до наносекунди і розширюють діапазон часу для цих позначок: приблизно від 13 грудня 1901 року до 10 травня 2446 року. Водночас час вилучення (dtime) не отримав такого розширення. Цей механізм усуває для відповідних позначок традиційну проблему 2038 року, хоча його використання залежить від підтримки додаткових полів індексних дескрипторів.[8]

Квоти, шифрування та перевірка файлів

[ред. | ред. код]

Файлова система підтримує обмеження використання дискового простору для користувачів і груп, а також квоти проєктів (англ. project quotas). Проєктний ідентифікатор зберігається в індексному дескрипторі та може успадковуватися новоствореними файлами й підкаталогами. Це дозволяє встановлювати спільні ліміти для наборів каталогів незалежно від власників файлів. Підтримка квот проєктів з'явилася в основній гілці ядра Linux 4.5.[2]

Починаючи з Linux 4.1, ext4 підтримує вбудоване шифрування на рівні файлів і каталогів через підсистему fscrypt. Шифрувати можна вміст файлів та їхні імена, однак частина метаданих, зокрема розмір файла, власник і часові позначки, лишається відкритою. Це відрізняється від шифрування всього блокового пристрою.[2]

Механізм fs-verity, доступний в ext4 з Linux 5.4, дозволяє перевіряти незмінність окремих файлів, відкритих лише для читання, за допомогою дерева Меркла. Він призначений для контролю достовірності вмісту таких файлів і не є загальним механізмом контрольних сум усіх записуваних даних у файловій системі.[14][2]

Сумісність та обслуговування

[ред. | ред. код]

Драйвер ext4 у Linux здатен монтувати багато файлових систем ext2 та ext3, а їхню структуру можна поступово модернізувати для використання нових можливостей. Зворотна сумісність не є повною: після ввімкнення несумісних із попередніми версіями функцій, наприклад extent, 64bit або encrypt, старі драйвери можуть уже не розпізнати файлову систему. Тому сумісність визначають конкретні прапорці можливостей у суперблоці й версії програмного забезпечення, а не лише назва ext4.[2]

Для створення й обслуговування ext4 використовують програми з пакета e2fsprogs: mke2fs (або mkfs.ext4) для форматування, tune2fs для зміни параметрів, resize2fs для зміни розміру та e2fsck для перевірки й виправлення помилок. Перевірку e2fsck зазвичай проводять на відмонтованій файловій системі. На інших операційних системах доступ до ext4 залежить від наявності стороннього програмного забезпечення та набору функцій конкретного тому.[2][15]

На відміну від деяких інших сучасних файлових систем, ext4 не має вбудованих загальних механізмів прозорого стиснення, знімків стану файлової системи та копіювання під час запису (англ. copy-on-write). Такі можливості за потреби реалізують інші рівні системи зберігання даних або окремі програмні засоби.[8][2]

Див. також

[ред. | ред. код]

Примітки

[ред. | ред. код]
  1. 1 2 3 4 5 ext4 General Information. The Linux Kernel documentation (англ.). Процитовано 11 листопада 2026.
  2. 1 2 3 4 5 6 7 8 9 10 11 12 ext4(5) — Linux manual page. Linux man-pages (англ.). Процитовано 11 листопада 2026.
  3. 1 2 3 3.6. Journal (jbd2). The Linux Kernel documentation (англ.). Процитовано 11 листопада 2026.
  4. ↑ Kernel release status. LWN.net (англ.). 11 жовтня 2006. Процитовано 11 листопада 2026.
  5. ↑ Linus Torvalds (13 жовтня 2006). Linux 2.6.19-rc2. LWN.net (англ.). Процитовано 11 листопада 2026.
  6. ↑ Kernel release status. LWN.net (англ.). 24 грудня 2008. Процитовано 11 листопада 2026.
  7. 1 2 2. High Level Design. The Linux Kernel documentation (англ.). Процитовано 11 листопада 2026.
  8. 1 2 3 4.1. Index Nodes. The Linux Kernel documentation (англ.). Процитовано 11 листопада 2026.
  9. ↑ 4.2. The Contents of inode.i_block. The Linux Kernel documentation (англ.). Процитовано 11 листопада 2026.
  10. ↑ e4defrag(8) — Linux manual page. Linux man-pages (англ.). Процитовано 11 листопада 2026.
  11. 1 2 4.3. Directory Entries. The Linux Kernel documentation (англ.). Процитовано 11 листопада 2026.
  12. ↑ 2.5. Checksums. The Linux Kernel documentation (англ.). Процитовано 11 листопада 2026.
  13. 1 2 2.1. Blocks. The Linux Kernel documentation (англ.). Процитовано 11 листопада 2026.
  14. ↑ 2.9. Verity files. The Linux Kernel documentation (англ.). Процитовано 11 листопада 2026.
  15. ↑ e2fsck(8) — Linux manual page. Linux man-pages (англ.). Процитовано 11 листопада 2026.

Посилання

[ред. | ред. код]
  • ext4 General Information — документація ядра Linux (англ.).
  • ext4 Data Structures and Algorithms — опис структур даних ext4 (англ.).
  • ext4(5) — довідка про можливості й параметри файлової системи (англ.).