Вопрос или проблема
Как я могу удалить снимок, который содержит в себе другие снимки? Обычная команда 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
– это подтом, который вы хотите удалить.
Ответ или решение
Удаление снимков подтома в файловой системе Btrfs может показаться сложной задачей, особенно когда речь идет о рекурсивных снимках. В этой статье на русском языке мы рассмотрим, как правильно удалить подтома, включая вложенные снимки, с использованием различных методов и скриптов.
Понять проблему
Снимки в Btrfs являются по сути доступом только для чтения к субтомам. Если у вас есть снимок, содержащий другие снимки, то использование стандартной команды sudo btrfs subvolume delete
вызовет ошибку. Это связано с тем, что Btrfs не поддерживает рекурсивное удаление на уровне утилиты btrfs-tools.
Подход к решению
1. Просмотр списка подтомов
Для начала, вы можете получить список существующих подтомов в вашей файловой системе с помощью команды:
sudo btrfs subvolume list /mnt/your_mount_point
Эта команда даст вам все подтома, включая вложенные, и поможет определить порядок их удаления.
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
. Чтобы использовать это, выполните следующие шаги:
- Смонтируйте ваше устройство с опцией
user_subvol_rm_allowed
:
sudo mount -o user_subvol_rm_allowed /dev/path/to/btrfs/volume /mnt
- Удалите желаемый подтом:
sudo btrfs subvolume delete -R /mnt/your/subvolume/path
Заключение
Удаление рекурсивных бэкап-снимков в Btrfs может быть сложным процессом, но с помощью вышеприведенных методов и скрипта вы можете эффективно управлять своими подтомами. Переключение на использование btrfs-progs версии 6.12 делает этот процесс значительно более удобным и безопасным. Мы рекомендуем им всегда использовать актуальные версии утилит и внимательно следить за актуальностью документации Btrfs, чтобы избежать проблем в будущем.