Как мне расширить метаданные btrfs?

9

Мои btrfsметаданные наполняются. (Я создаю почасовые снимки, используя btrbk.)

Как мне увеличить / расширить пространство, выделенное для метаданных btrfsфайловой системы?

Или это автоматически расширяется?

Том Хейл
источник
вы используете раздел только для резервного копирования?
Руи Ф. Рибейро
1
Это подт @homeустановлен на /home, с btrbkрезервными копиями в подобъеме btrbk-snap. Для файловой системы, которая поддерживает до 2 ^ 64 снимков, я ожидал бы, что у нее будет способ увеличить размер метаданных ...
Том Хейл,
Взгляните на команду баланса btrfs
Эммануэль Роза,
@ EmmanuelRosa у меня есть. Какую часть вы считаете полезной?
Том Хейл,
Есть второй, который обсуждает перебалансировку метаданных. Возможно, с правильным фильтром вы можете выделить больше места для блоков метаданных.
Эммануэль Роза

Ответы:

7

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, поскольку заметки могут содержать больше «ссылок».

humanityANDpeace
источник
1

Согласно FAQ в btrfs wiki , это невозможно и вряд ли будет реализовано.

Могу ли я изменить размер блока метаданных без воссоздания файловой системы?

Нет, значение, переданное в mkfs.btrfs -n SIZE, не может быть изменено после создания файловой системы. Резервное копирование / восстановление не требуется. Обратите внимание, что это, вероятно, никогда не будет реализовано, потому что для этого потребуются серьезные обновления основных функций.

Вы можете перенести существующую файловую систему btrfs на новую, которая имеет больший размер -n SIZE. Вы можете даже добавить его в существующую файловую систему, используя RAID-массив btrfs и баланс, а затем удалить старую файловую систему.

Смотрите также раздел о почти полных дисках .

etskinner
источник
2
Существует разница между размером узла (который, как вы заявляете, может быть установлен только один раз при создании файловой системы) и размером метаданных, который imho и представляет в btrfs filesystem df /строке вывода команд Metadata, single: total=xxGiB, used=xxx.
человечествоANDpeace
В чем ваша точка зрения? Конечно, есть разница, но это не вопрос мнения. -nустанавливает размер каждого блока метаданных, а также btrfs filesystem dfпоказывает пространство, занимаемое этими блоками. Если у исходного автора сообщения слишком много места занято метаданными по сравнению с фактическими данными, они должны уменьшить размер -n, чтобы блоки метаданных имели меньший минимальный размер (меньше занимаемого места, но больше фрагментации).
etskinner
3
ОП спрашивает, как «увеличить / расширить пространство, выделенное для метаданных», следовательно, ваш -nответ «невозможно установить размер узла ( опция)» - imho, а не в точку. Поскольку, когда он спрашивает далее «или [выделенное пространство для метаданных] автоматически расширяется?», Намекает, что это не размер узла, а выделенное пространство, в котором он заинтересован. Поэтому ответ должен быть «да». Вы, конечно, правы, намекая на то, что -nнастройка косвенно влияет на размер метаданных, но вопрос, кажется, больше направлен на выделение памяти для метаданных, а не на размер заметки одного метаданных ....
humanityANDpeace
... скажем, например, что на вспомогательном блочном устройстве есть 100 ГБ неиспользуемого пространства, тогда в случае, если выделенная / выделенная память для метаданных будет автоматически расширена (как правильно предположил ОП). С btrfsоднако это не uncommen, что все отступающие устройства / память, уже в отведенном blockgroups данных, что означает , что помимо свободной памяти (для самих данных), ошибки «нет пространства» генерируются. Следовательно, пользователю необходимо попытаться выполнить некоторые из них btrfs balance, которые, если в других сегментах еще есть место, могут перераспределить это, чтобы увеличить недостающее пространство части метаданных.
человечествоANDpeace