20 січня 2026

man btrfs-balance

BTRFS-BALANCE(8)                                            BTRFS                                            BTRFS-BALANCE(8)NAME
       btrfs-balance - балансування груп блоків на файловій системі btrfsSYNOPSIS
       btrfs balance <subcommand> <args>DESCRIPTION
       Основна мета функції балансування полягає в тому, щоб розподілити групи блоків по всіх пристроях, щоб вони відповідали обмеженням, визначеним відповідними профілями. Дивіться розділ mkfs.btrfs(8) <> PROFILES <#man-mkfs-profiles> для отримання додаткових деталей. Обсяг процесу балансування можна далі налаштувати за допомогою фільтрів, які дозволяють вибрати групи блоків для обробки. Балансування працює лише на змонтованій файловій системі. Спільне використання екстентів зберігається, і reflinks не порушуються. Файли не дефрагментуються та не перестискаються, екстенти файлів зберігаються, але фізичне розташування на пристроях змінюється.   Операція балансування може бути скасована користувачем. Стан файлової системи на диску завжди є послідовним, тому несподіване переривання (наприклад, збій системи, перезавантаження) не пошкоджує файлову систему. Прогрес операції балансування тимчасово зберігається як внутрішній стан і відновлюється при монтуванні, якщо не вказано опцію монтування skip_balance.

   Попередження:
      Запуск балансування без фільтрів займе багато часу, оскільки воно по суті переміщує дані/метадані з усієї файлової системи та потребує оновлення всіх покажчиків блоків.

   Фільтри можна використовувати для виконання таких дій:

   • перетворення профілів груп блоків (фільтр convert)

   • зробити використання груп блоків компактнішим (фільтр usage)

   • виконувати дії лише на заданому пристрої (фільтри devid, drange)

   Фільтри можна застосовувати до комбінації типів груп блоків (data, metadata, system). Зауважте, що зміна лише типу system потребує опції force. В іншому випадку system автоматично перетворюється щоразу, коли перетворюється профіль metadata.

   Коли зменшується надмірність метаданих (наприклад, з RAID1 на single), опція force також є обов'язковою, і це зазначається в журналі системи.

   Зауваження:
      Операція балансування потребує достатньо робочого простору, тобто простору, який повністю не використовується в файловій системі, інакше це може призвести до повідомлень ENOSPC. Дивіться розділ ENOSPC для отримання додаткових деталей.COMPATIBILITY
       Зауваження:
          Підкоманда balance також існує в просторі імен btrfs filesystem. Це все ще працює для зворотної сумісності, але є застарілою і не повинна більше використовуватися.   Зауваження:
      Короткий синтаксис btrfs balance <path> працює завдяки зворотній сумісності, але є застарілим і не повинен більше використовуватися. Замість цього використовуйте команду btrfs balance start.PERFORMANCE IMPLICATIONS
       Операції балансування є дуже інтенсивними щодо вводу/виводу та можуть бути досить інтенсивними щодо ЦП, впливаючи на інші поточні операції файлової системи. Зазвичай великі обсяги даних копіюються з одного місця в інше з відповідними оновленнями метаданих.   Залежно від розташування груп блоків, це може бути сильно залежним від пошуку. Продуктивність на обертових пристроях помітно гірша порівняно з SSD або швидкими масивами.SUBCOMMAND
       cancel <path>
              скасовує запущене або призупинене балансування; команда блокується та чекає, доки не завершиться обробка поточної групи блоків          Починаючи з ядра 5.7, час відповіді на скасування значно покращено; на старіших ядрах це може зайняти багато часу, доки не завершиться поточний фрагмент.

   pause <path>
          призупиняє запущене балансування; це збереже стан прогресу балансування та використаних фільтрів у файловій системі

   resume <path>
          відновлює перерване балансування; стан балансування повинен бути збережений у файловій системі з попереднього запуску, наприклад, після призупинення або примусового переривання та повторного монтування з skip_balance

   start [options] <path>
          запускає операцію балансування відповідно до заданих фільтрів; без фільтрів дані та метадані з усієї файлової системи переміщуються. Процес виконується на передньому плані.

          Зауваження:
             Команда balance без фільтрів по суті переміщує все в файловій системі на нове фізичне розташування на пристроях (тобто не впливає на логічні властивості екстентів файлів, такі як зсуви в файлах та спільне використання екстентів). Час виконання потенційно дуже довгий, залежно від розміру файлової системи. Щоб запобігти випадковому запуску повного балансування, користувача попереджають і дають кілька секунд на скасування операції перед її початком. Попередження та затримку можна пропустити за допомогою опції --full-balance.

          Будь ласка, зауважте, що фільтри повинні бути вказані разом з опціями -d, -m та -s, оскільки вони є необов'язковими, і голі -d та -m також працюють і означають відсутність фільтрів.

          Зауваження:
             Коли цільовий профіль для фільтра convert є raid5 або raid6, існує захисний тайм-аут у 10 секунд, щоб попередити користувачів про статус функції

          Options

          -d[<filters>]
                 діє на групи блоків даних, дивіться розділ FILTERS для деталей про фільтри

          -m[<filters>]
                 діє на фрагменти метаданих, дивіться FILTERS для деталей про фільтри

          -s[<filters>]
                 діє на фрагменти системи (потребує -f), дивіться FILTERS для деталей про фільтри.

          -f     примусово зменшує цілісність метаданих, наприклад, при переході з raid1 на single, або пропускає захисний тайм-аут, коли цільовий профіль перетворення є raid5 або raid6

          --background|--bg
                 запускає операцію балансування асинхронно у фоновому режимі, використовує fork(2) <https://man7.org/linux/man-pages/man2/fork.2.html> для запуску процесу, який викликає ioctl ядра

          --enqueue
                 чекає, якщо виконується інша ексклюзивна операція, інакше продовжує

          -v     (застаріле) псевдонім для глобальної опції '-v'

   status [-v] <path>
          Показує статус запущеного або призупиненого балансування.

          Options

          -v     (застаріле) псевдонім для глобальної опції -vFILTERS
       Починаючи з ядра 3.3, BTRFS balance може обмежити свою дію підмножиною всієї файлової системи та може бути використане для зміни конфігурації реплікації (наприклад, перетворення даних з single на RAID1).   Балансування можна обмежити профілем групи блоків за допомогою таких опцій:

   • -d для груп блоків даних

   • -m для груп блоків метаданих (також неявно застосовується до -s)

   • -s для груп блоків системи

   Опції мають необов'язковий параметр, який означає, що параметр повинен починатися відразу після опції без пробілу (це обов'язковий синтаксис getopt), наприклад -dusage=10. Опції для всіх типів груп блоків можна вказати в одній команді.

   Фільтр має таку структуру: filter[=params][,filter=...]

   Щоб поєднати кілька фільтрів, використовуйте ,, без пробілів. Приклад: -dconvert=raid1,soft

   BTRFS може мати різні профілі на одному пристрої або той самий профіль на кількох пристроях.

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

   Перед зміною профілів переконайтеся, що на існуючих дисках є достатньо невиділеного простору для створення нових груп блоків метаданих (для файлових систем понад 50 ГіБ це 1 ГБ * (кількість_пристроїв + 2)).

   Профілі за замовчуванням у BTRFS:

   • data: single

   •

     metadata:

            • single пристрої: dup

            • multiple пристрої: raid1

   Доступні типи фільтрів:   Filter types
       profiles=<profiles>
              Балансує лише групи блоків із заданими профілями. Параметри — це список імен профілів, розділених | (вертикальною рискою).   usage=<percent>, usage=<range>
          Балансує лише групи блоків із використанням нижче заданого відсотка. Значення 0 дозволене та очищає повністю невикористані групи блоків, це не повинно вимагати виділення нового робочого простору. Ви можете використовувати usage=0 у випадку, коли балансування повертає ENOSPC, а ваша файлова система не надто заповнена.

          Аргумент може бути одним значенням або діапазоном. Одне значення N означає не більше N відсотків використаного, еквівалентно синтаксису діапазону ..N. Ядра до 4.4 приймають лише формат одного значення. Мінімальна межа діапазону є включною, максимальна — виключною.

   devid=<id>
          Балансує лише групи блоків, які мають принаймні один фрагмент на заданому пристрої. Щоб перелічити пристрої з ідентифікаторами, використовуйте btrfs filesystem show.

   drange=<range>
          Балансує лише групи блоків, які перекриваються з заданим діапазоном байтів на будь-якому пристрої. Використовуйте разом з devid для фільтрації на конкретному пристрої. Параметр — це діапазон, заданий як start..end.

   vrange=<range>
          Балансує лише групи блоків, які перекриваються з заданим діапазоном байтів у внутрішньому віртуальному адресному просторі файлової системи. Це адресний простір, який використовують більшість звітів btrfs у журналі ядра. Параметр — це діапазон, заданий як start..end.

   convert=<profile>
          Перетворює кожну вибрану групу блоків на заданий профіль, ідентифікований параметрами.

          Зауваження:
             Починаючи з ядра 4.5, фрагменти даних можна перетворювати на/з профілю DUP на одному пристрої.

             Починаючи з ядра 4.6, всі профілі можна перетворювати на/з DUP на файлових системах з кількома пристроями.

          Попередження:
             Поганий або відсутній пристрій не виявляється відразу під час виконання та залежить від якоїсь пізнішої події, як невдала запис або невдала транзакція commit. Якщо є відомий несправний пристрій або пристрій, видалений через інтерфейс /sys/block/<dev>/device/delete, пристрій все одно буде доступний і записуватиметься на нього.

             У такому випадку не слід перетворювати на профіль з нижчою надмірністю (наприклад, з RAID1 на SINGLE), оскільки спроби створення нових фрагментів на нових пристроях спричинять різні проблеми.

             Правильна дія — використовувати btrfs replace або btrfs device remove для обробки несправного/відсутнього пристрою спочатку. Тоді перетворення працюватиме з усіма пристроями правильно.

   limit=<number>, limit=<range>
          Обробляє лише задану кількість фрагментів після застосування всіх фільтрів. Це можна використовувати для конкретного націлювання на фрагмент у поєднанні з іншими фільтрами (drange, vrange) або просто для обмеження обсягу роботи, виконаної одним запуском балансування.

          Аргумент може бути одним значенням або діапазоном. Одне значення N означає не більше N фрагментів, еквівалентно синтаксису діапазону ..N. Ядра до 4.4 приймають лише формат одного значення. Мінімальна та максимальна межі діапазону є включними.

   stripes=<range>
          Балансує лише групи блоків, які мають задану кількість смуг. Параметр — це діапазон, заданий як start..end. Має сенс для профілів груп блоків, які використовують смугування, тобто RAID0/10/5/6. Мінімальна та максимальна межі діапазону є включними.

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

          Перемикач режиму soft (як і будь-який інший фільтр) є специфічним для типу. Наприклад, це означає, що ми можемо перетворювати фрагменти метаданих "жорстким" способом, тоді як фрагменти даних перетворювати вибірково з перемикачем soft.

   Імена профілів, використані в profiles та convert, є одним з:

   • raid0

   • raid1

   • raid1c3

   • raid1c4

   • raid10

   • raid5

   • raid6

   • dup

   • single

   Змішані профілі даних/метаданих можна перетворювати так само, але перетворення між змішаними та незмішаними не реалізовано. Щодо обмежень профілів, будь ласка, зверніться до розділу mkfs.btrfs(8) <> PROFILES <#man-mkfs-profiles>.ENOSPC
       Спосіб роботи балансування полягає в тому, що зазвичай потрібно тимчасово створити нову групу блоків і перемістити туди старі дані, перш ніж стару групу блоків можна видалити. Для цього потрібен робочий простір, інакше операція завершується помилкою ENOSPC. Це не той самий ENOSPC, що й коли вільний простір вичерпано. Це стосується простору на рівні груп блоків, які є більшими частинами файлової системи, що містять багато екстентів файлів.   Вільний робочий простір можна розрахувати з виведення команди btrfs filesystem show:

      Label: 'BTRFS'  uuid: 8a9d72cd-ead3-469d-b371-9c7203276265
              Total devices 2 FS bytes used 77.03GiB
              devid    1 size 53.90GiB used 51.90GiB path /dev/sdc2
              devid    2 size 53.90GiB used 51.90GiB path /dev/sde1

   size - used = free work space

   53.90GiB - 51.90GiB = 2.00GiB

   Приклад фільтра, який не потребує робочого простору, — usage=0. Це просканує всі невикористані групи блоків заданого типу та звільнить простір. Після цього може стати можливим запуск інших фільтрів.

   ПЕРЕТВОРЕННЯ НА КІЛЬКОХ ПРИСТРОЯХ

   Перетворення на профілі на основі смугування (RAID0, RAID5/6) потребує робочого простору на кожному пристрої. Перерване балансування може залишити частково заповнені групи блоків, які споживають робочий простір.EXAMPLES
       Більш повний приклад переходу від одного до кількох пристроїв та назад можна знайти в розділі TYPICAL USECASES btrfs-device(8) <>.   MAKING BLOCK GROUP LAYOUT MORE COMPACT
       Розташування груп блоків зазвичай не видно; більшість інструментів повідомляють лише підсумовані числа вільного або використаного простору, але все ж надаються деякі підказки.   Використаємо наступний реальний приклад і почнемо з виведення:

      $ btrfs filesystem df /path
      Data, single: total=75.81GiB, used=64.44GiB
      System, RAID1: total=32.00MiB, used=20.00KiB
      Metadata, RAID1: total=15.87GiB, used=8.84GiB
      GlobalReserve, single: total=512.00MiB, used=0.00B

   Грубо розрахувавши для даних, 75G - 64G = 11G, співвідношення used/total становить близько 85%. Як ми можемо інтерпретувати це:

   • фрагменти заповнені в середньому на 85%, тобто фільтр usage з будь-чим меншим за 85, ймовірно, не вплине ні на що

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

   Ущільнення розташування може бути використане для обох. У першому випадку це розподілить дані заданого фрагмента на інші та видалить його. Тут ми можемо оцінити, що приблизно 850 МіБ даних потрібно перемістити (85% від 1 ГіБ фрагмента).

   У другому випадку націлювання на частково використані фрагменти потребуватиме переміщення меншого обсягу даних і таким чином буде швидшим. Типова команда фільтра виглядатиме так:

      # btrfs balance start -dusage=50 /path
      Done, had to relocate 2 out of 97 chunks

      $ btrfs filesystem df /path
      Data, single: total=74.03GiB, used=64.43GiB
      System, RAID1: total=32.00MiB, used=20.00KiB
      Metadata, RAID1: total=15.87GiB, used=8.84GiB
      GlobalReserve, single: total=512.00MiB, used=0.00B

   Як ви бачите, загальна кількість даних зменшилася лише на 1 ГіБ, що є очікуваним результатом. Подивимося, що станеться, коли ми збільшимо оціночний фільтр usage.

      # btrfs balance start -dusage=85 /path
      Done, had to relocate 13 out of 95 chunks

      $ btrfs filesystem df /path
      Data, single: total=68.03GiB, used=64.43GiB
      System, RAID1: total=32.00MiB, used=20.00KiB
      Metadata, RAID1: total=15.87GiB, used=8.85GiB
      GlobalReserve, single: total=512.00MiB, used=0.00B

   Тепер співвідношення used/total становить близько 94%, і ми перемістили близько 74G - 68G = 6G даних до решти груп блоків, тобто 6 ГіБ тепер вільні від структур файлової системи та можуть бути повторно використані для нових груп блоків даних або метаданих.

   Ми можемо виконати подібну вправу з групами блоків метаданих, але це зазвичай не потрібно, якщо співвідношення used/total не сильно відхилене. Тут співвідношення приблизно 50%, але різниця як абсолютне число — "кілька гігабайт", що можна вважати нормальним для навантаження зі знімками або reflinks, що часто оновлюються.

      # btrfs balance start -musage=50 /path
      Done, had to relocate 4 out of 89 chunks

      $ btrfs filesystem df /path
      Data, single: total=68.03GiB, used=64.43GiB
      System, RAID1: total=32.00MiB, used=20.00KiB
      Metadata, RAID1: total=14.87GiB, used=8.85GiB
      GlobalReserve, single: total=512.00MiB, used=0.00B

   Лише зменшення на 1 ГіБ, що, можливо, означає, що є групи блоків з хорошим використанням. Зробити розташування метаданих компактнішим, у свою чергу, потребуватиме оновлення більше структур метаданих, тобто багато вводу/виводу. Оскільки вичерпання простору метаданих є серйознішою проблемою, не обов'язково тримати співвідношення використання надто високим. Для цілей цього прикладу подивимося на ефекти подальшого ущільнення:

      # btrfs balance start -musage=70 /path
      Done, had to relocate 13 out of 88 chunks

      $ btrfs filesystem df .
      Data, single: total=68.03GiB, used=64.43GiB
      System, RAID1: total=32.00MiB, used=20.00KiB
      Metadata, RAID1: total=11.97GiB, used=8.83GiB
      GlobalReserve, single: total=512.00MiB, used=0.00B   GETTING RID OF COMPLETELY UNUSED BLOCK GROUPS
       Зазвичай операція балансування потребує робочого простору, щоб тимчасово перемістити дані перед видаленням старих груп блоків. Якщо робочого простору немає, це завершується помилкою про відсутність простору.   Існує особливий випадок, коли групи блоків повністю невикористані, можливо, залишені після видалення багатьох файлів або видалення знімків. Видалення порожніх груп блоків є автоматичним починаючи з 3.18. Те саме можна досягти вручну з помітним винятком, що ця операція не потребує робочого простору. Таким чином її можна використовувати для звільнення невикористаних груп блоків, щоб зробити їх доступними.

      # btrfs balance start -dusage=0 /path

   Це повинно призвести до зменшення загальних чисел у виведенні btrfs filesystem df.EXIT STATUS
       Якщо не вказано інакше нижче, всі підкоманди btrfs balance повертають нульовий статус виходу, якщо вони успішні, та ненульовий у разі невдачі.   Підкоманди pause, cancel та resume виходять зі статусом 2, якщо вони зазнають невдачі через те, що операція балансування не виконувалася.

   Підкоманда status виходить зі статусом 0, якщо операція балансування не виконується, 1, якщо використання командного рядка неправильне або операція балансування все ще виконується, та 2 при інших помилках.AVAILABILITY
       btrfs є частиною btrfs-progs. Будь ласка, зверніться до документації на https://btrfs.readthedocs.io.SEE ALSO
       mkfs.btrfs(8) <>, btrfs-device(8) <>6.17.1                                                   Nov 07, 2025                                        BTRFS-BALANCE(8)