
Eu tenho um problema em um procedimento bash, que deve portar meu antigo backup de disco rsync (e arquivo) para meu futuro backup de instantâneo btrfs.
Eu quero usar a linha:
# btrfs subvolume snapshot /targetdir/@monthly.9 /targetdir/@monthly.8
Se o instantâneo /targetdir/@monthly.8 não existir, ele será criado, como eu quero.
Mas se /targetdir/@monthly.8 já estava lá, então /targetdir/@monthly.8/@onthly.9 será criado.
Estou faltando aqui um teste de existência, diga:
# [[ -bsnap <snap-path> ]] # =TRUE if <snap-path> exists and is a snap!
Como posso superar esse problema?
Responder1
Eu acho que você não quer executar btrfs subvolume snapshot …
se /targetdir/@monthly.8
existir, independentemente do que seja. Basta testar se existe:
[ -e /targetdir/@monthly.8 ]
ou não existe
[ ! -e /targetdir/@monthly.8 ]
o que for mais útil. Se existe quando não deveria, então btrfs subvolume delete
existe. Somente se este comando retornar ERROR: not a subvolume
você se preocupará com o que mais é o objeto. Aconselho você a organizar seu fluxo de trabalho, subvolumes, pontos de montagem, diretórios e suas permissões de uma forma que @monthly.8
só poderia ser um subvolume.
Mas se você realmente precisa saber
btrfs subvolume show /targetdir/@monthly.8
terá sucesso se for um subvolume; caso contrário, falhará. Exemplo:
btrfs subvolume show /targetdir/@monthly.8 &>/dev/null && echo "It's a subvolume!"
Responder2
A resposta de @Kamil Maciorowski é boa. Mas deixe-me concentrar-me no teste de existência.
Digamos que estou depurando e preciso repetir uma tentativa e o instantâneo de destino já estava lá. Então fui muito cauteloso e coloquei "bash -e" (ou seja, o primeiro erro sai do meu shell. Lembre-se que devo executá-lo como root...). Então prefiro um comando que me diga o que aconteceu e depois saia. Portanto eu faço:
btrfs subvolume list /targetdir/@monthly.9 | grep @monthly.8 && echo "$0 ERROR: snapshot /targetdir/@monthly.8 exists already!" && exit
O comando "lista de subvolumes" não apresenta erros e lista todos eles. Aí eu filtro conforme preciso e tomo minhas decisões.
Responder3
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