На томе btrfs «недостижимы» терабайты: снимки, заполнение выше 90 % и когда остаётся только пересоздать том

Что было. Том btrfs на 12 ТБ, данных около 6,3 ТБ, а инструмент анализа показывает ~5 ТБ «unreachable» и свободно лишь 587 ГБ. Администратор удалил все снимки, прогнал balance, defrag, scrub, даже перенёс том через device add/remove. Не помогло.

Что предположили участники.

  1. Скрытые снимки и подтома, не видимые при монтировании обычного подтома: анализировать нужно, смонтировав корень тома (mount -o subvolid=5 /dev/sdX /mnt/root), тогда видны все подтома и снимки, в том числе созданные инструментами резервного копирования и системой.
  2. Заполнение выше 90 %: btrfs плохо переносит нехватку свободного места для метаданных и перераспределения; balance не может завершиться без места. Рекомендация участников: не заполнять тома на HDD выше 80–90 %, рабочие системы держать ниже 75 %.
  3. Как крайняя мера: btrfs send/receive на новый том и переключение, что автор и выбрал.

Как разбирать место на btrfs правильно (обычные df/du вводят в заблуждение):

btrfs filesystem usage /mnt          # Device allocated/unallocated, Data/Metadata/System, Free (estimated)
btrfs subvolume list -s /mnt         # только снимки
btrfs subvolume list /mnt            # все подтома
btrfs qgroup show -reF /mnt          # если включены квоты: сколько занимает каждый снимок эксклюзивно

«Unallocated» на уровне устройств это резерв под новые блок-группы; если он близок к нулю, balance -dusage=20 освобождает почти пустые группы данных. «Unreachable» в сторонних анализаторах обычно означает данные, на которые ссылаются только снимки или подтома, не смонтированные в момент анализа.

Про снимки. Каждый снимок держит все блоки, которые с момента его создания изменились в исходном подтоме. Десяток ежедневных снимков активного тома с базой данных или образами виртуальных машин легко удерживает терабайты. Удаление снимка освобождает место не сразу: btrfs subvolume delete ставит в очередь, btrfs subvolume sync дождётся.

Что не делать. defrag на подтомах со снимками разрывает общие блоки и увеличивает занятое место; balance на почти полном томе может зависнуть; scrub проверяет целостность и место не освобождает. Начинать с инвентаризации снимков и filesystem usage, а не с команд «починки».

Команды описаны в документации btrfs.