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

Завдяки такому підходу, додавання підтримки нової файлової системи не вимагатиме вносити відповідних змін в ядро ОС.
Віртуальна файлова система (скор. “VFS” від англ. “Virtual File System”) — це спеціальний шар абстракції, який надає програмний інтерфейс (єдиний набір команд) для взаємодії між ядром та конкретною реалізацією файлової системи.
Ядро Linux підтримує різні типи файлових систем (ext3, ext4, ReiserFS, Btrfs, XFS та багато інших). На даний момент найвикористовуванішою файловою системою є ext4, тому в цій статті ми детально оглянемо саме її.
Примітка: У Linux практично всі об’єкти представлені у вигляді файлів (наприклад, каталоги, принтери, розділи диска, пристрої тощо). Це робить ще важливішим вивчення того, як працює файлова система Linux.
Еволюція файлової системи ext в Linux

Файлова система Minix
Файлова система Minix — це перша файлова система, що є прообразом сучасних файлових систем в Linux, яка була представлена в 1987 Ендрю С. Таненбаумом у складі однойменної ОС Minix.
Операційна система Minix та її файлова система використовувалися у вигляді наочного посібника для студентів, які вивчали основи будови ОС (одним із таких студентів був Лінус Торвальдс). Через те, що Minix була, перш за все, навчальною системою, її файлова система мала безліч недоліків: продуктивність залишала бажати кращого; довжина імені файлу була обмежена 14 символами, а розмір розділів — 64 МБ. Для порівняння, жорсткі диски на той час мали розмір аж до 140 МБ.
Файлова система ext
ext або extfs (скор. від англ. “Extended File System”) — це перша файлова система, призначена спеціально для Linux, яка була представлена у квітні 1992 року. Використовувана структура метаданих була розроблена Ремі Кардом, на створення якої його надихнула Unix File System. Максимальна довжина імені файлу складала 255 символів, а розмір розділу — до 2 ГБ.
Хоча ext і вдалося розв’язати проблеми, що були у файловій системі Minix, у неї був один серйозний недолік — мітки часу. Зараз, коли кожен файл у Linux має три мітки часу (доступ до файлу, зміна вмісту файлу, зміна властивостей та метаданих файлів (наприклад, дозволів)), файлова система ext підтримувала лише одну мітку часу.
Файлова система ext2
У січні 1993 року, менш ніж через рік після виходу ext, Ремі Кард розробляє нову файлову систему — ext2.
У ext2 були розширені функціональні можливості ext:
збільшена продуктивність файлової системи;
дані файлів зберігалися в блоках даних однакової довжини;
підтримувався максимальний розмір файлу до 2 тебібайт;
довжина імені файлу була обмежено 255 байтами (а не кількістю символів, як раніше).
Швидкість роботи ext2 пояснювалася тим, що система не підтримувала механізм ведення логів. З одного боку, даний аспект можна віднести до переваги ext2, оскільки при роботі з обмеженими ресурсами використання накопичувачів (наприклад, SSD-дисками або USB-пристроями), відсутні надлишкові цикли перезапису даних, відповідно, ресурс накопичувача витрачається повільніше. З іншого боку, відсутність системи ведення логів у ext2 часто призводила до двох дуже неприємних проблем:
Пошкодження файлів, якщо в момент запису даних на диск вимикалося живлення або виникав збій системи.
Втрата продуктивності через фрагментацію даних: відбувається, коли один файл розбивається на частини (фрагментується) і розподіляється по декількох місцях на диску. В результаті читання та запис файлів займають більше часу, що призводить до зниження продуктивності файлової системи.
Система ext2 використовувалася здебільшого до початку 2000-х років, коли було представлено файлову систему ext3.
Файлова система ext3
У листопаді 2001 року, завдяки зусиллям програміста Стівена Твіді, разом із релізом ядра Linux 2.4.15 побачила світ і нова файлова система — ext3.
Файлова система ext3 — це покращена версія файлової системи ext2, у якій з’явилася можливість ведення логів. Вона, як і ext2, підтримує файли розміром 2 тебібайти, а імена файлів обмежені 255 байтами.
Завдяки логам система зберігає в спеціальному лог-файлі (або “журналі“) всю інформацію про зміни в даних, які ще потрібно внести. У разі втрати живлення або збою системи інформація про файли, яка зберігається в логах, може бути відновлена протягом декількох секунд, завдяки чому знижується ризик пошкодження або втрати даних.
Ядро Linux підтримує три рівні ведення логів:
Journal — складається із запису метаданих та вмісту файлів у лог-файл до внесення змін до основної файлової системи, тим самим забезпечуючи повне логування даних. Якщо трапиться якась аварійна ситуація, можна перечитати лог-файл і відновити втрачену інформацію. Недоліком цього рівня ведення логів є зниження продуктивності системи.
Ordered — процес збереження даних виконується в певному порядку: спочатку в лог-файл записуються метадані, потім вміст файлу записується в основну файлову систему і вже тоді метадані з’єднуються з основною файловою системою. У разі збою основна файлова система не буде пошкоджена; ризику пошкодження зазнають лише ті файли, які під час збою записувалися.
Writeback — рівень ведення лог-файлу, у якому до нього заносяться лише метадані, а вміст файлу записується в основну файлову систему. Через відсутність синхронізації метаданих та вмісту файлів, у разі збою системи вони, швидше за все, виявляться пошкодженими.
Файлова система ext4
Файлова система ext4 була представлена у жовтні 2008 року разом із ядром Linux 2.6.28. Вона підтримує максимальний розмір файлу в 16 тебібайт та обмежує максимальну довжину імені файлу 255 байтами.
Особливості файлової системи ext4
Зворотна сумісність. Файлова система ext4 підтримує зворотну сумісність із файловими системами ext3 та ext2. Додатковою функцією є автоматичне монтування файлової системи ext3 у режимі ext3 за допомогою драйвера ext4.
Поліпшення розподілу. Файлова система ext4 ефективніше розподіляє блоки даних перед записом на диск. Це підвищує продуктивність як читання, так і запису.
Розширення діапазону міток часу. Файлова система ext4 додає ще 408 років до діапазону значень міток часу та підтримує дати аж до 10 травня 2446 року. Також покращилася точність міток часу — тепер вони вимірюються в наносекундах.
Екстенти (Послідовні блоки). Застарілі версії файлової системи ext відстежують кожен блок, який пов’язаний зі зберіганням даних файлу (зазначений підхід називається методом “непрямого зіставлення”). Але цей процес перестає бути ефективним, коли йдеться про великі файли, що вимагають великої кількості блоків. Екстенти розв’язали цю проблему: з їх допомогою зменшується обсяг метаданих, необхідних для зіставлення блоків кожного файлу. Система зберігає адресу лише першого та останнього блоку деякого досить великого файлу, повідомляючи таким чином, що дані знаходяться у наступних n блоках. Завдяки цьому файл, наприклад, розміром 500 МБ, може зберігатися в єдиному екстенті відповідного розміру, а не бути розбитим на 128 000 4-кілобайтних блоків, як при непрямому зіставленні.
Багатоблоковий розподіл. Особливий механізм розподілу блоків шукає вільні блоки, які можна використовувати для запису даних на диск. Файлова система ext4 використовує багатоблоковий розподіл, що дозволяє розподіляти декілька блоків одним викликом. Це зменшує фрагментацію диска.
Відкладений розподіл. Функція відкладеного розподілу виділяє блоки лише під час запису файлу на диск. Завдяки цій функції кеш-пам’ять не заповнюється непотрібними даними, а продуктивність системи підвищується.
Необмежена кількість підкаталогів. Ядро Linux версії 2.6.23 підтримує необмежену кількість підкаталогів. Файлова система ext4 запровадила деревоподібну структуру даних HTree, щоб уникнути зниження продуктивності. HTree є спеціалізованою версією B-дерева.
Підрахунок контрольних сум. Файлова система ext4 використовує підрахунок контрольної суми файлів. Цей механізм було введено для зниження ризику пошкодження файлів. Система ведення логів є найбільш використовуваною частиною диска. Коли відбувається збій обладнання, блоки стають непридатними для використання і відбувається пошкодження файлів. Використовуючи підрахунок контрольної суми, система постійно перевіряє, чи не пошкоджено блок. Цей процес також підвищує продуктивність, оскільки скорочує час роботи з лог-файлом.
Швидка перевірка файлової системи. Файлова система ext4 помічає нерозподілені групи блоків. Час, необхідний для виконання команди перевірки диска fsck, значно скорочується, оскільки зазначені групи пропускаються. Це підвищує загальну продуктивність.
Онлайн-дефрагментація. Фрагментація диска призводить до зниження продуктивності файлової системи, що було серйозною проблемою для ext2 та ext3. Файлова система ext4 підтримує утиліту e4defrag, яка дозволяє користувачам дефрагментувати окремі файли або всю файлову систему.
Обмеження файлової системи ext4
Хоча файлова система ext4 вважається найкращою файловою системою для дистрибутивів Linux, є кілька обмежень, які слід враховувати у подальшій роботі:
Відновлення пошкоджених даних. Файлова система ext4 не може виявити або відновити пошкоджені дані, які вже записані на диск.
Максимальний розмір тому дорівнює 1 ексбібайт. Однак файлова система не може обробляти понад 100 тебібайт даних без значної втрати продуктивності та збільшення фрагментації диска.
Альтернативні файлові системи
Існує кілька альтернативних файлових систем, що підтримуються ядром Linux.
XFS
XFS — це 64-розрядна файлова система, яка вперше була представлена в 1994 році та вбудована в ядро Linux з 2001 року. XFS підтримує максимальний розмір файлу в 8 ексбібайт і обмежує довжину імені файлу 255 байтами. Вона підтримує ведення логів і, як і ext4, зберігає зміни у лог-файлі до того, як вони будуть зафіксовані в основній файловій системі. Це знижує ймовірність пошкодження файлів. Дані структуровані в форматі B+-дерево забезпечують ефективний розподіл простору та підвищення продуктивності.
Основним недоліком цієї системи є складний процес зміни розміру наявної файлової системи XFS.
OpenZFS
OpenZFS — це платформа, яка поєднує функціонал традиційних файлових систем та диспетчера томів. Вперше була представлена у 2013 році. OpenZFS підтримує максимальний розмір файлу 16 ексбібайт і обмежує максимальну довжину імені файлу 255 символами. Як особливості цієї системи можна виділити захист від пошкодження даних, шифрування даних, підтримку накопичувачів збільшеного обсягу, копіювання при записі та RAID-Z.
Основним недоліком OpenZFS є юридична несумісність між ліцензіями CDDL (OpenZFS) та GPL (ядро Linux). Ця проблема вирішується шляхом компіляції та завантаження коду ZFS в ядро Linux.
Btrfs
Btrfs (скор. від англ. “B–tree file system”) — це файлова система, яка була розроблена компанією Oracle і випущена разом із ядром Linux 2.6.29 у 2009 році. Btrfs підтримує максимальний розмір файлу в 16 ексбібайт і обмежує максимальну довжину імені файлу 255 символами.
Деякі особливості Btrfs включають:
онлайн-дефрагментація;
додавання та видалення блокових пристроїв у режимі онлайн;
підтримка RAID;
стиснення, що налаштовується для кожного файлу або тому;
клонування файлів;
контрольні суми та можливість створення файлів та розділів підкачки.
JFS
JFS (скор. від англ. “Journaled File System”) — це файлова система, розроблена компанією IBM для AIX Unix в 1990 році. Вона є альтернативою файловій системі ext. Вона також може бути використана замість ext4 там, де потрібна стабільність при невеликій кількості витрачених ресурсів.
ReiserFS
ReiserFS — це альтернатива файловій системі ext3, яка має покращену продуктивність та розширений функціонал. Раніше ReiserFS використовувалася як файлова система за замовчуванням в SUSE Linux. ReiserFS підтримує динамічну зміну розмірів файлової системи. До недоліків можна віднести відносно низьку продуктивність.
Примітка: Такі файлові системи, як NTFS, FAT та HFS можуть використовуватися в Linux, але коренева файлова система Linux на них не встановлюється, оскільки вони не призначені для цього. Swap — це файл підкачки, який є джерелом додаткової пам’яті в тих випадках, коли для виконання програми потрібно більше оперативної пам’яті, ніж є в наявності комп’ютера, — це не є окремою файловою системою.
Як дізнатися, яка в мене файлова система?
Спосіб №1: Використання команди df
Команда df виводить інформацію про використання дискового простору файлової системи. Для вказівки того, що потрібно вивести тип файлової системи, використовуйте наступну команду:
$ df -Th
або
$ df -Th | grep "^/dev"

Як бачите, у мене використовується файлова система ext4 (див. розділ /dev/sda1).
Примітка: Імена дисків у Linux розташовані в алфавітному порядку. /dev/sda — це перший жорсткий диск (основний), /dev/sdb — другий і т.д. Цифри належать до розділів, тому /dev/sda1 — це перший розділ першого диска.
Спосіб №2: Використання команди fsck
Команда fsck застосовується для перевірки та, при необхідності, відновлення файлових систем Linux. При цьому вона також може виводити тип файлової системи на вказаних розділах диска, наприклад:
# fsck -N /dev/sda1
Спосіб №3: Використання команди lsblk
Команда lsblk виводить інформацію про блокові пристрої. Додавши опцію -f, ми також отримаємо інформацію про тип файлової системи:
$ lsblk –f
Спосіб №4: Використання команди mount
Команда mount використовується для монтування файлової системи у Linux. Її також можна використовувати для монтування ISO-образу, віддаленої файлової системи Linux та багато іншого. Щоб дізнатися тип файлової системи, використовуйте наступну комбінацію:
$ mount | grep "^/dev"



