
古い 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