Btrfs хранит данные не отдельными файлами, а блоками-группами (block group), для которых задан профиль: single, raid1, raid1c3, raid10. Со временем свободное место распределяется неравномерно, а после замены диска часть групп остаётся на старом устройстве. Команда btrfs balance перераспределяет такие группы и при необходимости меняет профиль. Операция полезна, но тяжёлая: перед запуском сделайте резервную копию и оцените нагрузку на диски.
Что именно делает balance
Balance проходит по выбранным блокам, читает занятые экстенты и записывает их заново с новым размещением или профилем. Пустые группы освобождаются, занятые уплотняются. Это не проверка целостности и не замена scrub: ошибки чтения balance не лечит, а при проблемном диске может усугубить ситуацию. Сначала посмотрите текущую картину и статистику ошибок.
btrfs filesystem usage -T /
btrfs filesystem df /
sudo btrfs device stats /
sudo btrfs balance status -v /
В выводе usage важны колонки Data, Metadata и System, а также строка Unallocated. Если метаданные близки к заполнению, балансировка может не запуститься или упасть с ENOSPC. Проверьте, что на файловой системе действительно есть свободное место, а не только «невыделенное».
Когда балансировка нужна, а когда нет
Типичные поводы: добавление или удаление устройства, смена профиля RAID, перераспределение после неудачного device remove, подготовка к сжатию или снятию снапшотов. Регулярный полный balance по расписанию не нужен: он создаёт лишнюю нагрузку и изнашивает диски. Для профилактики достаточно точечных запусков с фильтрами и периодического scrub.
- Добавили диск и хотите задействовать его ёмкость — балансировка с фильтром по заполненности.
- Меняете
singleнаraid1— нужен-dconvertи-mconvert. - Метаданные распухли из-за мелких файлов и снапшотов — помогает
-musage. - Просто «для порядка» — не стоит, если нет конкретной задачи и метрик.
Резервная копия и окно обслуживания
Снапшот Btrfs — удобная точка отката, но он лежит на тех же дисках и не спасает от сбоя массива или ошибки оператора. Сделайте копию на отдельный носитель и проверьте, что она читается. Если используете btrfs send, заранее создайте каталог для снапшотов и приёмник на внешнем Btrfs-диске.
sudo mkdir -p /snapshots /mnt/backup
sudo btrfs subvolume snapshot -r / /snapshots/root-$(date +%F)
sudo btrfs send /snapshots/root-$(date +%F) | sudo btrfs receive /mnt/backup
sudo btrfs subvolume list / | tail -20
Balance запускайте в окно, когда пользователи не работают с диском, а мониторинг не считает кратковременные всплески загрузки аварией. На HDD перераспределение нескольких терабайт может идти часами и сопровождаться непрерывным треском головок. На SSD это быстрее, но всё равно создаёт заметный поток записи. Не запускайте одновременно balance, scrub и массовое копирование.
Фильтры: точечная балансировка
Полный запуск btrfs balance start / переписывает все блоки и на большой файловой системе почти всегда избыточен. Фильтр -dusage=50 выбирает только группы данных, заполненные менее чем на 50 процентов; -musage делает то же для метаданных. -dlimit ограничивает число обрабатываемых групп, а --bg переводит операцию в фон.
sudo btrfs balance start -dusage=50 -musage=70 /
sudo btrfs balance start -dusage=75 -dlimit=10 /
sudo btrfs balance start -mconvert=raid1c3 -dconvert=raid1 /
sudo btrfs balance start --bg -dusage=60 /
Начните с одного фильтра и посмотрите на объём работы: btrfs balance status -v / показывает, сколько блоков осталось. Если операция запущена в фоне, прогресс можно проверять в любой момент. Не ставьте -dusage=100 без понимания: это фактически полная перезапись, только записанная иначе.
Смена профиля RAID
Профиль задаётся отдельно для данных и метаданных. raid1 хранит две копии и требует минимум два устройства, raid1c3 — три копии и три устройства, raid10 — не менее четырёх. Перед конвертацией проверьте, что все устройства доступны и в массиве достаточно свободного места: новое размещение занимает больше блоков.
sudo btrfs device usage /
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /
sudo btrfs balance status -v /
sudo btrfs filesystem df /
Если меняете профиль на лету, сначала освободите место и убедитесь, что в dmesg нет ошибок ввода-вывода. Конвертация на почти заполненной файловой системе может остановиться с ENOSPC; добавление устройства или удаление лишних снапшотов решает проблему, но требует отдельного планирования. Не отключайте питание во время смены профиля.
Мониторинг, пауза и отмена
Balance можно приостановить и продолжить, а отмена не повреждает уже перемещённые блоки: завершённые группы остаются в новом виде. Это важно, если операция мешает работе. Однако отмена не откатывает изменения, поэтому решение принимайте осознанно.
sudo btrfs balance status -v /
sudo btrfs balance pause /
sudo btrfs balance resume /
sudo btrfs balance cancel /
Следите за dmesg -w и iostat -x 5: рост очереди и время отклика показывают, что диск перегружен. Если появились ошибки checksum или ввода-вывода, остановите операцию, проверьте btrfs device stats и SMART, а затем займитесь носителем. Балансировка не должна выполняться на сомнительном диске.
Типичные ошибки
- Запуск полного balance на многотерабайтном HDD без окна обслуживания.
- Отсутствие проверенной резервной копии перед сменой профиля.
- Игнорирование
ENOSPCи попытки повторить операцию без освобождения места. - Одновременный scrub, balance и резервное копирование.
- Ожидание, что balance исправит ошибки чтения или битые блоки.
- Балансировка при включённых квотах без оценки их влияния на скорость.
Чек-лист
- Резервная копия создана и проверена на чтение.
btrfs filesystem usage -Tиdevice statsпросмотрены.- Выбран точечный фильтр, а не полный прогон.
- Окно обслуживания согласовано, мониторинг предупреждён.
- Есть план отмены и проверки состояния после операции.
- Профиль RAID соответствует числу устройств и задаче.
Итог
btrfs balance — инструмент перераспределения, а не универсальная починка. Он возвращает массиву равномерность после замены диска, меняет профиль и освобождает недозаполненные группы, но требует свободного места, терпения и копии данных. Запускайте его с фильтрами, следите за нагрузкой и не превращайте в ежемесячный ритуал: тогда польза будет реальной, а риск потерять данные или получить многочасовую деградацию — минимальным.