2

У меня проблема с дисковым пространством на томе btrfs. df показывает, что на диске достаточно места. Но когда я пытаюсь скопировать тестовую файловую систему размером 10 ГБ, на этом устройстве нет места на диске.

df -h | grep /mnt/ssd:

/dev/sda 448G 135G 313G 31% /mnt/ssd

Тоже самое:

btrfs filesystem df /mnt/ssd:

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

Я не знаю, как прочитать вывод этого:

sudo btrfs filesystem show:

Label: none  uuid: aba64e21-69d1-46c1-b3f2-dfda832b67fd
    Total devices 2 FS bytes used 133.88GiB
    devid    1 size 447.13GiB used 447.13GiB path /dev/sda
    devid    2 size 447.13GiB used 447.13GiB path /dev/sdb

То есть используется 133,88 ГБ или 447,13 ГБ? Очень запутанно.

2 ответа2

3

Чтобы понять, что здесь происходит, вы должны сначала понять, что 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 блоков данных и метаданных, которые заполнены менее чем на четверть, что в большинстве случаев должно завершиться за несколько секунд.

1

У меня никогда не было проблем такого типа с файловой системой Btrfs на жестком диске, но у меня была такая же на моем SSD. SSD не знает, какие блоки действительно свободны, вам нужно его обрезать.

Но когда возникает проблема, fstrim -v /mnt/ssd почти не показывает места, которое нужно обрезать! Мое решение:

btrfs balance start /mnt/ssd
  #  you can monitor its progress by 'btrfs balance status /mnt/ssd'
fstrim -v /mnt/ssd

Вторая команда на этот раз должна урезать много места. После этого мое свободное место действительно доступно для меня.

Обратите внимание: я использую Btrfs на одном SSD, в моем случае нет RAID, и я не знаю, имеет ли это какое-то значение (я рассчитываю на ваши отзывы).


О запутанной части: Btrfs как файловая система может увеличиваться или уменьшаться внутри назначенного ей устройства (или устройств). На данный момент ваша файловая система раздутая. Он использует все 447.13GiB на каждом устройстве. Я думаю, что все это пространство "используется", пока дело касается fstrim . Внутри файловой системы 133.29GiB используются фактические данные, хотя. Балансировка файловой системы должна уменьшить ее, и только тогда fstrim сможет выполнить свою работу.

Файловая система снова раздуется со временем. Вот почему я научился периодически выполнять вышеуказанное обслуживание, особенно перед apt-get upgrade .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .