Сколько места освободится при удалении подобъема btrfs?

11

Есть ли способ подсчитать, сколько места я бы освободил, если бы удалял один (или несколько) подобъемов на диске Btrfs (без их фактического удаления)? Я знаю, что "в настоящее время нет кода, который будет выполнять вычисления за вас" , но как бы вы это сделали?

Мне также интересно, почему они говорят, что это будет так медленно? По моему опыту, как удалить собственное подразделение, так и спросить о свободном пространстве очень быстро, почему гипотетически делать то же самое гораздо медленнее?

Hjulle
источник
2
Я надеюсь, что вы знаете, что btrfs.wiki.kernel.org/index.php/Btrfs_mailing_list может быть лучшим местом для вопросов о внутренней работе btrfs (или любого другого компонента ядра). Если вы получили ответ, пожалуйста, опубликуйте его здесь. Мне интересно сам ответ.
Адам Рычковски
1
Вы говорите: «На самом деле, и удаление субтома, и вопрос о свободном пространстве - это очень быстро в моем опыте». Когда вы удаляете подобъем, он на самом деле просто помечает этот подобъем для удаления, он на самом деле освобождает эти блоки только тогда, когда получает время (что означает сообщение «no-commit», когда вы это делаете), так что нет, удаление не обязательно очень быстро
etskinner

Ответы:

3

Вы должны взглянуть на btrfs quotaи btrfs qgroups(группы квот).

В основном qgroupsделают именно то, что вы просили, они отслеживают, сколько места выделено подобъемами. Чтобы включить qgroupфункциональность для btrfsфайловой системы, вы должны

# btrfs quota enable /path/to/btrfs/filesystem

Однако, прежде чем сделать это быть предупрежден , что это вызывает полное повторное вычисление qgroupданных, потребуется некоторое время , особенно для больших файловых систем с большим количеством подобъемов. Этот процесс выполняется асинхронно в фоновом режиме. Вы уже можете проверить статус qgroupsс

# btrfs qgroup show /path/to/btrfs/filesystem

Это даст вам некоторый вывод:

WARNING: rescan is running, qgroup data may be incorrect
qgroupid         rfer         excl
--------         ----         ----
0/5         843.69GiB     61.91MiB
0/4881      811.06GiB      9.34GiB
0/7990      867.32GiB    329.91MiB
0/8400      867.17GiB     37.64MiB

(Предупреждение в первой строке присутствует, пока повторное сканирование все еще выполняется.)

Btrfs автоматически создает qgroupдля каждого подобъема. В этом случае есть три подобъема с идентификаторами подобъема 4881, 7990 и 8400. Часть перед косой чертой - это уровень qgroup. Каждый подобъем qgroupнаходится на уровне 0. Кроме того, на уровне 0 есть специальное предложение, qgroupкоторое всегда имеет идентификатор 5 и соответствует корню файловой системы btrfs.

Для каждого qgroupвышеприведенного вывода показано, сколько места указано в нем. Это означает, что соответствующий подобъем содержит файлы, общий размер которых равен указанному числу.

Тем не менее, из-за моментальных снимков и характера копирования btrfs подобъемы могут совместно использовать файлы. Это означает, что на содержимое (или на самом деле экстенты) файлов может ссылаться более одного подобъема. Это выражается вторым числом, которое показывает, сколько места выделено исключительно для каждого подобъема и не используется совместно с любым другим подобъемом. В случае, если вы удаляете подобъем, это пространство, которое будет фактически освобождено.

Если вы хотите узнать, сколько места будет освобождено, если вы удалите несколько подобъемов, вы можете использовать вышеупомянутые уровни. qgroupsкоторые организованы в иерархии и группах на верхних уровнях (выше 0) агрегировать информацию о более низких уровнях.

Таким образом, чтобы узнать, сколько места будет освобождено, если будут удалены подобъемы 4881 и 7990 (в приведенном выше примере), создайте новый qgroup(произвольно с ID 0, но вы можете выбрать все, что вам нравится здесь) на уровне 1 с

# btrfs qgroup create 1/0 /path/to/btrfs/filesystem

Затем назначьте вновь созданный qgroupв качестве родителя для qgroupsподобъемов, которые вы хотите удалить

# btrfs qgroup assign 0/4881 1/0 /path/to/btrfs/filesystem
# btrfs qgroup assign 0/7990 1/0 /path/to/btrfs/filesystem

Это вызовет повторное сканирование информации о квоте, которое может занять некоторое время. Если это закончено, и вы сейчас выпускаете

# btrfs qgroup show -p /path/to/btrfs/filesystem

вы получите вывод, как это:

qgroupid         rfer         excl parent
--------         ----         ---- ------
0/5           1.38TiB      2.51GiB ---
0/4881        1.11TiB     10.86GiB 1/0
0/7990        1.23TiB    502.41MiB 1/0
0/8400        1.34TiB      1.69GiB 1/0
1/0           1.51TiB    132.23GiB ---

(Я добавил -pфлаг, чтобы добавить parentстолбец к выводу, который показывает отношения родитель / потомок qgroups.)

Теперь строка с qgroup 1/0говорит вам, сколько пространства указано в обоих подобъемах, которые вы хотите удалить, и, что более важно, сообщает вам, сколько пространства выделено исключительно ими . Это количество пространства, которое будет освобождено, если вы удалите оба подобъема.

Мне также интересно, почему они говорят, что это будет так медленно?

Это связано с тем, что btrfs копируется при записи вместе со снимками. Если вы создаете моментальный снимок в btrfs (обычно), все фактические данные во вновь созданном подобъеме, который содержит моментальный снимок, передаются источнику моментального снимка. Только когда файл изменяется или заменяется в источнике, он указывает на другое содержимое (экстенты). Это очень затрудняет оценку того, сколько места фактически будет освобождено при удалении подобъема, поскольку необходимо учитывать все пространство, которое используется совместно с другими подобъемами.

Эрки дер Луни
источник