Блог

Новини, акції та корисні статті для розробників.

Snapshots btrfs-розділів

Знайомство з Btrfs

B-деревовидна файлова система Btrfs є наступним поколінням файлових систем для Linux. Незважаючи на те, що вона все ще знаходиться в процесі активної розробки, нею вже можна користуватись для поточних задач. Навіть якщо ви й не збираєтесь переводити свої продакшн-сервери на Btrfs, все одно є доцільним витратити деякий час на її вивчення, щоб дізнатися про всі її можливості. Ця файлова система має значні покращення, порівняно з ext3/ext4, наприклад, значно простіший спосіб управління розділами дисків.

btrfs (іноді вимовляється як butter fs) —вільна файловая система, яка розробляється при підтримці компанії Oracle. Розмовсюджується за ліцензією GPL. Незважаючи на те, що її розробка є ще далекою від завершення, 9 січня 2009 року файлову систему було інтегровано в ядро Linux.

Знаходиться в процесі активної розробки (17 червня 2009 року вийшла версія 0.19, яка відрізняється підвищеною продуктивністю).

Більшість сприймають систему як відповідь на файлову систему ZFS, яку не може бути включено у склад ядра Linux через ліцензійну несумісністю з ними (ZFS розповсюджується за ліцензією CDDL, яка несумісна з ліцензією GPL, за якою поширюється ядро Linux). Ряд можливостей файлової системи btrfs раніше були відсутніми в файлових системах Linux, таких как, наприклад, ext3 або XFS, але у той же час, вони є в ZFS: Наприклад, файлова система btrfs, так само як і ZFS, інтегрує в собі програмний RAID, вона дозволяє робити знімки даних (snapshots) та перевірку цілісності без розмонтування. У той же час, засновник btrfs та основний її розробник, Кріс Масон, говорить, що файлова система виникла не як відповідь на ZFS, а сама по собі — у зв'язку з необхідністю вирішення проблем, які неминуче постануть перед Linux-спільнотою в найближчі 10 років [1].

Можливості, які наразі підтримуються (або будуть підтримуватися у найближчому майбутньому):

  • Перевірка цілістності без розмонтування;
  • Знімки, що записуються (writeable snapshots);
  • Динамічне виділення індексних дескрипторів (динамічні іноди, dynamic inodes);
  • Контрольні суми даних та метаданих;
  • Інтеграція з device-mapper;
  • Підтримка RAID-масивів (одна файлова система на декількох томах);
  • Стиснення;
  • Підтоми (subvolumes);
  • Ефективне клонування файлової системи та створення інкрементальних архивів;
  • Дефрагментація змонтованої файлової системи.

Для тих, хто вперше дізнався про Btrfs: це докорінна переробка Linux ext, - файлової системи, яка використовується останнім часом. Btrfs використовує b-tree (b-дерево) для збереження загальних типів елементів даних (items) в єдиній уніфікованій структурі. Ці типи даних сортуються за їх 136-бітним ключем. Схожі типи даних групуються разом за домогою загального префікса ключа (і таким чином файловая система оптимізується для операцій читання та запису). Невеликі файли можуть зберігатися безпосередньо в "листку" дерева, в той час, коли великі файли записуються в extents - це знижує накладні видатки та зменшує фрагментацію.

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

Ще більше переваг виділяється на рівні інструментів файлової системы. Btrfs має вбудовану підтримку RAID-масивів, у тому числі - multi-приладів та механізм захисту від пошкоджень. Підтримує зміну розміру файлової системи в режимі online, додавання та видалення дисків.

Файлова система Btrfs підтримує прозоре стиснення даних, створення знімків файлової системи та створення підтомів - це особливо корисно, коли необхідно мати розділи на різних дисках.

Більшість основних дистрибутивів Linux у своїх свіжих релізах мають вбудовану підтримку файлової системи Btrfs, принаймні, на експериментальному рівні. Так як розробтка Btrfs ведеться дуже активно, рекомендується мати ядро Linux не нижче версії 2.6.33. Можливо, вам знадобиться встановити окремим пакетом (btrfs-progs) утиліти для роботи з цією файловою системою. (Примітка перекладача: наприклад, для Archlinux - в репозиторіях AUR; для Ubuntu цей пакет має іншу назву - btrfs-tools і легко знаходиться командою aptitude search btrfs-tools).

Btrfs створюються командою mkfs.btrfs. Основна програма для роботи з файловою системою - утиліта btrfs. Вона вміє створювати та керувати знімками, підтомами та контролювати цілісність усієї системи. Може статися, що ви знайдете посилання на більш стару версію цієї утиліти під назвою btrfsctl. Якщо ви вирішили скористатися нею, необхідно перед цим прочитати документацію по Btrfs, адже опції та синтаксис могли змінитися. (Примітка перекладача: btrfsctl входить до складу пакета btrfs-tools з репозиторія Ubuntu).

Є також утиліта btrfsck (перевіряє непідмонтовану файлову систему Btrfs на помилки) та невеликий набір інших утиліт, які використовуються для пошуку несправностей та наладки. Наприклад, btrfs-image може виконувати дамп образу файлової системи; ви зможете відправити його Btrfs-розробникам, якщо потребуєте допомоги при налаштуванні несправностей.

Btrfs має свої власні опції монтування, але вам немає необхідності встановлювати іншу версію програми mount для того, щоб виконтувати монтування розділів с btrfs.
Основні операції: створення та зміна файлових систем, масивів.

Створення файлової системи Btrfs на пристрої виконується за допомогою утиліти mkfs.btrfs командою mkfs.btrfs device_name

Наприклад:

$ mkfs.btrfs /dev/sda2

Це створює файлову систему на усьому розділі sda2.

Якщо маєте бажання створити файлову систему певного розміру, потрібно застосувати опцію -b (розмір в байтах):

$ mkfs.btrfs -b 120134 /dev/sda2

Те ж можна зробити визначенням розміру сектора - опція -s:

$ mkfs.btrfs -s 2345 /dev/sda2

Більш цікава ситуація - це створення RAID-масивів. Синтаксис команди:

$ mkfs.btrfs device_one device_two device_three

Тобто для створення RAID-масиву на трьох дисках вам достатньо вказати їх утиліті mkfs.btrfs одним рядком. Усе інше вона зробить сама. Стандартно кожний диск буде поділено порівну на тип stripe для даних (RAID0) и на тип mirror (RAID1).

Якщо вам необхідний інший тип масиву, ви можете вказати його опціями:

-m profile - аргумент утиліти mkfs.btrfs для метаданих;
-d profile - профіль для даних.

На даний момент можна створювати масиви типів RAID0, RAID1, RAID10 та single.

Монтувати створену файлову систему Btrfs можна з опцією -t filesystem:

$ mount -t btrfs /dev/sda2 /media/sda2

Для монтування RAID-масивів вам достатньо вказати тільки один з пристроїв, які входять до складу всього масиву; утиліта btrfs сама знайде інші пристрої та автоматично змонтує їх разом.
Наприклад, якщо ви створили двохдисковий масив командою:

$ mkfs.btrfs /dev/sda /dev/sdb

то підмонтувати його ви можете командою:

$ mount -t btrfs /dev/sda /mnt/bigarray

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

$ btrfs device add /dev/sdc /mnt/bigarray

Додавання пристрою в масив можливе тільки тоді, коли його підмонтовано. Після того, як ви додали новий диск в масив, вам потрібно наказати утиліті btrfs перерозподілити дані на усі три диски:

$ btrfs filesystem balance /mnt/bigarray

Ця операція може зайняти тривалий час, якщо масив великий. Навіть якщо один з дисків вашого RAID-масиву вийде з ладу, ви можете монтувати цей диск за допомогою опції degraded.

Наприклад:

$ mount -t btrfs -o deraded /dev/sdb /mnt/bigarray

У цьому випадку повідомлення щодо помилок (тобто - щодо пошкодження диску) виводитись не будуть. Можна видалити диск із RAID-масиву командою:

$ btrfs device delete /dev/sdb /mnt/bigarray

Усі дані буде переміщено на інші диски (якщо обсягу їх буде достатньо; якщо ні, то вам спочатку доведеться додати інший додатковий диск). Синтаксис команди для зміни розміру файлової системи Btrfs:

$ btrfs filesystem resize filesystem_name size

Аргумент size може приймати три значення:

- заданий розмір (наприклад, 1024M або 7G);

- інкремент или декремент (наприклад, +200M або -2G);

- максимальний розмір (max) - в цьому випадку файлову систему буде створено на усьому доступному просторі диску або розділу.

Імена усіх основних команд для управління файловою системою говорять самі за себе - Btrfs стандартно надає простий та зручний вибір команд, а також питання, для того, щоб уникнути можливих помилок при вводі додаткових параметрів. Ось чому чисті файлові системи (навіть RAID-масиви) в більшості Linux-систем проходять короткий шлях від тестування до застосування. Для того, щоб дізнатися, що нового з'явилось в цій файловій системі, давайте ближче розгляне підтоми Btrfs.
Підтоми, знімки та перетворення

Підтоми в Btrfs є частиною (sub-tree) основного дерева (tree) файлової системи. Вони створюються всередині існуючої файлової системи, але ведуть себе подібно самостійним файловим системам, зі своїми власними точками монтування, опціями та правами. На відміну від створення диску, розділеного на декілька розділів (партицій), підтоми не потребують для себе додаткового дискового простору; вони є просто пустими директоріями. Але як тільки ви почнете створювати в них дані, розмір підтомів почне зростати прямопропорційно обсягу доданих в них файлів. Перевага такого підходу не тільки в економії місця на диску; це значить, що ви можете створювати стільки підтомів в одній файловій системі, скільки вам буде потрібно. І додавати додаткові зйомні пристрої до підтомів, коли пристрої будуть заповнені, незважаючи на те, який том має наибільший обсяг.

Ви можете розглядати підтоми как директорії, які можуть монтуватися так, як якщо б це був пристрій або образ віртуального диску у віртуальній машині (VM).

Давайте створимо підтом для прикладу:

$ btrfs subvolume create /path/to/volume/volume_name

Якщо ви не вкажете явним чином шлях у файловій системі для підтома, то його буде створено в поточній директорії. Ви можете примонтувати підтом куди завгодно, вказавши опцію subvolume команді монтування mount. Наприклад, якщо ви створили підтом на ім'я mysubvolume за шляхом /mnt/bigarray, ви можете примонтувати його командою:

$ mount -t btrfs -o subvol=mysbvolume /dev/sda /mnt/notsobig

Якщо ви не пам'ятаєте точно, де ви створили ваши підтоми, команда:

$ btrfs subvolume list /mnt/bigarray

покаже список усіх наявних в системі. Для того, щоб видалити один из них, синтаксис команди:

$ btrfs subvolume delete subvolume_name

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

Btrfs підтримує спеціальний тип підтомів, необхідний для супроводу файлової системи - знімки. Синтаксис є таким же; потрібно тільки замінити опцію create опцією snapshot.

Наприклад:

$ btrfs subvolume snapshot /mnt/bigarray /mnt/backups/October15

Ця команда створює підтом в директорії /mnt/backups/October15, який буде знімком директорії /mnt/bigarray. Цей знімок ви можете перемістити на зйомний пристрій або записати на диск (в залежності від того, що вам потрібно для забезпечення цілісності даних). Ціковою стороною файлової системи Btrfs є те,що при створенні знімків вона дублює не дані, а робить копію b-дерева цих даних. Якщо ви не змінювали будь-які файли в директорії /mnt/bigarray, знімок не займе додаткового дискового простору.

Це і є метод copy-on-write. В основному, більшість файлів не змінюются, тому знімки не займають багато місця.

Існує ще одна цікава особливість, заснована на властивості copy-on-write - конвертування файлової системи ext3/ext4 в Btrfs. Утиліта btrfs-convert створює файлову систему Btrfs, при цьому перезаписує існуючу ext3/ext4 шляхом читання її та створення b-дерев на вільному дисковому просторі. Подібно створенню знімків, ця файлова система не займає додаткового місця, якщо файли не змінюються. Коли ж файли змінено, оригінальна версія файлової системи ext зберігається, так що ви зможете "відкатити" назад весь процес конвертування та відновити файлову систему в її попередньому, до Btrfs, стані.

Для початку вам необхідно запустити утиліту fsck для перевірки файлової системи на можливі помилки. Після цього можна запускати конвертацію.

Синтаксис команди:

$ btrfs-convert device

Потім підмонтовуємо знову сторену Btrfs-систему:

$ mount -t btrfs device the_btrfs_mountpoint

Оригінальна ext-система створюється у вигляді знімку з ім'ям ext2_saved (навіть якщо вона мала формат ext3 або ext4). Ви також можете примонтувати знімок за допомогою команди:

$ mount -t btrfs -o subvol=ext2_saved device /mnt/ext2_saved

Повернути знімок файлової системи ext в первинний стан (до змін) ви можете так:

$ btrfs-convert -r device

Екстраможливості: опції монтування

Опції compress та compress-force дозволяють виконувати прозоре стисення даних в файловій системі; опція force дозволяє виконувати компресію файлів, які зазвичай мають низький коефіцієнт стисення (таких, как стиснені аудіо або відео формати). Опція ssd є корисною для тех користувачів, які мають твердотільні накопичувачі (SSD); вона включає декілька способів оптимізації, які підвищують продуктивність цих already-speed пристроїв.

Висновки

Файлова система Btrfs ще знаходиться в стані активної розробки. Підтримка додаткових конфігурацій RAID-масивів, повторне дублювання та перевірка на помилки в режимі online поки тільки в планах. Одначе, приймаючи до уваги наскільки спрощені способи роботи з розділами, масивами та логічними томами в цій файловій системі, наскільки знімки можуть змінити ваш підхід до стратегії створення backup'ів - ви зможете не чекати, а використовувати ці переваги вже зараз.