如何删除包含其他快照的快照?正常情况sudo btrfs subvolume delete
下会出错。
答案1
btrfs-tools 中尚不支持递归子卷删除(快照只是只读子卷)。要删除顶层,必须先删除较低层。
您可以使用命令获取子卷列表btrfs subvolume list
。-o 选项应该可以让您将结果过滤到您关心的结果,但您可以随意尝试。然后您应该能够浏览列表并删除所有子卷,之后您应该能够删除顶层子卷,然后您就完成了。
答案2
不幸的btrfs subvolume list
是讨厌理智。这是一个原型脚本。
它适用于当前目录中的子卷,假设tmp
不存在,对“特殊字符”(|
或正则表达式字符)有令人担忧的不安全行为父母目录),有未发现的错误,没有评论。正则表达式问题可能应该通过重写以使用 bash 字符串匹配而不是 来避免sed
。如果 的输出btrfs subvolume list
在某个时候发生变化,它就会吞噬你。
#!/bin/sh
# DISCLAIMER: see above
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` shows full path within the FS;
# we want path relative to the working directory
function my_ls() {
my_ls_pwd $1 | sed -e "s|^$BTRFS_PWD||"
}
# Recursive subvolume delete
function my_deltree() {
my_ls "$1" | while read i; do
my_deltree "$i"
done
btrfs sub del "$1"
}
my_deltree $1