TL; DR Метаданные (если btrfs не страдает от общей нехватки места) автоматически увеличатся. В тех случаях, когда нераспределенного свободного пространства не существует, автоматическое увеличение запирается. Однако если части данных btrfs
было выделено больше места, чем нужно, то это можно перераспределить. Это называется balance
-ing в btrfs.
Предполагая, что на вспомогательном блочном (ых) устройстве (ах) блока достаточно нераспределенной памяти, btrfs
часть метаданных файловой системы автоматически выделяет память - как предполагается OP - для увеличения / расширения метаданных.
Таким образом, ответ: да (при условии, что в памяти нет условий нехватки памяти / свободного места btrfs
) , метаданные будут автоматически увеличены, как таковые:
(1) Мы рассмотрим некоторые начальные настройки распределения btrfs (на 40GB
устройстве).
$> btrfs filesystem df /
Data, single: total=25.00GiB, used=24.49GiB
System, single: total=32.00MiB, used=16.00KiB
Metadata, single: total=1.55GiB, used=1.33GiB
GlobalReserve, single: total=85.41MiB, used=0.00B
(2) Как видно, выделенное пространство в файловой системе для хранения метаданных составляет 1,55 ГБ, из которых 1,33 ГБ, следовательно, используется почти все (это может быть ситуация, возникающая в случае ОП)
(3) Теперь мы провоцируем увеличение метаданных, которые будут добавлены. Для этого мы копируем папку / home, используя --reflink=always
опцию cp
команды.
$> cp -r --reflink=awlways /home /home.copy
(4) Поскольку (как мы предполагаем, в / home было много файлов), когда в файловую систему было добавлено много новых данных, из-за того, что мы использовали, --reflink
практически не используется дополнительное пространство для реальных данных, он использует Копирование при записи, механизм. Короче говоря, в основном метаданные были добавлены в файловую систему. Мы можем иметь, следовательно, другой взгляд
$> btrfs filesystem df /
Data, single: total=25.00GiB, used=24.65GiB
System, single: total=32.00MiB, used=16.00KiB
Metadata, single: total=2.78GiB, used=2.45GiB
GlobalReserve, single: total=85.41MiB, used=0.00B
Как видно, пространство, выделенное для метаданных, используемых в этом btrfs
, автоматически увеличивается и расширяется.
Поскольку это происходит автоматически, пользователь обычно не обнаруживает его. Однако есть некоторые случаи, в основном те, в которых вся файловая система уже в значительной степени заполнена. В этих случаях btrfs
может начаться «заикание» и не удастся автоматически увеличить выделенное пространство для метаданных. Причина может быть, например, в том, что все пространство уже выделено для частей (Data, System, Metadata, GlobalReserve). Заблуждение, это может быть еще случай, когда есть очевидное пространство. Примером может быть следующий вывод:
$> btrfs filesystem df /
Data, single: total=38.12GiB, used=25.01GiB
System, single: total=32.00MiB, used=16.00KiB
Metadata, single: total=1.55GiB, used=1.45GiB
GlobalReserve, single: total=85.41MiB, used=0.00B
Как можно видеть, система все- 40GiB
таки распределена, однако, несколько не в порядке balance
, поскольку, хотя еще есть место для данных новых файлов, метаданные (как в случае OP) остаются низкими. Автоматическое выделение памяти для устройств, поддерживающих btrfs
файловую систему, больше невозможно (просто сложите итоги распределения, 38.12G + 1.55G + .. ~ = 40GiB).
Однако, поскольку имеется избыточное свободное пространство, которое было выделено для data
части файловой системы, теперь это может быть полезным, чтобы сбалансировать btrfs. Баланс будет означать перераспределение уже выделенного пространства.
В случае OP можно предположить, что по какой-то причине возник дисбаланс между различными частями btrfs
распределения.
К сожалению, простая команда sudo btrfs balance -dusage=0
, которая в принципе должна искать пустые блоки (выделенные для данных) и размещать их для лучшего пользователя (это было бы почти исчерпанным пространством для метаданных), может потерпеть неудачу, потому что не могут быть найдены полностью пустые блоки данных.
Следовательно, btrfs
разработчики рекомендуют последовательно увеличивать лимит использования «когда блоки данных должны быть переставлены, чтобы освободить место»
Следовательно, если результат
$> sudo btrfs balance -dusage=0
Done, had to relocate 0 out of 170 chunks
не показывает перемещение, нужно сделать некоторые
$> sudo btrfs balance -dusage=5
Done, had to relocate 0 out of 170 chunks <--(again fail)
$> sudo btrfs balance -dusage=10
Done, had to relocate 0 out of 170 chunks <--(again fail)
$> sudo btrfs balance -dusage=15
Done, had to relocate 2 out of 170 chunks <--(success)
Другой ответ намекал на влияние btrfs
размера узла, который несколько влияет на скорость увеличения метаданных. Размер узла (как упоминалось в другом ответе) устанавливается только один раз во mkfs.btrfs
время создания файловой системы. Теоретически, можно было бы уменьшить размер метаданных, если бы было возможно изменить более низкое значение для размера узла, если это было возможно (это не так!). Однако размер узла не сможет помочь расширить или увеличить пространство метаданных, выделенное каким-либо образом. Вместо этого, это могло бы только помочь сохранить пространство в первую очередь. Однако меньший размер узлов не гарантирует уменьшения размера метаданных. Действительно, некоторые случаи могут показывать, что большие размеры узлов уменьшают длину обхода дерева btrfs, поскольку заметки могут содержать больше «ссылок».