Come eliminare tutti tranne gli ultimi [n] snapshot ZFS?


25

Attualmente sto fotografando il mio NAS basato su ZFS ogni notte e settimanalmente, un processo che mi ha salvato il culo alcune volte. Tuttavia, mentre la creazione dell'istantanea è automatica (da cron), l'eliminazione di vecchie istantanee è ancora un'attività manuale. Ovviamente c'è il rischio che se vengo investito da un bus, o se l'attività manuale non viene eseguita, il NAS esaurirà lo spazio su disco.

Qualcuno ha qualche buon modo / script che usano per gestire il numero di istantanee memorizzate sui loro sistemi ZFS? Idealmente, vorrei uno script che scorre tutte le istantanee per un determinato file system ZFS ed elimina tutte le ultime n le istantanee per quel file system.

Ad esempio, ho due filesystem, uno chiamato tanke l'altro chiamato sastank. Le istantanee prendono il nome con la data in cui sono state create: sastank@AutoD-2011-12-13quindi un semplice sortcomando dovrebbe elencarle in ordine. Sto cercando di mantenere attive le istantanee giornaliere delle ultime 2 settimane tank, ma solo quelle degli ultimi due giorni sastank.

Risposte:


35

Potresti trovare qualcosa di simile un po 'più semplice

zfs list -t snapshot -o name | grep ^tank@Auto | tac | tail -n +16 | xargs -n 1 zfs destroy -r
  • visualizza l'elenco di istantanee (solo nomi) con zfs list -t snaphot -o name
  • filtrare per mantenere solo quelli che corrispondono tank@Autocongrep ^tank@Auto
  • inverti l'elenco (precedentemente ordinato dal più vecchio al più recente) con tac
  • limitare l'uscita al 16 ° risultato più vecchio e seguire con tail -n +16
  • quindi distruggere con xargs -n 1 zfs destroy -vr

la cancellazione di istantanee in ordine inverso è presumibilmente più efficiente.

o ordina in ordine inverso rispetto alla creazione

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

Provalo con ...|xargs -n 1 echo


1
Penso che questo abbia bisogno di un sort -rprima del sedcomando. sedsembra generare la fine dell'elenco oltre le prime 15 righe, che nell'ordinamento predefinito è la più recente. Capovolgere l'elenco significa che ho le istantanee più vecchie in fondo.
Crescere il

1
Ha affermato che "eliminare le istantanee in ordine inverso è presumibilmente più efficiente", quindi l'ordinamento.
tgunr,

19

Caso più generale di acquisizione dell'istantanea più recente in base alla data di creazione, non in base al nome.

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

Scoped ad un nome di filesystem specifico TestOne

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

-H: Nessuna intestazione in modo che la prima riga sia un nome di istantanea

-t snapshot: Elenca le istantanee (l'elenco può elencare altre cose come pool e volumi)

-o name: Visualizza la proprietà del nome dell'istantanea.

-S creation: Il capitale Sindica l' ordinamento decrescente , in base al tempo di creazione. Questo mette l'istantanea più recente come prima riga.

-d1 TestOne: Dice includere i bambini, il che sembra confuso ma è perché per quanto riguarda questo comando, le istantanee di TestOne sono bambini. Questo NON elencherà le istantanee dei volumi all'interno di TestOne come TestOne/SubVol@someSnapshot.

| head -1: Pipe to head e restituisce solo la prima riga.


1
Grazie per il -d1. Questa era la chiave della domanda "Come posso ottenere tutte le istantanee per un determinato set di dati?"
Jonathon Reinhart,

9

Questo non risponde totalmente alla domanda stessa, ma non dimenticare che puoi eliminare intervalli di istantanee.

zfs destroy zpool1 / dataset @ 20160918% 20161107

Distruggerebbe tutte le istantanee da "20160918" a "20161107" incluso. Entrambe le estremità possono essere lasciate vuote, per indicare "più vecchio" o "più nuovo". Quindi potresti cucinare qualcosa che capisce la "n" e poi distruggere "...% n" ..

Scusa se resuscito una vecchia domanda.


1
Funziona in modo affascinante e 100 volte più veloce della risposta accettata!
NeilWang,

5

growse's non ha funzionato su OpenIndiana per me. Non ha capito -0 per xargs.

Se si utilizza l'ordinamento, tenere presente che ordina alfabeticamente ciò che potrebbe non essere desiderato, poiché probabilmente si desidera trovare il più recente.

Ecco il codice che eliminerà tutti tranne gli ultimi snapshot.

Rimuovi l'eco per andare in diretta.

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

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


2
Voto perché chiunque può usare sed in quel modo se lo merita.
Crescere

2
Dopo un recente aggiornamento del software, quella stringa sed ha smesso di funzionare per me e ha iniziato a eliminare tutte le istantanee! cattiva sed! Fortunatamente il server di produzione era vecchio ed è rimasto al sicuro. Ora uso sed -n -e: a -e '1, $ {RETENTION}! {P; N; D;}; N; ba'
Dan Buhler,

Non ho mai visto nessuno SED così.
Jason,

3

Potrei aver risolto questo con un po 'di 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"

Wow. Sembra così sbagliato.


1

Il percorso per la testa è necessario su Solaris, ma dovrebbe funzionare senza il percorso su altre distro.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.