btrfsサブボリュームが存在するかどうかをテストする

btrfsサブボリュームが存在するかどうかをテストする

古い rsync ディスク バックアップ (およびアーカイブ) を将来の btrfs スナップショット バックアップに移植する必要がある bash プロシージャに問題があります。

次の行を使用したいと思います:

 # btrfs subvolume snapshot /targetdir/@monthly.9 /targetdir/@monthly.8

スナップショット /targetdir/@monthly.8 が存在しない場合は、希望どおりに作成されます。

ただし、/targetdir/@monthly.8 がすでに存在する場合は、代わりに /targetdir/@monthly.8/@onthly.9 が作成されます。

ここでは存在のテストが欠けています。たとえば、

# [[ -bsnap <snap-path> ]] # =TRUE if <snap-path> exists and is a snap!

この問題をどうしたら克服できるでしょうか?

答え1

それが何であれ、存在するbtrfs subvolume snapshot …かどうかは実行したくないと思います。存在するかどうかをテストするだけです:/targetdir/@monthly.8

[ -e /targetdir/@monthly.8 ]

または存在しない

[ ! -e /targetdir/@monthly.8 ]

より有用なものなら何でも。存在するべきではないときに存在する場合は、存在しbtrfs subvolume deleteます。このコマンドが返される場合にのみ、ERROR: not a subvolumeオブジェクトが他に何であるかを心配してください。ワークフロー、サブボリューム、マウントポイント、ディレクトリ、およびそれらのアクセス許可を、サブボリュームにのみ可能な方法で整理することをお勧め@monthly.8します。


しかし、本当に知りたいのであれば

btrfs subvolume show /targetdir/@monthly.8

サブボリュームの場合は成功しますが、それ以外の場合は失敗します。例:

btrfs subvolume show /targetdir/@monthly.8 &>/dev/null && echo "It's a subvolume!"

答え2

@Kamil Maciorowski の回答は良いです。しかし、存在テストに集中させてください。

たとえば、デバッグ中に再試行する必要があり、ターゲット スナップショットがすでに存在しているとします。この場合、私は非常に慎重に「bash -e」を実行します (つまり、最初のエラーでシェルが終了します。root として実行する必要があることに注意してください...)。この場合、何が起こったかを表示して終了するコマンドの方が好ましいです。したがって、次のようにします。

    btrfs subvolume list  /targetdir/@monthly.9 | grep @monthly.8 &&  echo "$0 ERROR: snapshot /targetdir/@monthly.8 exists already!" && exit

コマンド「subvolume list」はエラーを出さずにすべてをリストします。その後、必要に応じてフィルタリングして決定を下します。

答え3

function btrfsCreateSVIfNotExist ()
{
    # parameters: $1 the dest/name of the subvolume (what you'd pass to btrfs subvolume create, e.g. /home/MYSUBVOLNAME)
    # creates a btrfs subvolume under dest/ if it doesn't already exist
    if ! btrfs subvolume show "$1" > /dev/null 2>&1; then
        btrfs subvolume create "$1"
    fi
}
export -f btrfsCreateSVIfNotExist

関連情報