The file systems of Linux

basic concepts of varios file systems of Linux

На відміну від Windows і macOS, які знаходяться під суворим контролем корпорацій Microsoft і Apple відповідно, Linux є великим проектом з відкритим кодом, розробленим спільнотою ентузіастів. Код цієї ОС відкритий для будь-кого, хто хоче зробити свій внесок у її розробку, і будь-хто може вільно налаштувати її відповідно до власних потреб або створити свій дистрибутив на її основі. Ось чому існує стільки варіантів ОС Linux, і те саме стосується її файлових систем, які є фундаментальною частиною будь-якої операційної системи, як вже було зазначено в статті про основи файлової системи. Ядро Linux підтримує безліч файлових систем, але найбільш часто використовуваними є ФС сімейства Ext, XFS, Btrfs, F2FS, JFS і ReiserFS. Нижче ви можете знайти короткий опис кожної з її основними особливостями.

Зверніть увагу: Linux також надає підтримку читання та запису для файлових систем інших платформ, як-от NTFS, FAT32 і exFAT під Windows від Microsoft, HFS+ під macOS і ZFS під BSD, Solaris, Unix, про які йдеться у відповідних статтях.

Зміст:

Ext

Ext (з англ. Extended File System, Розширена файлова система) – перша ФС, розроблена спеціально для Linux та випущена у 1992 році. Однак вона мала серйозні обмеження у продуктивності та була швидко замінена на Ext2. Ця файлова система та її пізніші версії – Ext3 і Ext4 – стали опціями за замовчуванням для переважної більшості дистрибутивів Linux.

Ext2 виявилась більш ефективною завдяки своїй структурі, що базується на індексних дескрипторах (inodes чи інодах). Кожен такий дескриптор зберігає атрибути певного об'єкта, наприклад, файлу чи каталогу, і вказує на розташування його даних. У Ext2 простір для зберігання поділено на блоки, які, у свою чергу, утворюють більші одиниці, Групи блоків (Block Groups). Інформація про всі Групи блоків зберігається у Таблиці дескрипторів (Descriptor Table), що розташовується одразу після Суперблоку (Superblock). Кожна Група блоків зберігає індексні дескриптори у власній Таблиці індексних дескрипторів (Inode Table). А також відстежує стан власних блоків і індексних дескрипторів за допомогою бітових мап блоків та індексних дескрипторів (Block Bitmap та Inode Bitmap). У той же час ім'я файлу чи каталогу не міститься у його індексному дескрипторі – імена пов'язуються з відповідними номерами індексних дескрипторів через каталоги, реалізовані як особливий тип файлів.

Більшість файлових систем Linux подібні між собою у тому, що в них ім'я розглядається не як атрибут, а скоріше як псевдонім (alias) файлу в певному каталозі. Файловий об'єкт може мати посилання з багатьох місць і існувати під різними іменами (так звані жорсткі посилання). Це може викликати серйозні і навіть непереборні труднощі у відновленні імен файлів після видалення або логічного пошкодження.

Ext3 фактично є оновленою версією Ext2, яка підтримує журналювання. Журнал у Ext3 – це спеціальний файл (лог), до якого записуються всі зміни у файловій системі та який захищає останню від пошкодження у разі збою.

Ext4 є вдосконаленою версією Ext3, у якій змінився метод розподілу даних: з окремих блоків на екстенти. Головна ідея полягає в тому, щоб записати більшу частину даних файлу в безперервну область для зберігання, а потім занотувати лише адресу першого блоку та загальну кількість блоків у безперервній послідовності. Безпосередньо в індексному дескрипторі можуть зберігатися до чотирьох екстентів, тоді як решта впорядковуються як B+-дерево. Крім того, Ext4 відкладає операцію, доки дані не будуть насправді розміщені на диску, і у такий спосіб здатна мінімізувати фрагментацію.

В цілому вона вважається однією з найбільш гнучких ФС загального призначення, яка заслужила гарну репутацію завдяки своїй стабільності.

XFS

XFS (з англ. Extended File System, Розширена файлова система) — ще одна дуже зріла файлова система, яка була створена Silicon Graphics і спочатку застосовувалась на серверах IRIX компанії. У 2001 році вона потрапила до ядра Linux і зараз підтримується більшістю дистрибутивів цієї ОС, деякі з яких, наприклад Red Hat Enterprise Linux, навіть використовують її за замовчуванням.

Цей тип ФС оптимізований для зберігання дуже великих файлів і томів на одному хості. У ній простір для зберігання розділений на області однакового розміру, які називаються Групами розподілу (Allocation Groups). Кожна з груп діє як окрема файлова система, тобто має власний Суперблок (Superblock), керує власними структурами і стежить за використанням простору для зберігання. Для контролю над останнім застосовуються B+-дерева, одне з яких фіксує перший блок в безперервній області вільного простору, а інше – кількість блоків, з яких він складається. Блоки для файлів виділяються за тим самим підходом на основі екстентів. Усі файли та каталоги в XFS представлені індивідуальними індексними дескрипторами (inodes чи інодами). Розподіл екстентів може зберігатися безпосередньо в індексному дескрипторі або відстежуватися за допомогою пов'язаного з ним B+-дерева, у разі дуже великого або фрагментованого файлу. І так само, як індексні дескриптори у Ext, ці не містять імен, які, натомість, доступні лише у відповідних записах каталогу.

XFS застосовує журналювання до будь-яких оновлень метаданих. Усі зміни спочатку записуються до журналу, перш ніж блоки будуть фактично змінені, що дозволяє миттєво відновити їх у разі будь-яких несправностей. Загалом цей тип ФС вирізняється високою масштабованістю та дуже добре працює на серверному обладнанні.

Btrfs

Btrfs (з англ. B-tree File System, Файлова система на основі B-дерев) є одним із найпопулярніших форматів нового покоління для Linux і наразі докладається багато зусиль, щоб зробити його стабільним. Ця ФС була розроблена Oracle і підтримується основним ядром Linux з 2009 року. Fedora і SUSE вже використовують її за замовчуванням.

Btrfs може бути застосована до широкого діапазону пристроїв, від смартфонів до серверів високого класу. Крім того, вона включає функції диспетчера логічних томів, здатна охоплювати декілька сховищ та пропонує незліченну кількість інших просунутих можливостей.

Як випливає з назви, Btrfs значною мірою покладається на B-дерева, кожне з яких складається з внутрішніх вузлів і листів. Внутрішній вузол вказує на дочірній вузол або на лист, тоді як лист містить елемент із певною інформацією. Фактичний дизайн і вміст елемента залежать від типу даного B-дерева. Кореневе B-дерево (Root B-tree), місцерозташування якого доступне в Суперблоці (Superblock), має посилання на решту B-дерев. B-дерево фрагментів (Chunk B-tree) керує зіставленням логічної адреси з фізичною, тоді як B-дерево пристроїв (Device B-tree), навпаки, пов'язує фізичні блоки пристроїв з їхніми віртуальними адресами. B-дерево файлової системи (File System B-tree) відповідає за розміщення файлів і папок. Невеликі файли зберігаються прямо у ньому, у внутрішніх елементах-екстентах. А більші за розміром розміщуються зовні в суміжних областях, які називаються екстентами. У такому випадку елемент-екстент має посилання на всі екстенти, у яких містяться дані файлу. Елементи-каталоги містять імена файлів і вказують на їхні індексні дескриптори. Індексні дескриптори, у свою чергу, використовуються для зберігання інших властивостей, таких як розмір, дозволи тощо.

Btrfs — це файлова система на основі Копіювання при записуванні (Copy-on-Write (CoW)). Замість того, щоб використовувати журналювання, вона робить копії з блоків перед тим, як змінити їх, а потім записує ці дані до іншого вільного місця. Цей механізм допомагає усунути ризик пошкодження даних у разі, якщо оновлення перерветься, наприклад, через втрату живлення. Завдяки цій та низці інших привабливих функцій Btrfs знаходить все більше прихильників серед сучасних користувачів Linux.

F2FS

F2FS (з англ. Flash-Friendly File System, Файлова система адаптована до пристроїв на основі флеш-пам'яті) — ще один сучасний формат, представлений компанією Samsung Electronics у 2012 році. Ця ФС була розроблена спеціально для пристроїв на основі флеш-пам’яті NAND і, отже, найбільш широко використовується в сучасних смартфонах і на портативних накопичувачах.

F2FS працює на основі підходу лог-структурованої файлової системи (англ. log-structured FS чи LFS) і враховує такі особливості флеш-пам'яті, як постійний час доступу та обмежену кількість циклів перезапису даних. Замість того, щоб створювати один великий фрагмент для запису, F2FS збирає блоки (до 6) в окремі фрагменти, які записуються одночасно.

Він розбиває простір для зберігання на сегменти фіксованого розміру. Послідовні сегменти складають секцію, а кілька секцій утворюють зону. Розподіл даних у них здійснюється за допомогою вузлів. Останні бувають трьох типів: прямі, непрямі та індексні дескриптори (inodes). Індексний дескриптор зберігає метадані, включаючи ім'я, розмір та інші властивості файлу; прямий вузол вказує на розташування його блоків даних, тоді як непрямий вказує на блоки в інших вузлах. Фізичні адреси цих вузлів можна знайти в Таблиці адрес вузлів (Node Address Table чи NIT). Сам вміст зберігається в основній області (Main Area). Секції в ній відокремлюють блоки даних від блоків вузлів зі службовою інформацією. Статус використання всіх блоків можна знайти у Таблиці інформації про сегмент (Segment Information Table або SIT). Область зведення сегментів (Segment Summary Area чи SSA) визначає, які блоки виділені якому вузлу.

Коли вільні сегменти закінчуються, F2FS самостійно очищає себе у фоновому режимі, коли система неактивна. Алгоритм очищення обирає сегменти-жертви за кількістю використаних блоків відповідно до таблиці SIT або за їх "віком".

Така організація даних дозволяє F2FS досить добре працювати на твердотільному накопичувачі. Тим не менш, досі вона застосовувалася в основному на портативних пристроях та її рідко можна зустріти на настільних і серверних комп'ютерах.

JFS

JFS (з англ. Journaled File System, Журнальована файлова система) була створена IBM у 1990 році. Оригінальна версія, яку ще іноді називають JFS1, була застосована в ОС AIX згаданої компанії. Пізніше, після того, як вона стала ФС з відкритим кодом, JFS2 була перенесена на Linux.

Том JFS складається з областей, які називаються Групами розподілу (Allocation Groups), і кожна з яких містить один або кілька наборів файлів (FileSets). Усі файли та каталоги описуються індивідуальними індексними дескрипторами (inode), тоді як сам вміст представлено одним або кількома екстентами. Усі екстенти проіндексовані у спеціальному B+-дереві. Вміст невеликих каталогів зберігається в їхніх індексних дескрипторах, тоді як більші за розміром організовані як B+-дерева. B+-дерева також контролюють використання простору для зберігання: перше дерево зберігає початкові блоки вільних екстентів, а друге – кількість вільних екстентів. JFS також має окрему область журналу (log area) і робить у ній відповідний запис щоразу, коли відбувається якась зміна метаданих.

Загалом JFS вважається швидкою та надійною файловою системою. Однак вона майже не вдосконалюється і зараз поступово виходить з ужитку, програючи більш сучасними варіантами.

ReiserFS

ReiserFS — альтернативний формат Linux, оптимізований для зберігання великої кількості невеликих файлів. Він був розроблений компанією Namesys у 2001 році та приніс із собою низку нових функцій, які були дуже інноваційними на момент його появи. Але згодом через певні технічні проблеми обслуговування цієї ФС передали волонтерам.

В основі ReiserFS лежить S+-дерево, яке складається з внутрішніх і листових вузлів. Ця структура використовується для керування всіма файлами, каталогами та метаданими. Дерево містить елементи чотирьох основних типів: прямі, непрямі, елементи каталогу та елементи статистики. Прямі елементи містять фактичні дані, непрямі лише посилаються на певні блоки даних, елементи каталогу представляють записи в каталозі, а елементи статистики містять властивості файлів і папок. Кожен елемент має свій унікальний ключ, який використовується для визначення його місцезнаходження у дереві. Цей ключ містить ідентифікатор елемента, його адресу та тип.

Файли та фрагменти файлів, які не займають весь блок, об'єднуються та зберігаються безпосередньо в листових вузлах S+-дерева. Цей механізм називається tail-packing ("пакування хвостів") і допомагає зекономити простір та зменшити фрагментацію. Крім того, ReiserFS не вносить жодних змін безпосередньо до S+-дерева, а, натомість, спочатку записує їх у журнал, а потім копіює до потрібного місця на сховищі.

ReiserFS має гарні можливості пошуку та дозволяє компактно розміщувати невеликі файли. Однак цей формат більше не має активної підтримки, і навряд чи збереже актуальність у найближчий час.

Підказка: Інформацію про можливість успішного відновлення даних із зазначених типів ФС можна знайти в статтях, що описують особливості відновлення даних із різних операційних систем та шанси на відновлення даних. Щоб зрозуміти, як виконувати цю процедуру, скористайтеся посібником з відновлення даних у Linux.

Якщо ви хочете дізнатися про файлові системи, які використовуються в інших середовищах, будь ласка, прочитайте наступні статті:

Останнє оновлення: 26 квітня 2023

Якщо вам сподобалася ця стаття, поділіться нею у соцмережах: