Snapshot é uma das razões principais de muitos usuários usarem zfs.
Um snapshot é uma cópia somente leitura de um volume(dataset) ou ainda de um sistema de arquivos. ele é a cópia exata, um espelho do estado em que se encontrava o volume quando o snapshot foi tirado.
Pense no snapshot como uma fotografia tirada do mundo. Mesmo que o mundo mude constantemente a fotografia é uma imagem exata de como ele era
Snapshots são criados de forma muito rápida e, inicialmente não consome não consome nenhum espaço adicional dentro do pool. Mas, conforme dados vão sendo alterados dentro do dataset(volume) o snapshot passa a consumir mais dados.
Podemos dar qualquer nome aos snapshots.
Uma vez criados os snapshots eles ficam dentro da pasta “.zfs” que por sua vez está pasta raiz. Por exmeplo, se criarmos um snapshot do volume meuPool/documentos a pasta “.zfs” contendo o snapshot irá ficar dentro de “/meuPool/documentos/.zfs”.
Praticando entendemos melhor:
No Ambiente Atual
Depois de alguns posts sobre ZFS estamos com o seguinte cenário:
elder@server02:/$ sudo zfs list NAME USED AVAIL REFER MOUNTPOINT meuPool 75,1M 4,89M 26K /meuPool meuPool/contratos 41,7M 4,89M 41,7M /trabalho/contrato meuPool/documentos 24K 4,89M 24K /meuPool/documentos meuPool/filmes 24K 4,89M 24K /meuPool/filmes meuPool/fotos 24K 4,89M 24K /meuPool/fotos
Realcei o volume meuPool/contratos que está com 75,1 MB usados.
Vendo seu conteúdo:
elder@server02:/$ ls -1 /trabalho/contrato/ 'Sleep Away (2).mp3' 'Sleep Away (3).mp3' 'Sleep Away - Cópia (2).mp3' 'Sleep Away - Cópia (3).mp3' 'Sleep Away - Cópia (4).mp3' 'Sleep Away - Cópia (5).mp3' 'Sleep Away - Cópia (6) - Cópia.mp3' 'Sleep Away - Cópia (6).mp3' 'Sleep Away.mp3'
Arquivos .mp3 em uma pasta destinada a contratos não faz lógica, mas aqui é apenas um laboratório 🙂 de testes. Ok?
Criado os Snapshots
Para criarmos um snapshot usamos a opção “zfs snapshot nome_do_DataSet@nome_snapshot“. Um “@” separa o snapshot do dataset.
- Criaremos um snapshot para o dataset meuPool/contratos
elder@server02:/$ sudo zfs snapshot meuPool/contratos@ontem
Visualize os snapshots com “zfs list -t snapshot”
elder@server02:/$ sudo zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT meuPool/contratos@ontem 0B - 41,7M -
- Vamos criar um snapshot para cada volume(dataset)
elder@server02:/$ sudo zfs snapshot meuPool/documentos@ontem elder@server02:/$ sudo zfs snapshot meuPool/filmes@ontem elder@server02:/$ sudo zfs snapshot meuPool/fotos@ontem elder@server02:/$ sudo zfs snapshot meuPool/testes@ontem
listando os snapshots
elder@server02:~$ sudo zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT meuPool/contratos@ontem 0B - 41,7M - meuPool/documentos@ontem 0B - 24K - meuPool/filmes@ontem 0B - 24K - meuPool/fotos@ontem 0B - 24K -
Criando snapshots Recursivamente
Podemos usar a opção “-r” para criar snapshots de forma recursiva. Por exemplo, acima, criamos snapshots manualmente, um por um, para todos os datasets. Ao invés de criarmos um a um poderíamos usar “zfs snapshot -r meuPool@hoje” e seria criado snapshot não somente para meuPool para para todos os seus filhos.
sudo zfs snapshot -r meuPool@hoje
Excluindo os Arquivos “Por Engano” e Restaurando o Snapshot
Para trazer de volta um snapshot usamos a opção rollback: “zfs rollback…”
Vamos supor que, por acidente, todo o conteúdo da pasta /trabalho/contrados foi excluído.
Remova o conteúdo da pasta,
elder@server02:~$ sudo rm -rf /trabalho/contrato/*
está vazia a pasta
elder@server02:~$ ls -a /trabalho/contrato/ . ..
Verificamos que há um snapshot de ontem
elder@server02:~$ sudo zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT meuPool/contratos@ontem 41,7M - 41,7M - meuPool/documentos@ontem 0B - 24K - meuPool/filmes@ontem 0B - 24K - meuPool/fotos@ontem 0B - 24K -
Vamos trazer o conteúdo de volta
elder@server02:~$ sudo zfs rollback meuPool/contratos@ontem
Vamos verificar a pasta novamente
elder@server02:~$ ls -1 /trabalho/contrato/ 'Sleep Away (2).mp3' 'Sleep Away (3).mp3' 'Sleep Away - Cópia (2).mp3' 'Sleep Away - Cópia (3).mp3' 'Sleep Away - Cópia (4).mp3' 'Sleep Away - Cópia (5).mp3' 'Sleep Away - Cópia (6) - Cópia.mp3' 'Sleep Away - Cópia (6).mp3' 'Sleep Away.mp3'
Acessando a Pasta “.zfs”
Sabemos que no Linux todo arquivo ou pasta iniciado com um “.” é um arquivo/pasta oculto. Para visualizarmos temos que usar “ls -A” ou “ls -a”.
Como dito acima, os snapshots ficam dentro da pasta “.zfs” e essa pasta fica dentro da raiz. Por exemplo, temos os snapshots
elder@server02:~$ sudo zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT meuPool/contratos@ontem 14K - 41,7M - meuPool/documentos@ontem 0B - 24K - meuPool/filmes@ontem 0B - 24K - meuPool/fotos@ontem 0B - 24K -
Pegando como exemplo “meuPool/documentos@ontem”, veja onde está montado o volume correspondente a “meuPool/documentos”
elder@server02:~$ df -hT Sist. Arq. Tipo Tam. Usado Disp. Uso% Montado em ........ meuPool zfs 38M 128K 38M 1% /meuPool meuPool/contratos zfs 80M 42M 38M 53% /trabalho/contrato meuPool/fotos zfs 38M 128K 38M 1% /meuPool/fotos meuPool/documentos zfs 38M 128K 38M 1% /meuPool/documentos meuPool/filmes zfs 38M 128K 38M 1% /meuPool/filmes
O snapshot estará em “/meuPool/documentos/.zfs”
elder@server02:~$ ls -A /meuPool/documentos/.zfs/snapshot/ ontem
acima, apareceu o snapshot “ontem”.
Destruindo o Snapshot
Para destruir um snapshot usarmos “zfs destroy caminho_snapshot”
elder@server02:~$ sudo zfs destroy meuPool/documentos@ontem
É importante falar que se um dataset não poderá ser removido enquanto houver snapshots dentro dele.
elder@server02:~$ sudo zfs destroy meuPool/fotos cannot destroy 'meuPool/fotos': filesystem has children use '-r' to destroy the following datasets: meuPool/fotos@ontem
O snapshot é considerado um filho para o dataset.
Já o dataset “meuPool/documentos” pode ser destruido já que eliminamos seu snapshot
elder@server02:~$ sudo zfs destroy meuPool/documentos
Também podemos usar a opção “-r” para destruir um dataset e seus filhos automaticamente. Abaixo irá ser destruído meuPool e todos os seus filhos:
elder@server02:~$ sudo zfs destroy -r meuPool
Renomeando Snapshots
Usamos rename para renomear
elder@server02:~$ sudo zfs rename meuPool/filmes@ontem meuPool/filmes@ontem03_01_2021
elder@server02:~$ sudo zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT meuPool/contratos@ontem 14K - 41,7M - meuPool/filmes@ontem03_01_2021 0B - 24K - meuPool/fotos@ontem 0B - 24K -
Algumas Considerações sobre Rollback
- Trazer de volta(rollback) um snapshot fará com que tudo que foi feito do momento da criação do snapshot para frente, até o momento atual, será perdido.
- O sistema de arquivos ZFS só aceita que tragamos de volta o snapshot mais recente, ou seja, se eu quero trazer um snapshot mais antigo terei que remover todos os mais recentes depois dele
- Ainda após termos excluídos os snapshots mais recentes teremos que desmontar o dataset para poder fazer o rollback do snapshot mais antigo.
Criamos um arquivo qualquer em /meuPool/filmes
elder@server02:~$ sudo touch /meuPool/filmes/testesFilmes.txt
Criamos um snapshot
elder@server02:~$ sudo zfs snapshot meuPool/filmes@hoje
listamos os snapshots
elder@server02:~$ sudo zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT meuPool/contratos@ontem 14K - 41,7M - meuPool/filmes@ontem03_01_2021 14K - 24K - meuPool/filmes@hoje 0B - 24K - meuPool/fotos@ontem 0B - 24K -
Vamos trazer o snapshot “ontem03_01_2021”
elder@server02:~$ sudo zfs rollback meuPool/filmes@ontem03_01_2021 cannot rollback to 'meuPool/filmes@ontem03_01_2021': more recent snapshots or bookmarks exist use '-r' to force deletion of the following snapshots and bookmarks: meuPool/filmes@hoje
Conclusão
Snapshots não consomem quanse nada de processador, memória e até espaço físico. No caso de espaço físico pode depender de alguns fatores. Porém é uma boa prática sempre gerar snapshost. Há até alguns programas ou scripts de terceiros feits para essa tarefa. Podemos citar o zfs-auto-snapshot e o znapzend.
One Comment to “ZFS: Snapshots – Parte 05”