Como excluir todos os últimos snapshots do ZFS [n]?

23

Atualmente estou fotografando meu NAS baseado em ZFS todas as noites e semanalmente, um processo que salvou minha bunda algumas vezes. No entanto, enquanto a criação do instantâneo é automática (do cron), a exclusão de instantâneos antigos ainda é uma tarefa manual. Obviamente, existe o risco de que, se eu for atropelado por um ônibus, ou a tarefa manual não seja executada, o NAS ficará sem espaço em disco.

Alguém tem algum bom caminho / script usado para gerenciar o número de instantâneos armazenados em seus sistemas ZFS? Idealmente, gostaria de um script que percorra todos os instantâneos de um determinado sistema de arquivos ZFS e exclua todos os últimos snapshots n para esse sistema de arquivos.

Por exemplo Eu tenho dois sistemas de arquivos, um chamado tank e outro chamado sastank . Os instantâneos são nomeados com a data em que foram criados: sastank@AutoD-2011-12-13 , portanto, um comando simples sort deve listá-los em ordem. Eu quero manter as últimas duas semanas de snapshots diários em tank , mas apenas os últimos dois dias de snapshots em sastank .

    
por growse 14.12.2011 / 13:27

6 respostas

34

Você pode achar algo parecido com isso um pouco mais simples

zfs list -t snapshot -o name | grep ^tank@Auto | tac | tail -n +16 | xargs -n 1 zfs destroy -r
  • exibe a lista de instantâneos (somente nomes) com zfs list -t snaphot -o name
  • filtrar para manter apenas os que correspondem a tank@Auto com grep ^tank@Auto
  • inverta a lista (anteriormente classificada de mais antiga para mais recente) com tac
  • limita a saída ao 16º resultado mais antigo e segue com tail -n +16
  • , em seguida, destrua com xargs -n 1 zfs destroy -vr

excluir instantâneos na ordem inversa é supostamente mais eficiente.

ou classifica em ordem inversa da criação

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

Teste com ...|xargs -n 1 echo

    
por 26.07.2016 / 09:11
17

Caso mais geral de obter o instantâneo mais recente com base na data de criação, não pelo nome.

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

Escopo para um nome de sistema de arquivos específico TestOne

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

-H : sem cabeçalho para que a primeira linha seja um nome de instantâneo

-t snapshot : listar instantâneos (a lista pode listar outras coisas, como pools e volumes)

-o name : exibe a propriedade do nome da captura instantânea.

-S creation : Capital S denota classificação descendente , com base no tempo de criação. Isso coloca o instantâneo mais recente como a primeira linha.

-d1 TestOne : Says include children, o que parece confuso, mas é porque, no que diz respeito a este comando, os snapshots do TestOne são crianças. Isto irá NÃO listar instantâneos de volumes dentro do TestOne como TestOne/SubVol@someSnapshot .

| head -1 : canaliza a cabeça e só retorna a primeira linha.

    
por 01.09.2013 / 12:20
6

Isso não responde totalmente à pergunta em si, mas não se esqueça de que você pode excluir intervalos de instantâneos.

zfs destroy zpool1/dataset@20160918%20161107

Destruir todos os instantâneos de "20160918" a "20161107", inclusive. Cada final pode ser deixado em branco, para significar "mais antigo" ou "mais novo". Então você pode cozinhar algo que descubra o "n" e depois destruir "...% n" ..

Desculpe ressuscitar uma pergunta antiga.

    
por 11.11.2016 / 03:21
5
O

growse não funcionou no OpenIndiana para mim. Não entendeu -0 para xargs.

Se usar a classificação, esteja ciente de que ela classifica em ordem alfabética, o que pode não ser desejado, já que você provavelmente está querendo encontrar as mais recentes.

Aqui está o código que irá excluir todos, exceto os últimos instantâneos.

Remova o 'eco' para ir ao vivo.

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

Fontes: link

    
por 26.05.2012 / 01:01
3

Eu posso ter resolvido isso com algum 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"

Uau. Parece tão errado.

    
por 14.12.2011 / 13:58
1

O caminho para a cabeça é necessário no Solaris, mas deve funcionar sem o caminho em outras distros.

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
    
por 16.10.2012 / 18:41