O ZFS exclui instantâneos com interdependências e clones

9

Abaixo está minha lista de volumes e instantâneos do ZFS, bem como a origem e o clone de cada um.

Quero excluir todos os instantâneos, mas manter todos os sistemas de arquivos. Como posso fazer isso?

Eu tentei zfs promoteseguir tentando excluir cada sistema de arquivos para muitas combinações diferentes dos sistemas de arquivos. Isso muda em torno de onde os instantâneos "vivem"; por exemplo, zfs promote tank/containers/sixmove o instantâneo Fde tank/containers/three@Fpara tank/containers/six@F. Os dados ativos no sistema de arquivos não são modificados (o que eu quero!), Mas ainda não consigo excluir o instantâneo (o que não é o que eu quero).

Um típico zfs destroytentativa diz-me que tem clones dependentes, alguns dos quais (os instantâneos) I não querem destruir, mas outros dos quais (os sistemas de arquivos) I não querem destruir.

Por exemplo.

# zfs destroy tank/containers/six@A
cannot destroy 'tank/containers/six@A': snapshot has dependent clones
use '-R' to destroy the following datasets:
tank/containers/five
tank/containers/two@B
tank/containers/two

No exemplo acima, eu não quero destruir tank/containers/fiveou tank/containers/two, mas se eu tiver zfs promotecinco e dois, ainda não posso destruir nenhum instantâneo. Há uma solução?

# zfs list -t all -o name,origin,clones
NAME                         ORIGIN                       CLONES
tank                         -                            -
tank/containers              -                            -
tank/containers/five         tank/containers/two@B        -
tank/containers/four         tank/containers/six@C        -
tank/containers/one          -                            -
tank/containers/one@E        -                            tank/containers/three
tank/containers/two          tank/containers/six@A        -
tank/containers/two@B        -                            tank/containers/five
tank/containers/six          tank/containers/three@F      -
tank/containers/six@A        -                            tank/containers/two
tank/containers/six@C        -                            tank/containers/four
tank/containers/three        tank/containers/one@E        -
tank/containers/three@F      -                            tank/containers/six
allquixotic
fonte

Respostas:

9

No AFAIK, você precisará copiar esses conjuntos de dados para novos e independentes. A promoção muda apenas em torno de qual conjunto de dados é "pai" vs "filho"; na verdade, ele não quebra nenhuma dependência se você deseja manter os dois.

Por exemplo:

root@box~# zfs snapshot tank/containers/six@1 
root@box~# zfs send tank/containers/six@1 | pv | zfs receive tank/containers/newsix  
root@box~# zfs destroy -R tank/containers/six  
root@box~# zfs destroy tank/containers/three@F 
root@box~# zfs rename tank/containers/newsix tank/containers/six

Não se apresse e tenha certeza do que está fazendo. Especialmente com as exclusões reais.

Essa replicação é bloco por bloco, portanto, se houver algum dado significativo, demorará um pouco. A pvpeça é estritamente opcional, mas fornecerá uma barra de progresso para você olhar enquanto espera.

Talvez também considere o syncoid para automatizar as tarefas de replicação, agora e no futuro. (Obrigatório: sou o autor original desta ferramenta, que é licenciada pela GPLv3 e tem uso gratuito.)

Jim Salter
fonte
Jim, divulgue sua afiliação com o syncoid. Nas regras do site: "Publique respostas boas e relevantes e, se algumas (mas não todas) forem sobre o seu produto ou site, tudo bem. No entanto, você deve divulgar sua afiliação nas suas respostas".
Costin Guș
Feliz por Costin - não percebi que era um grande negócio, pois eu estava vinculando diretamente ao repositório do GitHub do projeto e não dando uma palavra sobre serviços de consultoria.
Jim Salter