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

(x в массиве) возвращает значение, поэтому делать «не в массиве» ", ты можешь сделать это is:

awk 'NR==FNR{a[$1];next}($3 in a ==0)' extract.file input.file

это тоже работает.

9
26.02.2017, 04:09
2 ответа

TL;DR Метаданные (если btrfs не страдает общей нехваткой места) будут автоматически увеличиваться. В тех случаях, когда нераспределенного свободного места нет, автоматическое увеличение останавливается. Однако, если для части данных btrfs было выделено больше места, чем ему нужно, то его можно перераспределить. В btrfs это называется балансом.

Предполагая, что на блочном устройстве (устройствах) резервного копирования btrfs достаточно нераспределенной памяти, тогда часть метаданных файловой системы выделяет — так же, как предполагается OP — автоматически память для увеличения/расширения метаданные.

Таким образом, ответ: Да (при условии, что в btrfs) нет условия нехватки памяти/свободного места, тогда метаданные будут автоматически увеличены, как таковые:

(1) Мы рассмотрели некоторые начальные настройки распределения btrfs (на устройстве 40 ГБ)

$> 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 может начать «заикаться» и не сможет автоматически увеличить выделенное пространство для метаданных. Причиной может быть, например, то, что все пространство уже выделено под части (Данные, Система, Метаданные, Глобальный Резерв). Как ни странно, это может быть и так, что есть видимое пространство. Примером может служить следующий вывод:

$> 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, но распределение несколько несбалансированное , так как хотя еще есть место для данные новых файлов, метаданные (как в случае 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, поскольку примечания могут содержать больше «ссылок».

8
27.01.2020, 20:07

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

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

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

Вы можете перенести существующую файловую систему btrfs на новую с большим -n РАЗМЕР . Вы даже можете затем добавить его в существующую файловую систему с помощью btrfs RAID и balance, а затем удалить старую файловую систему.

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

1
27.01.2020, 20:07

Теги

Похожие вопросы