Probar si existe el subvolumen btrfs

Probar si existe el subvolumen btrfs

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.8existe, 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 subvolumepreocú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.8solo 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

información relacionada