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 tank
und eines genannt sastank
. Snapshots werden mit dem Erstellungsdatum benannt. sastank@AutoD-2011-12-13
Ein einfacher sort
Befehl sollte sie in der angegebenen Reihenfolge auflisten. Ich versuche, die täglichen Schnappschüsse tank
der letzten zwei Wochen beizubehalten , aber nur die Schnappschüsse der letzten zwei Tage sastank
.
sort -r
vor demsed
Befehl.sed
scheint 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.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 KapitalS
bezeichnet 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 zTestOne/SubVol@someSnapshot
.| head -1
: Pipe to Head und nur die erste Zeile zurück.quelle
-d1
. Das war der Schlüssel zur Frage "Wie erhalte ich alle Schnappschüsse für einen bestimmten Datensatz?"Dies beantwortet die Frage selbst nicht vollständig, aber vergessen Sie nicht, dass Sie Schnappschussbereiche löschen können.
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.
quelle
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.
Quellen: http://sed.sourceforge.net/sed1line.txt
quelle
Vielleicht habe ich das mit etwas Bash-Fu gelöst.
Wow. Es fühlt sich so falsch an.
quelle
Der Pfad für head wird unter Solaris benötigt, sollte jedoch unter anderen Distributionen ohne den Pfad funktionieren.
quelle