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

24

Momentan mache ich nächtliche und wöchentliche Schnappschüsse von meinem ZFS-basierten NAS, ein Vorgang, der mir ein paar Mal den Arsch gerettet hat. Während die Erstellung des Snapshots automatisch (von Cron) erfolgt, ist das Löschen alter Snapshots immer noch eine manuelle Aufgabe. Offensichtlich besteht die Gefahr, dass dem NAS der Speicherplatz ausgeht, wenn ich von einem Bus angefahren werde oder die manuelle Aufgabe nicht ausgeführt wird.

Hat jemand eine gute Möglichkeit / ein gutes Skript, um die Anzahl der auf seinen ZFS-Systemen gespeicherten Snapshots zu verwalten? Idealerweise hätte ich gerne ein Skript, das alle Snapshots für ein bestimmtes ZFS-Dateisystem durchläuft und alle Snapshots mit Ausnahme der letzten n für dieses Dateisystem löscht .

ZB habe ich zwei Dateisysteme, eines genannt tankund eines genannt sastank. Snapshots werden mit dem Erstellungsdatum benannt. sastank@AutoD-2011-12-13Ein einfacher sortBefehl sollte sie in der angegebenen Reihenfolge auflisten. Ich versuche, die täglichen Schnappschüsse tankder letzten zwei Wochen beizubehalten , aber nur die Schnappschüsse der letzten zwei Tage sastank.

wachsen
quelle

Antworten:

35

Vielleicht finden Sie so etwas etwas einfacher

zfs list -t snapshot -o name | grep ^tank@Auto | tac | tail -n +16 | xargs -n 1 zfs destroy -r
  • Mit die Liste der Schnappschüsse (nur Namen) ausgeben zfs list -t snaphot -o name
  • filtern , um nur diejenigen zu halten , dass Spiel tank@Automitgrep ^tank@Auto
  • kehren Sie die Liste (vorher sortiert vom ältesten zum neuesten) mit um tac
  • Die Ausgabe auf das 16. älteste Ergebnis begrenzen und mit bestätigen tail -n +16
  • dann zerstören mit xargs -n 1 zfs destroy -vr

Das Löschen von Schnappschüssen 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

Testen Sie es mit ...|xargs -n 1 echo

dnozay
quelle
1
Ich denke das braucht einen sort -rvor dem sedBefehl. sedscheint das Ende der Liste nach den ersten 15 Zeilen auszugeben, die in der Standard-Sortierung die aktuellste ist. Durch Umblättern der Liste erhalte ich die ältesten Schnappschüsse unten.
wachsen
1
"Das Löschen von Schnappschüssen in umgekehrter Reihenfolge ist angeblich effizienter", so die Sortierreihenfolge.
Tgunr
19

Allgemeiner Fall, bei dem der aktuellste Schnappschuss nicht nach Namen, sondern nach Erstellungsdatum abgerufen wird.

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

Gültig für einen bestimmten Dateisystemnamen TestOne

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

-H: Keine Überschrift, sodass die erste Zeile ein Schnappschussname ist

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

-o name: Zeigt die Snapshot-Namenseigenschaft an.

-S creation: Das Kapital Sbezeichnet eine absteigende Sortierung, basierend auf der Erstellungszeit. Dadurch wird der aktuellste Schnappschuss als erste Zeile eingefügt.

-d1 TestOne: Sagt include children, was verwirrend erscheint, aber es liegt daran, dass für diesen Befehl Snapshots von TestOne Kinder sind. Dies listet KEINE Snapshots von Volumes in TestOne auf, wie z TestOne/SubVol@someSnapshot.

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

AaronLS
quelle
1
Danke für die -d1. Das war der Schlüssel zur Frage "Wie erhalte ich alle Schnappschüsse für einen bestimmten Datensatz?"
Jonathon Reinhart
8

Dies beantwortet die Frage selbst nicht vollständig, aber vergessen Sie nicht, dass Sie Schnappschussbereiche löschen können.

zfs destroy zpool1 / dataset @ 20160918% 20161107

Würde alle Schnappschüsse von "20160918" bis einschließlich "20161107" zerstören. Jedes Ende kann leer gelassen werden, um "ältestes" oder "neuestes" zu bedeuten. Sie könnten also etwas erfinden, das das "n" herausfindet und dann "...% n" zerstört.

Tut mir leid, eine alte Frage wiederzubeleben.

lundman
quelle
Das funktioniert charmant und 100-mal schneller als die akzeptierte Antwort!
NeilWang,
5

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

Wenn Sie sort verwenden, beachten Sie, dass alphabetisch sortiert wird, was möglicherweise nicht erwünscht ist, da Sie wahrscheinlich die neueste Sortierung finden möchten.

Hier ist Code, der alle bis auf die letzten Schnappschüsse löscht.

Entfernen Sie 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

Dan Bühler
quelle
2
Upvote, weil jeder, der sed so benutzen kann, es verdient.
wachsen
2
Nach einem kürzlichen Software-Update funktionierte dieser sed-String nicht mehr für mich und löschte alle Schnappschüsse! schlimme sed! Zum Glück war der Produktionsserver alt und in Sicherheit. Ich benutze jetzt sed -n -e: a -e '1, $ {RETENTION}! {P; N; D;}; N; ba'
Dan Buhler
Ich habe noch nie jemanden gesehen, der so eine SED hat.
Jason
3

Vielleicht habe ich das 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"

Wow. Es fühlt sich so falsch an.

wachsen
quelle
1

Der Pfad für head wird unter Solaris benötigt, sollte jedoch unter anderen Distributionen ohne den Pfad 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
Josh Simon
quelle