btrfs 하위 볼륨이 존재하는지 테스트

btrfs 하위 볼륨이 존재하는지 테스트

이전 rsync 디스크 백업(및 아카이브)을 향후 btrfs 스냅샷 백업으로 포팅해야 하는 bash 절차에 문제가 있습니다.

다음 줄을 사용하고 싶습니다.

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

스냅샷 /targetdir/@monthly.8이 jet에 없으면 원하는 대로 생성됩니다.

그러나 /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"를 사용했습니다(즉, 첫 번째 오류가 내 쉘에서 종료됩니다. 루트로 실행해야 한다는 것을 기억하십시오...). 그런 다음 나는 무슨 일이 일어났는지 알려주고 종료하는 명령을 선호합니다. 그러므로 나는 이렇게 한다:

    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

관련 정보