7

在 bash 脚本中,我如何优雅地检查特定位置是否是 btrfs 子卷?

我不想知道给定位置是否btrfs 文件系统(或子卷)中。我想知道给定位置是否

理想情况下,解决方案可以用 bash 函数编写,因此我可以编写:

if is_btrfs_subvolume $LOCATION; then
    # ... stuff ...
fi 

一个“优雅”的解决方案将是可读的、代码少、资源消耗少。

4

2 回答 2

15

子卷由 inode 编号 256 标识,因此您可以通过以下方式简单地检查它

if [ `stat --format=%i /path` -eq 256 ]; then ...; fi

还有一个所谓的空子卷,即。如果对嵌套子卷进行快照,则该实体将代替原始子卷存在。它的 inode 编号为 2。

对于任何目录是否是子卷的一般可靠检查,还应验证文件系统类型

stat -f --format=%T /path
于 2015-09-30T11:49:46.303 回答
5

解决方案1:使用@kdave 建议:

is_btrfs_subvolume() {
    local dir=$1
    [ "$(stat -f --format="%T" "$dir")" == "btrfs" ] || return 1
    inode="$(stat --format="%i" "$dir")"
    case "$inode" in
        2|256)
            return 0;;
        *)
            return 1;;
    esac
}

解决方案2:我之前使用的(只有一个电话,但可能很脆弱):

is_btrfs_subvolume() {
    btrfs subvolume show "$1" >/dev/null 2>&1
}

编辑:更正并替换list为在任何正常目录上都不会正确回答show的行为。listbtrfs

EDIT2:由于@kdave 没有发布他出色答案的完整版本,我将其添加到我的答案中。

于 2014-09-18T08:49:01.820 回答