Testen Sie, ob das Btrfs-Subvolume vorhanden ist

563
prometheos

Ich habe ein Problem in einer Bash-Prozedur, die meine alte Rsync-Disk-Sicherung (und das Archiv) auf meine zukünftige Btrfs-Momentaufnahmesicherung portieren sollte.

Ich möchte die Leitung benutzen:

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

Wenn der Snapshot /targetdir/@monthly.8 nicht vorhanden ist, wird er erstellt, wie ich möchte.

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

Ich vermisse hier eine Existenzprüfung, sagen Sie:

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

Wie kann ich dieses Problem überwinden?

0
Meine btrfs-progs v4.4 hier auf ubuntu 16.4 (täglich auf dem neuesten Stand) scheint den man btrfs-subvolume zu übersehen, der sagt: "... snapshot [-r] [/] ... Wenn nur angegeben wird, wird das Subvolume den Basisnamen von genannt . "Es scheint unkompliziert hinzuzufügen:" Wenn / name existiert bereits und erstellt dann // $ (Basisname Ich würde es einen Fehler oder ein böses Feature nennen. prometheos vor 6 Jahren 0

2 Antworten auf die Frage

0
Kamil Maciorowski

Ich denke, Sie wollen nicht laufen, btrfs subvolume snapshot …wenn es /targetdir/@monthly.8existiert, egal was es ist. Testen Sie einfach, ob es existiert:

[ -e /targetdir/@monthly.8 ] 

oder existiert nicht

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

was ist nützlicher. Wenn es existiert, dann sollte es nicht btrfs subvolume delete. Nur wenn dieser Befehl zurückkehrt, ERROR: not a subvolumemachen Sie sich Sorgen, was das Objekt sonst noch ist. Ich empfehle Ihnen, Ihren Workflow, Subvolumes, Mountpoints, Verzeichnisse und deren Berechtigungen so zu organisieren, dass @monthly.8es nur ein Subvolume sein kann.


Aber ob Sie wirklich wissen müssen

btrfs subvolume show /targetdir/@monthly.8 

wird Erfolg haben, wenn es sich um ein Teilvolumen handelt; es wird sonst scheitern. Beispiel:

btrfs subvolume show /targetdir/@monthly.8 &>/dev/null && echo "It's a subvolume!" 
Ich möchte meinen Befehl als weitere Option in Ihre Antwort aufnehmen. Dann lösche ich meine Antwort, um das Argument ein wenig zu streichen. Ich glaube nicht, dass ich so wählerisch bin! prometheos vor 6 Jahren 0
@prometheos Siehe [* Kann ich meine eigene Frage beantworten? *] (https://superuser.com/help/self-answer) Unsere Antworten können nebeneinander bestehen. Sie können Ihre eigene Antwort akzeptieren, wenn sie zu Ihnen passt. Kamil Maciorowski vor 6 Jahren 0
0
prometheos

Die Antwort von @Kamil Maciorowski ist gut. Aber lassen Sie mich mich auf die Existenzprüfung konzentrieren.

Angenommen, ich debugge, und ich muss einen Versuch wiederholen, und der Ziel-Snapshot war bereits vorhanden. Dann war ich sehr vorsichtig und setzte mich "bash -e" (dh der erste Fehler tritt aus meiner Shell aus. Denken Sie daran, dass ich es als root ausführen muss ...). Dann bevorzuge ich einen Befehl, der mir sagt, was passiert ist, und dann abbricht. Deshalb mache ich:

 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.

Hoppla! Warum sprang meine Antwort an die Spitze? Ich habe gesagt, dass sie chronologisch gehen, wenn sie keine Stimmen haben. prometheos vor 6 Jahren 0
Chronologisch, wenn Sie über der ersten Antwort auf "Älteste" klicken. Dies ist pro Benutzerpräferenz und die Site ist kein Forum. Kamil Maciorowski vor 6 Jahren 0
Ich hoffe, Sie wissen, dass es nicht genau für `/ targetdir / @ month.8` getestet wird. Ich denke, jedes Subvolume mit "@ month.8" im Pfad (ich meine den internen Pfad im Dateisystem) wird "echo" auslösen, auch wenn dieses Subvolume momentan nicht in Ihrem Verzeichnisbaum erreichbar ist. Auf der anderen Seite testet meine Lösung genau das Objekt, das als `/ targetdir / @ month.8` im Verzeichnisbaum erscheint. Kamil Maciorowski vor 6 Jahren 0