Файлові системи Linux. Btrfs.

  1. Економія місця на накопичувачі.
  2. Страховка від невдалих оновлень.
  3. Одна ФС на скільки завгодно накопичувачів.

На початку XXI століття сучасної файлової системи вже недостатньо лише швидко працювати з файлами і захищати їх від пошкоджень. ZFS показала нам всю міць технології Copy-on-Write (CoW, копіювання-прі-записи) в задачах збереження даних. Для Linux була створена Btrfs - нова стандартна ФС, побудована на технології CoW.

Судячи з того, що Apple активно доробляє свою APFS, яка також використовує CoW, набір можливостей ZFS / Btrfs дійсно дає новий рівень комфорту для користувача. Щоб відчути його, досить спробувати Btrfs самим.

Ви створюєте файл, всередині якого - рядок «Дівчинка Таня у клітини ходила». Зберігаєте його на звичайну ФС, наприклад, на Ext4 або NTFS. Тепер, якщо ви відкриєте файл і додасте в нього другий рядок «Знову не треба годувати крокодила», файлова система при збереженні повністю перезапише колишню версію файлу. Тобто, тієї версії файлу, де в ньому тільки один рядок, більше не існує.

Тепер виконаємо те ж саме на Btrfs. Створення файлу з одним рядком проходить так само, але коли ви додаєте в файл другий рядок і зберігаєте, проявляється той самий копіювання-прі-записи. Попередня версія файлу також не буде перезаписано, він залишається незайманою, а рядок «Знову не треба годувати крокодила» дописується в вільне місце ФС.

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

Установник Ubuntu давно підтримує Btrfs, так що ніяких проблем з цим немає:

Btrfs оперує томами або subvolumes - це як би розділи всередині файлової системи. «Як би» - тому що томи більше схожі на каталоги, ніж на розділи. Але такий особливий каталог можна монтувати як розділ. Установник Ubuntu створює окремі томи для системи і для домашнього каталогу:

Так робиться тому, що набагато швидше і легше зберегти стан цілого томи, ніж стан кожного з тисяч файлів в цьому томі. Друга команда показує, що на Btrfs створені томи @ і @home, але побачити їх у файловому менеджері не вийде. Потрібно спочатку примонтировать корінь Btrfs (не плутати з коренем системи):

Економія місця на накопичувачі.

Для будь-якого томи можна включити прозоре стиснення по одному з двох алгоритмів: zlib і lzo. Перший краще стискає, зате другий на порядок швидше працює. Для системи зазвичай використовують lzo, а zlib має сенс на великих обсягах, які рідко читаються. Чи включається стиснення опцією монтування compress = lzo в файлі / etc / fstab:

Після перезавантаження стиснення буде активовано. Зверніть увагу, як монтується тому в зазначений каталог - через опцію subvol = нужний_том.

Страховка від невдалих оновлень.

Перед кожним апдейтом системи я роблю снапшот системного томи. Ось так це може виглядати в Ubuntu:

Так само можна зберігати і тому з домашнім каталогом, і взагалі будь-якої тому. Снапшот Btrfs за замовчуванням відкритий для запису, але можна створити снапшот тільки для читання:

sudo btrfs subvolume snapshot -r ісходний_том снапшот

Уявіть, що після поновлення ваша система працює з помилками або взагалі не завантажується. Тоді вам потрібно буде просто вказати в / etc / fstab останній снапшот як системного томи через опцію subvol = нужний_том. Це можна зробити за допомогою LiveCD.

Одна ФС на скільки завгодно накопичувачів.

Для віртуальної машини з Ubuntu я створив 1 віртуальний накопичувач. Уявімо, що на ньому закінчилося місце. В такому випадку я можу додати ще один віртуальний накопичувач в налаштуваннях Virtualbox, а потім додати його і до Btrfs:

Як бачите, Btrfs автоматично застосувала модель RAID1 - отзеркаліровала дані на доданий накопичувач, але рівні RAID можна міняти. Те ж саме можна робити і на реальній машині - додавати і видаляти накопичувачі без необхідності переразбівать їх і форматувати заново.

Як було сказано в попередній статті, технологія CoW призводить до високої фрагментації файлів - все зміни в них записуються шматочками в різні місця ФС. Саме тому Btrfs (а також ZFS) рекомендується використовувати на SSD, на яких фрагментація абсолютно не відчувається.

Btrfs - досить сучасна і просунута файлова система, вона підтримує SSD, що називається, «з коробки». У журналі ядра можна побачити такі рядки:

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

Але слід мати на увазі, що SSD-режим не включає в себе підтримку TRIM! Тому його потрібно або включати опцією монтування discard, або ж регулярно запускати програму fstrim. В Ubuntu є окремий юніт systemd для періодичної відпрацювання цієї програми, активувати його можна такою командою:

sudo systemctl enable fstrim.timer

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

За замовчуванням в дерево зберігаються файли розміром до 4 КБ, і ось тут криється небезпека. Через те, що розмір файлу заздалегідь невідомий, а діапазон розмірів широкий, дерево метаданих Btrfs сильно розростається, що негативно відбивається на швидкості роботи ФС.

Щоб уникнути цього, можна сильно обмежити максимальний розмір файлу, який буде упакований в дерево. Робиться це опцією монтування max_inline із зазначенням розміру файлу в байтах - звичайно, в файлі / etc / fstab:

Робиться це опцією монтування max_inline із зазначенням розміру файлу в байтах - звичайно, в файлі / etc / fstab:

Тепер в дерево будуть зберігатися тільки файли розміром до 256 байтів. Можна взагалі відключити упаковку, вказавши 0 після знака «дорівнює».

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

Одне з вигідних відмінностей Btrfs від ZFS - можливість повністю відключити Copy-on-Write. Це може бути зайвим на HDD, щоб знизити фрагментацію і підвищити швидкість. Але навіть на SSD великі файли, які часто перезаписувати, можуть через CoW сповільнювати роботу всієї файлової системи. До таких файлів можна віднести образи віртуальних машин і бази даних.

Відключити CoW можна на рівні томи, за допомогою опції монтування nodatacow:

Але цей варіант може не спрацювати через заплутану систему залежностей опцій монтування між томами. В цьому випадку можна відключити CoW на рівні атрибутів файлу, за допомогою команди:

chattr -R + C нужний_каталог

Здавалося б, ключ «+ C» повинен, по логіці, включати CoW, але немає, все навпаки. Щоб включити CoW, потрібно застосувати ту ж команду, але вже з ключем «-C».

Часто люди не розуміють, як правильно впізнавати кількість вільного і зайнятого місця на Btrfs. Справа в тому, що через снапшотов і стиснення звичайні утиліти «божеволіють» і показують неправильні дані. Тому потрібно використовувати утиліту btrfs:

Тому потрібно використовувати утиліту btrfs:

Її висновок теж не дуже зрозумілий, так що розберемо по рядках.

У першому рядку пишуться сукупні обсяги виділеного і зайнятого місця. Слово «single» означає, що Btrfs використовується на одиночному накопичувачі. «Total» показує, скільки місця доступно, причому воно може бути набагато менше загальної кількості місця на накопичувачі. Панікувати не варто, просто Btrfs виділяє місце порціями. Закінчиться одна порція - буде виділена ще одна. Ну, а «used» показує, скільки місця на файлової системі реально зайнято.

Другий рядок відображає, скільки місця зайнято під системний резерв. Щось подібне є і в Ext4.

Третій рядок цікавіше - в ній можна побачити, скільки займає те саме дерево метаданих. На скріншоті видно, що під дерево виділено 2 Гб, з яких зайняті близько 600 Мб. Ці показники враховуються в першому рядку.

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

Таким чином, щоб дізнатися, скільки місця реально зайнято на Btrfs, потрібно дивитися на показник «used» в першому рядку виведення команди:

sudo btrfs filesystem df нужний_путь

Там ваші питання не загубляться і ви швидше отримаєте відповідь, на відміну від коментарів.