如何递归删除 btrfs 快照?

如何递归删除 btrfs 快照?

如何删除包含其他快照的快照?正常情况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

相关内容