Що таке фрагментація у файловій системі і чому вона виникає?
Перш ніж зосередитися на фрагментації у файловій системі, варто познайомитися з поняттям файлової системи. Мова йде про технологію керування даними в кожній окремій секції носія (жорсткого диска, SSD, USB-накопичувача тощо), яка називається розділом. Файлова система створюється на носії в процесі його форматування та приносить з собою методи та структури, які використовуються для контролю над тим, як і де буде зберігатися кожна частина даних. Завдяки цій системі дані зберігаються впорядковано, а не у вигляді безперервного потоку байтів. Крім того, файлова система веде облікові записи, які дозволяють миттєво отримати файли, коли їх запитує ОС. А коли операційній системі потрібно видалити певні дані зі сховища, файлова система надає їй механізм для виконання цієї операції.
Різні платформи ОС зазвичай покладаються на різні типи файлових систем. Найбільш поширені: FAT/FAT32, exFAT, NTFS та ReFS у Windows, APFS та HFS+ у macOS, Ext4, XFS, Btrfs, F2FS у Linux і UFS та ZFS у BSD, Solaris, Unix. Хоча всі вони, по суті, виконують однакові функції, їх дизайн і стратегії розміщення даних можуть сильно відрізнятися.
Фрагментація — це стан, який виникає, коли певна файлова система не має змоги підготувати безперервну область у сховищі для збереження всього файлу в одному місці. Як наслідок, файл розбивається на частини, які зберігаються у розрізнених місцях на диску. Ці окремі частини файлу називаються фрагментами, а файли, фрагменти яких розташовані не поруч один з одним, вважаються фрагментованими. Щоб дістатися до кожного фрагменту у правильному порядку й, таким чином, прочитати такий файл, кожна файлова система використовує спеціальну службову інформацію (метадані), яка, серед іншого, містить покажчики на ці пов'язані між собою фрагменти.
В ідеалі фрагменти, що складають один файл, повинні розташовуватися якомога ближче один до одного. Зазвичай це не проблема з абсолютно новим накопичувачем, який має багато вільного місця. Проте з часом, у міру того як файли створюються, змінюються та видаляються, між ними з’являються прогалини, які потрібно заповнити новими даними. Коли вхідні файли невеликі, вони можуть легко поміститися в наявні вільні прогалини. Але частіше за все вони набагато більші за найбільший наявний вільний проміжок. До того ж, з часом файл нерідко збільшується у розмірі, але може статися, що поруч із ним не буде вільних прогалин. Щоб записувати дані без затримки, файлова система схильна розміщати їх там, де вона може знайти для них місце тут і зараз, так що фрагменти одного файлу можуть бути розкидані по всьому сховищу.
Загалом фрагментація більш характерна для файлових систем попереднього покоління, як-от FAT/FAT32 від Microsoft. Сучасні файлові системи в основному намагаються звести її до мінімуму, застосовуючи різні прийоми:
-
Розподіл на основі екстентів
Файли зберігаються в суміжних областях, які називаються екстентами. Екстент представлений як адреса початку цієї області та її довжина. Коли це можливо, алгоритм обирає один екстент, який може забезпечити простір, необхідний для розміщення всього вмісту файлу, або принаймні намагається використати мінімальну кількість екстентів для його розташування. До файлових систем на основі екстентів належать NTFS, APFS, HFS+, Ext4, XFS та Btrfs.
-
Відкладене розміщення
Вміст файлу, який потрібно записати, зберігається у кеші в оперативній пам'яті, тоді як фактична операція запису відкладається якомога довше. Коли системі відомий остаточний розмір файлу, є набагато більше шансів, що врешті-решт вона обере екстент достатнього розміру, так що незабаром інші екстенти не знадобляться. Крім того, у цьому разі тимчасові файли навіть не потрібно записувати, так щоб їх можна було видалити безпосередньо з кешу пам'яті. Відкладене розміщення використовують багато сучасних файлових систем, включаючи Ext4, XFS, Btrfs, ZFS і HFS+.
-
Дефрагментація на ходу
Деякі файлові системи здатні виявляти фрагментовані файли за певними критеріями та автоматично переміщувати їхні фрагменти, щоб вони знову стали суміжними. Такі алгоритми використовуються, наприклад, у APFS, HFS+, Ext4 і Btrfs.
Незважаючи на це, фрагментацію не можна вважати остаточно вирішеною проблемою навіть у сучасних файлових системах. Вони все ще можуть страждати від неї, особливо в таких випадках:
-
HDD або SSD малої ємності, що використовуються як системні диски;
-
велика кількість маленьких розділів на диску;
-
брак вільного місця у сховищі (використано понад 85%-95% всієї ємності);
-
файли великого розміру, що часто редагуються, особливо, коли при цьому ще й бракує місця у сховищі;
-
видалення та запис нових файлів різного розміру при майже повністю заповненому сховищі.
Які негативні наслідки фрагментації?
З плином часу і активним використанням файлової системи файли, що зберігаються в ній, можуть бути розділені на сотні або навіть тисячі фрагментів, розкиданих по всьому диску. Такий стан може серйозно вплинути на продуктивність, залежно від типу цифрового носія. Механічні жорсткі диски зберігають інформацію на дисках, що обертаються. Щоб прочитати запитуваний файл, пристрій має переміщати голівку для читання та запису над поверхнею диску доки не знайде кожний його фрагмент. Коли фрагменти розташовані в абсолютно різних місцях, потрібно набагато більше часу, щоб дістатися до них і прочитати файл, ніж якщо б це була велика безперервна послідовність фрагментів. Це також призводить до того, що обертові компоненти приводу використовуються набагато активніше, що, у свою чергу, скорочує термін служби пристрою. На відміну від них, твердотільні накопичувачі не мають механічних частин, тож їх продуктивність не знижується через фрагментацію.
Крім того, фрагментація може погіршити ситуацію, коли стається втрата даних і файли потрібно відновити. По-перше, ймовірність того, що фрагментований файл втратить свою цілісність через часткове перезаписування іншими даними, значно вища. До того ж, у деяких випадках вміст файлу може все ще бути присутнім у сховищі, але не підлягатиме відновленню через значну фрагментацію. Нижче у статті ця проблема розглядається більш детально.
Фрагментація в контексті відновлення даних
Для правильного відновлення фрагментованого файлу необхідно не тільки визначити розташування його початку, а й знайти всі його фрагменти та розташувати їх у правильному порядку. Файлова система зазвичай покладається на свої метадані для відстеження такого роду відповідності. Коли службові записи все ще доступні у системі, їх зазвичай можна проаналізувати та виявити, які фрагменти належать яким файлам. Отже, якщо файл не було перезаписано, його легко відновити, незалежно від того, наскільки він фрагментований.
Але все стає набагато гірше, коли такі файли потрібно відновити без допомоги метаданих. Останні можуть пошкодитись через певну логічну помилку або під час операції форматування. На додаток до цього, певні файлові системи, наприклад FAT/FAT32, стирають частину метаданих файлу після його видалення. У цьому випадку програма з відновлення даних може знайти початок файлу, застосувавши знання про його структуру. Вона шукатиме певні шаблони, відомі як підписи, у необробленому вмісті диска. Однак визначити, де починається його наступний фрагмент, може бути надзвичайно важко або навіть неможливо, зокрема, коли файл розділено на багато фрагментів, розташованих на великій відстані один від одного.
Фрагментація є серйозною проблемою для відновлення даних. Навіть найдосконаліші алгоритми не можуть забезпечити 100% результат при роботі з сильно фрагментованими даними за відсутності придатних для використання записів файлової системи. І, на жаль, ступінь фрагментації найцінніших типів файлів – зображень, відео, офісних документів, баз даних, електронних листів тощо – загалом досить високий. Так, у файловій системі FAT/FAT32, яка часто використовується на портативних носіях, таких як USB-накопичувачі та карти пам'яті, фрагментуються близько 15% зображень і 50% відеофайлів. З огляду на це, важливо вживати запобіжних заходів проти фрагментації, щоб уникнути остаточної втрати даних у разі будь-яких логічних помилок. Наразі найбільш схильні до неї файлові системи можна дефрагментувати за допомогою спеціальних інструментів, вбудованих у Windows, або сторонніх утиліт, які також розроблені для Linux і macOS.