Testen, ob ein BTRFS-Subvolume vorhanden ist

Testen, ob ein BTRFS-Subvolume vorhanden ist

Ich habe ein Problem bei einer Bash-Prozedur, die mein altes rsync-Festplatten-Backup (und Archiv) auf mein zukünftiges btrfs-Snapshot-Backup portieren soll.

Ich möchte die Zeile verwenden:

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

Falls der Snapshot /targetdir/@monthly.8 noch nicht existiert, wird er wie gewünscht erstellt.

Aber wenn /targetdir/@monthly.8 bereits vorhanden war, wird stattdessen /targetdir/@monthly.8/@onthly.9 erstellt.

Mir fehlt hier ein Test auf Existenz, etwa:

# [[ -bsnap <snap-path> ]] # =TRUE if <snap-path> exists and is a snap!

Wie kann ich dieses Problem lösen?

Antwort1

Ich schätze, Sie möchten btrfs subvolume snapshot …„if /targetdir/@monthly.8exists“ nicht ausführen, egal, was es ist. Testen Sie einfach, ob es existiert:

[ -e /targetdir/@monthly.8 ]

oder existiert nicht

[ ! -e /targetdir/@monthly.8 ]

was auch immer nützlicher ist. Wenn es existiert, obwohl es nicht existieren sollte, dann btrfs subvolume deleteexistiert es. Nur wenn dieser Befehl zurückkehrt, ERROR: not a subvolumemachen Sie sich Gedanken darüber, was das Objekt sonst noch ist. Ich rate Ihnen, Ihren Workflow, Ihre Untervolumes, Einhängepunkte, Verzeichnisse und deren Berechtigungen so zu organisieren, dass es @monthly.8nur ein Untervolume sein kann.


Aber wenn Sie es wirklich wissen müssen

btrfs subvolume show /targetdir/@monthly.8

ist erfolgreich, wenn es sich um ein Untervolume handelt, andernfalls schlägt es fehl. Beispiel:

btrfs subvolume show /targetdir/@monthly.8 &>/dev/null && echo "It's a subvolume!"

Antwort2

Die Antwort von @Kamil Maciorowski ist gut. Aber ich möchte mich auf den Existenztest konzentrieren.

Angenommen, ich debugge und muss einen Versuch wiederholen, und der Ziel-Snapshot war bereits vorhanden. Dann war ich sehr vorsichtig und habe „bash -e“ eingegeben (d. h. der erste Fehler beendet meine Shell. Denken Sie daran, dass ich es als Root ausführen muss ...). Dann bevorzuge ich einen Befehl, der mir sagt, was passiert ist, und dann beendet wird. Deshalb mache ich Folgendes:

    btrfs subvolume list  /targetdir/@monthly.9 | grep @monthly.8 &&  echo "$0 ERROR: snapshot /targetdir/@monthly.8 exists already!" && exit

Der Befehl „subvolume list“ gibt keinen Fehler aus und listet sie alle auf. Dann filtere ich nach Bedarf und treffe meine Entscheidungen.

Antwort3

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

verwandte Informationen