Есть ли способ подсчитать, сколько места я бы освободил, если бы удалял один (или несколько) подобъемов на диске Btrfs (без их фактического удаления)? Я знаю, что "в настоящее время нет кода, который будет выполнять вычисления за вас" , но как бы вы это сделали?
Мне также интересно, почему они говорят, что это будет так медленно? По моему опыту, как удалить собственное подразделение, так и спросить о свободном пространстве очень быстро, почему гипотетически делать то же самое гораздо медленнее?
Ответы:
Вы должны взглянуть на
btrfs quota
иbtrfs qgroups
(группы квот).В основном
qgroups
делают именно то, что вы просили, они отслеживают, сколько места выделено подобъемами. Чтобы включитьqgroup
функциональность дляbtrfs
файловой системы, вы должныОднако, прежде чем сделать это быть предупрежден , что это вызывает полное повторное вычисление
qgroup
данных, потребуется некоторое время , особенно для больших файловых систем с большим количеством подобъемов. Этот процесс выполняется асинхронно в фоновом режиме. Вы уже можете проверить статусqgroups
сЭто даст вам некоторый вывод:
(Предупреждение в первой строке присутствует, пока повторное сканирование все еще выполняется.)
Btrfs автоматически создает
qgroup
для каждого подобъема. В этом случае есть три подобъема с идентификаторами подобъема 4881, 7990 и 8400. Часть перед косой чертой - это уровеньqgroup
. Каждый подобъемqgroup
находится на уровне 0. Кроме того, на уровне 0 есть специальное предложение,qgroup
которое всегда имеет идентификатор 5 и соответствует корню файловой системы btrfs.Для каждого
qgroup
вышеприведенного вывода показано, сколько места указано в нем. Это означает, что соответствующий подобъем содержит файлы, общий размер которых равен указанному числу.Тем не менее, из-за моментальных снимков и характера копирования btrfs подобъемы могут совместно использовать файлы. Это означает, что на содержимое (или на самом деле экстенты) файлов может ссылаться более одного подобъема. Это выражается вторым числом, которое показывает, сколько места выделено исключительно для каждого подобъема и не используется совместно с любым другим подобъемом. В случае, если вы удаляете подобъем, это пространство, которое будет фактически освобождено.
Если вы хотите узнать, сколько места будет освобождено, если вы удалите несколько подобъемов, вы можете использовать вышеупомянутые уровни.
qgroups
которые организованы в иерархии и группах на верхних уровнях (выше 0) агрегировать информацию о более низких уровнях.Таким образом, чтобы узнать, сколько места будет освобождено, если будут удалены подобъемы 4881 и 7990 (в приведенном выше примере), создайте новый
qgroup
(произвольно с ID 0, но вы можете выбрать все, что вам нравится здесь) на уровне 1 сЗатем назначьте вновь созданный
qgroup
в качестве родителя дляqgroups
подобъемов, которые вы хотите удалитьЭто вызовет повторное сканирование информации о квоте, которое может занять некоторое время. Если это закончено, и вы сейчас выпускаете
вы получите вывод, как это:
(Я добавил
-p
флаг, чтобы добавитьparent
столбец к выводу, который показывает отношения родитель / потомокqgroups
.)Теперь строка с
qgroup
1/0
говорит вам, сколько пространства указано в обоих подобъемах, которые вы хотите удалить, и, что более важно, сообщает вам, сколько пространства выделено исключительно ими . Это количество пространства, которое будет освобождено, если вы удалите оба подобъема.Это связано с тем, что btrfs копируется при записи вместе со снимками. Если вы создаете моментальный снимок в btrfs (обычно), все фактические данные во вновь созданном подобъеме, который содержит моментальный снимок, передаются источнику моментального снимка. Только когда файл изменяется или заменяется в источнике, он указывает на другое содержимое (экстенты). Это очень затрудняет оценку того, сколько места фактически будет освобождено при удалении подобъема, поскольку необходимо учитывать все пространство, которое используется совместно с другими подобъемами.
источник