Como verificar se todos os instantâneos do ZFS dentro de um pool estão sem espera antes de destruir esse pool

4

Pergunta

Já posso verificar cada snapshot de um sistema de arquivos individualmente, manualmente.

Eu preferiria verificar tudo de uma vez (tudo com um único comando ou script). Por favor:

  • isso pode ser feito com um script?

A resposta deve ser boa para sistemas de arquivos com um espaço dentro do nome.

Antecedentes

Da página man do zfs (8):

zfs holds [-H] [-r] snapshot…

-r Especifica que uma espera com a tag dada é aplicada recursivamente aos instantâneos de todos os sistemas de arquivos descendentes .

Gostaria de saber se os instantâneos são tratados como descendentes de um instantâneo antigo. Não:

Last login: Sat Dec  8 09:02:26 on ttys003
macbookpro08-centrim:~ gjp22$ zfs holds -r gjp22@2012-12-08-081957
NAME                     TAG  TIMESTAMP
macbookpro08-centrim:~ gjp22$ zfs holds -r gjp22@2012-10-28-212255
NAME                     TAG                                           TIMESTAMP
gjp22@2012-10-28-212255  problem with LocalStorage for WOT for Safari  Mon Oct 29  6:44 2012
macbookpro08-centrim:~ gjp22$ zfs hold experiment gjp22@2012-12-08-081957
macbookpro08-centrim:~ gjp22$ zfs holds -r gjp22@2012-10-28-212255
NAME                     TAG                                           TIMESTAMP
gjp22@2012-10-28-212255  problem with LocalStorage for WOT for Safari  Mon Oct 29  6:44 2012
macbookpro08-centrim:~ gjp22$ zfs holds -r gjp22@2012-12-08-081957
NAME                     TAG         TIMESTAMP
gjp22@2012-12-08-081957  experiment  Sat Dec  8  9:04 2012
macbookpro08-centrim:~ gjp22$ zfs holds -r gjp22@2012-10-28-212255
NAME                     TAG                                           TIMESTAMP
gjp22@2012-10-28-212255  problem with LocalStorage for WOT for Safari  Mon Oct 29  6:44 2012
macbookpro08-centrim:~ gjp22$ 

Esclarecimento

Eu não pretendo combinar ambas as verificações e destruição em um único comando ou script. Esta questão é essencialmente sobre as verificações.

    
por Graham Perrin 08.12.2012 / 10:13

3 respostas

4

Não tenho certeza sobre como isso ocorreu em 2012, mas agora você pode verificar a propriedade userrefs :

zfs get userrefs

Para listar todas as retenções em todos os pools:

zfs get -Ht snapshot userrefs | grep -v $'\t'0 | cut -d $'\t' -f 1 | tr '\n' '%code%' | xargs -0 zfs holds

    
por 06.10.2017 / 02:25
1

Para um pool com um único sistema de arquivos

zfs list -H -r -d 1 -t snapshot -o name nameoffilesystem | xargs zfs holds

- isto é, sem -r recursão à direita do canal.

Crédito para calmh em irc://irc.freenode.net/#zfs

Exemplo de trabalho

Para um sistema de arquivos sem espaço em seu nome:

macbookpro08-centrim:~ gjp22$ zfs list -H -r -d 1 -t snapshot -o name gjp22 | xargs zfs holds
load: 4.82  cmd: zfs 43038 running 0.59u 3.28s
NAME                     TAG                                           TIMESTAMP
gjp22@2012-10-28-212255  problem with LocalStorage for WOT for Safari  Mon Oct 29  6:44 2012
gjp22@2012-12-08-081957  experiment                                    Sat Dec  8  9:04 2012

Houve um Controle - T para ver como as coisas estavam rodando.

Para ser completo, devo declarar que é um filho de gjp22 . Mas acho que esse exemplo (sem atenção aos descendentes) prova a eficácia do comando.

Exemplos não funcionais

Para um sistema de arquivos chamado Pocket Time Machine (espaços dentro de seu nome), nenhum dos seguintes comandos é bem-sucedido:

zfs list -H -r -d 1 -t snapshot -o name "tall/backups/zhandy/Pocket Time Machine" | xargs zfs holds

zfs list -H -r -d 1 -t snapshot -o name tall/backups/zhandy/Pocket\ Time\ Machine | xargs zfs holds

Saída:

'tall/backups/zhandy/Pocket' is not a snapshot
'Time' is not a snapshot
cannot open 'tall/backups/zhandy/Pocket': dataset does not exist
cannot open 'Time': dataset does not exist
cannot open 'Machine@2012-09-18-210251': dataset does not exist
cannot open 'tall/backups/zhandy/Pocket': dataset does not exist
cannot open 'Time': dataset does not exist
cannot open 'Machine@2012-09-23-0330': dataset does not exist

... e assim por diante.

Isto é implicitamente uma questão dentro de uma resposta, desculpe ... alguém com um bom conhecimento de linha de comando (não eu) pode ser capaz de tornar esta resposta mais inteligente sem eu me desviar para uma questão separada. Eu vou procurar conselhos no chat.

    
por 08.12.2012 / 16:26
1

Para um pool com vários sistemas de arquivos

zfs list -H -r -d 1 -t snapshot -o name nameoffilesystematroot | xargs -n1 zfs holds -H -r

Crédito para calmh em irc://irc.freenode.net/#zfs , mas não tenho certeza se a sintaxe precisa de um pouco mais de trabalho.

Para mim, com uma hierarquia de sistema de arquivos simples (somente um filho) e relativamente poucos instantâneos (atualmente dezessete do filho), o comando parece não chegar a uma conclusão. Exemplo:

macbookpro08-centrim:~ gjp22$ zfs list -H -r -d 1 -t snapshot -o name gjp22 | xargs zfs holds -r
load: 4.94  cmd: zfs 39152 running 17.80u 112.52s
load: 3.73  cmd: zfs 39152 running 55.01u 349.29s
load: 3.15  cmd: zfs 39152 running 167.48u 1061.47s
load: 4.59  cmd: zfs 39152 running 267.57u 1697.49s
load: 5.19  cmd: zfs 39152 running 372.19u 2355.99s
load: 5.29  cmd: zfs 39152 running 432.89u 2736.79s

A partir da outra resposta , com atenção apenas para o sistema de arquivos filho:

macbookpro08-centrim:~ gjp22$ zfs list -H -r -d 1 -t snapshot -o name gjp22/intrigue | xargs zfs holds
NAME                              TAG  TIMESTAMP
macbookpro08-centrim:~ gjp22$ 

- e essa saída é quase imediata.

O ZFS aqui é o ZEVO Community Edition 1.1.1.

    
por 08.12.2012 / 16:06