Как рекурсивно удалить снимок btrfs?

Вопрос или проблема

Как я могу удалить снимок, который содержит в себе другие снимки? Обычная команда sudo btrfs subvolume delete вызовет ошибку.

Рекурсивное удаление подтомов (снимки просто являются томами только для чтения) пока недоступно в btrfs-tools. Чтобы удалить верхний уровень, сначала необходимо удалить нижние уровни.

Вы можете получить список подтомов с помощью команды btrfs subvolume list. Опция -o должна позволить вам отфильтровать результаты до тех, что вас интересуют, но не стесняйтесь экспериментировать. Далее вы сможете просмотреть список и удалить все подподтомы, после чего сможете удалить верхний подтом, и на этом всё.

К сожалению, btrfs subvolume list не любит здравый смысл. Вот прототип скрипта.

Он работает с подтомом в текущем каталоге, предполагает отсутствие tmp, имеет тревожное небезопасное поведение с “особенными символами” (| или символами регулярного выражения в родительских каталогах), содержит не обнаруженные ошибки и не имеет комментариев. Проблему с регулярным выражением, вероятно, следует избежать, переписав с использованием сопоставления строк bash вместо sed. Если вывод btrfs subvolume list изменится в какой-то момент, он вас “съест”.

#!/bin/sh
# ОГРАНИЧЕНИЕ: см. выше
set -e

function my_ls_pwd() {
    btrfs sub list -o "$1" | cut -d " " -f 9
}

btrfs sub create tmp
btrfs sub create tmp/tmp
BTRFS_PWD=$(my_ls_pwd tmp | sed -e 's|tmp/tmp$||')
btrfs sub del tmp/tmp
btrfs sub del tmp

# `btrfs sub list` показывает полный путь в пределах файловой системы;
# мы хотим путь, относительный к рабочему каталогу
function my_ls() {
    my_ls_pwd $1 | sed -e "s|^$BTRFS_PWD||"
}

# Рекурсивное удаление подтомов
function my_deltree() {
    my_ls "$1" | while read i; do
        my_deltree "$i"
    done
    btrfs sub del "$1"
}
my_deltree $1

С btrfs-progs v6.12 теперь возможно рекурсивное удаление.

  • Подключите ваше устройство с опцией user_subvol_rm_allowed:
sudo mount -o user_subvol_rm_allowed /dev/path/to/btrfs/volume /mnt
  • Удалите подтом с внутренними подтомами:
sudo btrfs su d -R /mnt/your/submodule/path

Где /dev/path/to/btrfs/volume – это путь к вашему btrfs объему, your/submodule/path – это подтом, который вы хотите удалить.

страница man для btrfs

Ответ или решение

Удаление снимков подтома в файловой системе Btrfs может показаться сложной задачей, особенно когда речь идет о рекурсивных снимках. В этой статье на русском языке мы рассмотрим, как правильно удалить подтома, включая вложенные снимки, с использованием различных методов и скриптов.

Понять проблему

Снимки в Btrfs являются по сути доступом только для чтения к субтомам. Если у вас есть снимок, содержащий другие снимки, то использование стандартной команды sudo btrfs subvolume delete вызовет ошибку. Это связано с тем, что Btrfs не поддерживает рекурсивное удаление на уровне утилиты btrfs-tools.

Подход к решению

1. Просмотр списка подтомов

Для начала, вы можете получить список существующих подтомов в вашей файловой системе с помощью команды:

sudo btrfs subvolume list /mnt/your_mount_point

Эта команда даст вам все подтома, включая вложенные, и поможет определить порядок их удаления.

2. Удаление подтомов вручную

В случае, если вы готовы выполнить удаление вручную, следуйте шагам ниже:

  1. Сначала удалите все вложенные подтомы.
  2. После этого удалите верхний уровень подтома.

3. Использование скрипта для рекурсивного удаления

Если вы хотите автоматизировать процесс, вы можете использовать предложенный ниже скрипт. Он осуществляет рекурсивное удаление подтомов, начиная с самых нижних уровней:

#!/bin/sh
# Полное удаление подтомов
set -e

function my_ls() {
    btrfs subvolume list "$1" | awk '{print $9}'
}

# Рекурсивное удаление
function my_deltree() {
    my_ls "$1" | while read -r i; do
        my_deltree "$i"
    done
    btrfs subvolume delete "$1"
}

# Укажите путь к подтомам
my_deltree /mnt/your_mount_point/path_to_snapshot

Удаление с использованием btrfs-progs v6.12 и позже

С версии btrfs-progs 6.12 доступна возможность рекурсивного удаления подтомов с использованием параметра -R. Чтобы использовать это, выполните следующие шаги:

  1. Смонтируйте ваше устройство с опцией user_subvol_rm_allowed:
sudo mount -o user_subvol_rm_allowed /dev/path/to/btrfs/volume /mnt
  1. Удалите желаемый подтом:
sudo btrfs subvolume delete -R /mnt/your/subvolume/path

Заключение

Удаление рекурсивных бэкап-снимков в Btrfs может быть сложным процессом, но с помощью вышеприведенных методов и скрипта вы можете эффективно управлять своими подтомами. Переключение на использование btrfs-progs версии 6.12 делает этот процесс значительно более удобным и безопасным. Мы рекомендуем им всегда использовать актуальные версии утилит и внимательно следить за актуальностью документации Btrfs, чтобы избежать проблем в будущем.

Оцените материал
Добавить комментарий

Капча загружается...