Jak usunąć wszystkie migawki ZFS oprócz ostatnich [n]?

24

Obecnie co noc i co tydzień robię migawki mojego serwera NAS opartego na ZFS, co kilka razy uratowało mi tyłek. Jednak chociaż tworzenie migawki odbywa się automatycznie (z crona), usuwanie starych migawek jest nadal zadaniem ręcznym. Oczywiście istnieje ryzyko, że jeśli zostanę potrącony przez autobus lub zadanie ręczne nie zostanie wykonane, w NAS zabraknie miejsca na dysku.

Czy ktoś ma jakieś dobre sposoby / skrypty, których używają do zarządzania liczbą migawek przechowywanych w swoich systemach ZFS? Idealnie, chciałbym skrypt, który iteruje wszystkie migawki dla danego systemu plików ZFS i usuwa wszystkie oprócz ostatnich n migawek dla tego systemu plików.

Np. Mam dwa systemy plików, jeden o nazwie, tanka drugi o nazwie sastank. Migawki są nazywane wraz z datą ich utworzenia: sastank@AutoD-2011-12-13więc proste sortpolecenie powinno wyświetlać je w kolejności. Chcę zachować codzienne migawki z ostatnich 2 tygodni tank, ale tylko migawki z ostatnich dwóch dni sastank.

rosnąć
źródło

Odpowiedzi:

35

Możesz znaleźć coś takiego nieco prostszego

zfs list -t snapshot -o name | grep ^tank@Auto | tac | tail -n +16 | xargs -n 1 zfs destroy -r
  • wyświetla listę migawek (tylko nazwy) za pomocą zfs list -t snaphot -o name
  • filtruj, aby zachować tylko te, które pasują tank@Autodogrep ^tank@Auto
  • odwróć listę (poprzednio posortowaną od najstarszej do najnowszej) za pomocą tac
  • ogranicz wyjście do 16. najstarszego wyniku i kontynuuj za pomocą tail -n +16
  • następnie zniszcz za pomocą xargs -n 1 zfs destroy -vr

usuwanie migawek w odwrotnej kolejności jest podobno bardziej wydajne.

lub sortuj w odwrotnej kolejności tworzenia

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

Przetestuj za pomocą ...|xargs -n 1 echo

dnozay
źródło
1
Myślę, że to wymaga sort -rwcześniejszego sedpolecenia. sedwydaje się wyświetlać dolną część listy poza pierwszymi 15 liniami, które w domyślnym sortowaniu są najnowsze. Przerzucenie listy oznacza, że ​​otrzymuję najstarsze migawki na dole.
growse
1
Stwierdził, że „usuwanie migawek w odwrotnej kolejności jest podobno bardziej wydajne”, a zatem porządek sortowania.
tgunr
19

Bardziej ogólny przypadek uzyskania najnowszej migawki na podstawie daty utworzenia, a nie nazwy.

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

Zakres do określonej nazwy systemu plików TestOne

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

-H: Brak nagłówka, więc pierwszy wiersz jest nazwą migawki

-t snapshot: Lista migawek (lista może zawierać listę innych rzeczy, takich jak pule i woluminy)

-o name: Wyświetla właściwość nazwy migawki.

-S creation: Kapitał Soznacza sortowanie malejące na podstawie czasu utworzenia. To umieszcza najnowszą migawkę jako pierwszą linię.

-d1 TestOne: Mówi, że obejmują dzieci, co wydaje się mylące, ale dlatego, że jeśli chodzi o to polecenie, migawki TestOne są dziećmi. To NIE wyświetli migawek woluminów w TestOne, takich jak TestOne/SubVol@someSnapshot.

| head -1: Rura do głowy i zwraca tylko pierwszą linię.

AaronLS
źródło
1
Dzięki za -d1. To był klucz do pytania „Jak uzyskać wszystkie migawki dla danego zestawu danych?”
Jonathon Reinhart
8

To całkowicie nie odpowiada na samo pytanie, ale nie zapomnij, że możesz usunąć zakresy migawek.

ZFS zniszczyć Zpool1 / zestaw danych @ 20160918% 20161107

Zniszczę wszystkie migawki z „20160918” na „20161107” włącznie. Każdy koniec można pozostawić pusty, co oznacza „najstarszy” lub „najnowszy”. Więc możesz ugotować coś, co wymyśli „n”, a następnie zniszcz „…% n”

Przepraszamy za wskrzeszenie starego pytania.

Lundman
źródło
Działa to jak urok i 100 razy szybciej niż zaakceptowana odpowiedź!
NeilWang
5

growse nie działało dla mnie na OpenIndiana. Nie zrozumiał -0 dla xargs.

Jeśli używasz sortowania, pamiętaj, że sortuje on alfabetycznie, co może nie być pożądane, ponieważ prawdopodobnie chcesz znaleźć najnowsze.

Oto kod, który usunie wszystkie oprócz ostatnich migawek.

Usuń „echo”, aby uruchomić.

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

Źródła: http://sed.sourceforge.net/sed1line.txt

Dan Buhler
źródło
2
Głosujcie, bo każdy, kto może używać sed tak, zasługuje na to.
growse
2
Po ostatniej aktualizacji oprogramowania ten łańcuch znaków przestał dla mnie działać i zaczął usuwać wszystkie migawki! zły sed! Na szczęście serwer produkcyjny był stary i pozostawał bezpieczny. Teraz używam sed -n -e: a -e '1, $ {RETENTION}! {P; N; D;}; N; ba'
Dan Buhler
Nigdy nie widziałem takiego SEDa.
Jason
3

Być może rozwiązałem to za pomocą bash-fu.

 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"

Łał. Czuje się tak źle.

rosnąć
źródło
1

Ścieżka do głowy jest potrzebna w systemie Solaris, ale powinna działać bez ścieżki w innych dystrybucjach.

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
źródło