
Tengo un problema en un procedimiento bash, que debería transferir mi antigua copia de seguridad (y archivo) del disco rsync a mi futura copia de seguridad instantánea de btrfs.
Quiero usar la línea:
# btrfs subvolume snapshot /targetdir/@monthly.9 /targetdir/@monthly.8
Si la instantánea /targetdir/@monthly.8 no existe, entonces se crea, como quiero.
Pero si /targetdir/@monthly.8 ya estaba allí, entonces se crea /targetdir/@monthly.8/@onthly.9 en su lugar.
Me falta aquí una prueba de existencia, digamos:
# [[ -bsnap <snap-path> ]] # =TRUE if <snap-path> exists and is a snap!
¿Cómo puedo superar este problema?
Respuesta1
Supongo que no querrás ejecutar btrfs subvolume snapshot …
si /targetdir/@monthly.8
existe, independientemente de lo que sea. Simplemente prueba si existe:
[ -e /targetdir/@monthly.8 ]
o no existe
[ ! -e /targetdir/@monthly.8 ]
lo que sea más útil. Si existe cuando no debería, entonces btrfs subvolume delete
. Sólo si este comando regresa, ERROR: not a subvolume
preocúpese de qué más es el objeto. Le aconsejo que organice su flujo de trabajo, subvolúmenes, puntos de montaje, directorios y sus permisos de una manera que @monthly.8
solo podría ser un subvolumen.
Pero si realmente necesitas saber
btrfs subvolume show /targetdir/@monthly.8
tendrá éxito si es un subvolumen; de lo contrario fallará. Ejemplo:
btrfs subvolume show /targetdir/@monthly.8 &>/dev/null && echo "It's a subvolume!"
Respuesta2
La respuesta de @Kamil Maciorowski es buena. Pero déjame concentrarme en la prueba de existencia.
Digamos que estoy depurando y necesito repetir el intento, y la instantánea de destino ya estaba allí. Luego fui muy cauteloso y senté "bash -e" (es decir, el primer error sale de mi shell. Recuerde que debo ejecutarlo como root...). Entonces prefiero un comando que me diga lo que pasó y luego salga. Por eso hago:
btrfs subvolume list /targetdir/@monthly.9 | grep @monthly.8 && echo "$0 ERROR: snapshot /targetdir/@monthly.8 exists already!" && exit
El comando "lista de subvolumenes" no da ningún error y los enumera todos. Luego filtro según necesito y tomo mis decisiones.
Respuesta3
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