
이전 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