Frage Wie lösche ich alle bis auf die letzten [n] ZFS-Snapshots?


Momentan fotografiere ich mein ZFS-basiertes NAS nachts und wöchentlich, ein Prozess, der meinen Arsch ein paar Mal gerettet hat. Während die Erstellung des Snapshots jedoch automatisch erfolgt (von Cron), ist das Löschen alter Snapshots immer noch eine manuelle Aufgabe. Offensichtlich gibt es ein Risiko, dass, wenn ich von einem Bus getroffen werde oder die manuelle Aufgabe nicht ausgeführt wird, der NAS nicht mehr genügend Speicherplatz hat.

Hat jemand gute Möglichkeiten / Skripte, um die Anzahl der auf seinen ZFS-Systemen gespeicherten Snapshots zu verwalten? Im Idealfall möchte ich ein Skript, das alle Snapshots für ein bestimmtes ZFS-Dateisystem durchläuft und alle bis auf die letzten löscht n Schnappschüsse für dieses Dateisystem.

Z.B. Ich habe zwei Dateisysteme, eines genannt tank und ein anderer rief an sastank. Snapshots werden mit dem Datum benannt, an dem sie erstellt wurden: sastank@AutoD-2011-12-13 so einfach sort Befehl sollte sie in der Reihenfolge auflisten. Ich möchte die täglichen Schnappschüsse der letzten zwei Wochen behalten tank, aber nur die letzten zwei Tage von Schnappschüssen auf sastank.


23
2017-12-14 12:27


Ursprung




Antworten:


Sie können etwas so etwas einfacher finden

zfs list -t snapshot -o name | grep ^tank@Auto | tac | tail -n +16 | xargs -n 1 zfs destroy -r
  • Ausgabe der Snapshot-Liste (nur Namen) mit zfs list -t snaphot -o name
  • Filter, um nur diejenigen zu behalten, die übereinstimmen tank@Auto mit grep ^tank@Auto
  • Die Liste umkehren (vorher von alt nach neu sortiert) mit tac
  • Begrenzen Sie die Ausgabe auf das 16. älteste Ergebnis und folgen Sie mit tail -n +16
  • dann mit zerstören xargs -n 1 zfs destroy -vr

Löschen von Snapshots in umgekehrter Reihenfolge ist angeblich effizienter.

oder in umgekehrter Reihenfolge der Erstellung sortieren

zfs list -t snapshot -o name -S creation | grep ^tank@Auto | tail -n +16 | xargs -n 1 zfs destroy -vr

Teste es mit ...|xargs -n 1 echo 


34
2017-09-01 10:20



Ich denke, das braucht ein sort -r Vor dem sed Befehl. sed scheint den unteren Teil der Liste über die ersten 15 Zeilen hinaus auszugeben, was in der Standardsortierung der jüngste ist. Wenn ich die Liste umblättere, bekomme ich die ältesten Schnappschüsse am unteren Rand. - growse
Er sagte, "das Löschen von Snapshots in umgekehrter Reihenfolge ist angeblich effizienter", also die Sortierreihenfolge. - tgunr


Allgemeinerer Fall, bei dem der neueste Snapshot basierend auf dem Erstellungsdatum und nicht nach dem Namen erstellt wird.

zfs list -H -t snapshot -o name -S creation | head -1

Auf einen bestimmten Dateisystemnamen beschränkt TestOne

zfs list -H -t snapshot -o name -S creation -d1 TestOne | head -1 

-H: Kein Header, so dass die erste Zeile ein Snapshot-Name ist

-t snapshot: Listen Snapshots (Liste kann andere Dinge wie Pools und Volumes auflisten)

-o name: Zeigen Sie die Snapshot-Namenseigenschaft an.

-S creation: Kapital S bezeichnet absteigend Sortieren, basierend auf der Erstellungszeit. Dadurch wird der letzte Schnappschuss als erste Zeile eingefügt.

-d1 TestOne: Sagt, dass Kinder eingeschlossen sind, was verwirrend erscheint, aber es ist, dass, was diesen Befehl angeht, Snapshots von TestOne Kinder sind. Dieser Wille NICHT Listen Sie Snapshots von Volumes innerhalb von TestOne wie z TestOne/SubVol@someSnapshot.

| head -1: Pipe to Kopf und nur die erste Zeile zurück.


16
2018-05-25 23:01



Danke für -d1. Das war der Schlüssel zur Frage "Wie bekomme ich alle Snapshots für einen bestimmten Datensatz?" - Jonathon Reinhart


growse's funktionierte bei OpenIndiana nicht für mich. Es hat -0 für xargs nicht verstanden.

Wenn Sie sort verwenden, sollten Sie beachten, dass es alphabetisch sortiert ist, was nicht unbedingt erwünscht ist, da Sie wahrscheinlich das Neueste finden möchten.

Hier ist Code, der alle außer den letzten Snapshots löscht.

Entferne das 'Echo', um live zu gehen.

RETENTION=5
FS=tank1/test
SNAPNAME=daily-

zfs list -t snapshot -o name | grep ^$FS@${SNAPNAME} |  sed -n -e :a -e '1,${RETENTION}!{P;N;D;};N;ba' | xargs -n 1 echo zfs destroy -r

Quellen: http://sed.sourceforge.net/sed1line.txt


5
2017-11-11 02:21



Upvote, weil jeder, der sed benutzen kann, es verdient. - growse
Nach einem letzten Softwareupdate funktionierte dieser sed-String für mich nicht mehr und er löschte alle Snapshots! schlecht sed! Zum Glück war der Produktionsserver alt und blieb in Sicherheit. Ich benutze jetzt sed -n -e: a -e '1, $ {RETENTION}! {P; N; D;}; N; ba' - Dan Buhler
Ich habe noch nie jemanden so gesehen. - Jason


Dies beantwortet die Frage selbst nicht, aber vergessen Sie nicht, dass Sie Snapshot-Bereiche löschen können.

zfs zerstöre zpool1 / datensatz @ 20160918% 20161107

Würde alle Snapshots von "20160918" bis "20161107" inklusive zerstören. Jedes Ende kann leer bleiben, um "ältest" oder "neuestes" zu bedeuten. Also könntest du etwas kochen, das das "n" ausmacht und dann "...% n" zerstört.

Es tut uns leid, eine alte Frage wieder aufleben zu lassen.


5
2017-12-14 12:58





Ich habe das vielleicht mit etwas Bash-Fu gelöst.

 zfs list -t snapshot -o name | grep ^tank@AutoD- | sort -r | wc -l | xargs -n 1 expr -$NUM_TO_KEEP + | tr -d '\n' | xargs -0 -i bash -c "zfs list -t snapshot -o name | grep ^tank@AutoD- | sort -r | tail -n{} | sort |xargs -t -n 1 zfs destroy -r"

Beeindruckend. Es fühlt sich so falsch an.


3
2017-10-16 16:41





Der Pfad für den Kopf wird unter Solaris benötigt, sollte aber ohne den Pfad auf anderen Distributionen funktionieren.

retention=14
dataset=vmstorage-17/824

zfs list -rt snap -H -o name ${dataset} | \
/usr/gnu/bin/head -n -${retention} | xargs -n 1 zfs destroy -r

1