Чтобы понять, что здесь происходит, вы должны сначала понять, что BTRFS использует двухступенчатый распределитель. На первом этапе выделяются большие куски пространства (фактически называемые «чанками» в большей части документации), которые используются только для одного типа размещения: либо данные (используются только для данных в файлах), метаданные (такие как имена файлов, каталоги структура, время доступа, владение, разрешения и т. д.) или система (используется исключительно для хранения данных о распределении чанков). После выделения фрагмента пространство в этом фрагменте может быть освобождено только путем удаления всех данных из него.
Итак, что именно это означает с точки зрения вашей файловой системы?
Итак, ваш вывод из btrfs filesystem df
показывает следующее:
Data, RAID1: total=446.12GiB, used=133.29GiB
System, RAID1: total=8.00MiB, used=80.00KiB
Metadata, RAID1: total=1.00GiB, used=609.05MiB
GlobalReserve, single: total=405.53MiB, used=0.00B
total
значения указывают, сколько места было выделено для этого типа чанка, в то время как used
значение показывает, сколько места используется в этих чанках. В вашем случае у вас есть 446,32 ГБ пространства, выделенного для блоков данных (почти весь диск, основанный на обычной файловой системе df
и btrfs filesystem show
выходные данные), но на самом деле используется только 133,29 ГБ из этого пространства. Учитывая это и описанные симптомы, BTRFS пытается выделить блок метаданных, но у него нет места для этого (поскольку все свободное пространство находится внутри уже выделенных блоков), поэтому вы просто получаете сообщение об ошибке.
Чтобы выздороветь от этого, вам придется запустить баланс. Весы в буквальном смысле отправляют все данные из выбранных кусков (или все из них, если вы не передаете никакие параметры) обратно через распределитель, что в итоге приводит к освобождению пустых или в основном пустых кусков, поскольку он упаковывает вещи обратно в частично полные куски.
Я бы начал с:
btrfs balance start -dusage=0 /mnt/ssd
Это удалит все порции данных, в которых нет фактических данных, которых может быть достаточно для возобновления работы на данный момент, но все равно оставит вас уязвимыми для той же проблемы в будущем.
Чтобы полностью упростить процесс сжатия , повторите приведенную выше команду с увеличивающимися значениями параметра -dusage
. Я обычно увеличиваю его на 5 каждый раз до 50 (за 50 ты обычно тратишь время). Фильтр использования (указанный выше для простой обработки фрагментов данных) сообщит балансу выбрать фрагменты, которые заполнены не более чем на процент, так что, постепенно наращивая его постепенно, вы можете упростить сжатие, не сталкиваясь с другими проблемами.
Вы можете помочь избежать подобных проблем в будущем, регулярно выполняя что-то вроде следующего (я обычно запускаю это ежедневно на своих системах):
btrfs balance start -dusage=25 -dlimit=10 -musage=25 -mlimit=10 /mnt/ssd
Это позволит сбалансировать первые 10 блоков данных и метаданных, которые заполнены менее чем на четверть, что в большинстве случаев должно завершиться за несколько секунд.