7

bash スクリプトで、特定の場所が btrfs サブボリュームであるかどうかをエレガントに確認するにはどうすればよいですか?

指定された場所が btrfs ファイル システム (またはサブボリューム)にあるかどうかは知りたくありません。指定された場所がサブボリュームの先頭かどうかを知りたいです。

理想的には、ソリューションは bash 関数で記述できるので、次のように記述できます。

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

「エレガントな」ソリューションは、読みやすく、コードが小さく、リソースの消費が少ないものです。

4

2 に答える 2

15

サブボリュームは i ノード番号 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:以前に使用したもの (呼び出しは 1 回だけですが、おそらく脆弱です):

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

編集:通常のディレクトリでは の動作が正しく応答しないため、修正listして置き換えました。showlistbtrfs

EDIT2 : @kdaveが彼の優れた回答の完全版を投稿しなかったため、回答に追加しました。

于 2014-09-18T08:49:01.820 に答える