Что было. Том btrfs на 12 ТБ, данных около 6,3 ТБ, а инструмент анализа показывает ~5 ТБ «unreachable» и свободно лишь 587 ГБ. Администратор удалил все снимки, прогнал balance, defrag, scrub, даже перенёс том через device add/remove. Не помогло.
Что предположили участники.
- Скрытые снимки и подтома, не видимые при монтировании обычного подтома: анализировать нужно, смонтировав корень тома (
mount -o subvolid=5 /dev/sdX /mnt/root), тогда видны все подтома и снимки, в том числе созданные инструментами резервного копирования и системой. - Заполнение выше 90 %: btrfs плохо переносит нехватку свободного места для метаданных и перераспределения;
balanceне может завершиться без места. Рекомендация участников: не заполнять тома на HDD выше 80–90 %, рабочие системы держать ниже 75 %. - Как крайняя мера:
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.