如何测试位置是否是btrfs子卷?

时间:2014-09-18 08:49:02

标签: bash btrfs

在bash脚本中,如果特定位置是btrfs子卷,我怎么能优雅地检查?

我不想知道给定位置是 btrfs文件系统(或子卷)中。我想知道给定的位置子体积的头部。

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

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

优雅'解决方案是可读的,代码小,资源消耗小。

2 个答案:

答案 0 :(得分:10)

子卷由inode编号256标识,因此您可以通过

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

还有一个所谓的空子体积,即。如果嵌套的子卷被快照,则该实体将代替原始子卷存在。其inode数为2。

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

stat -f --format=%T /path

答案 1 :(得分:3)

解决方案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,因为list的行为无法在任何正常btrfs目录上正确回答。< / p>

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