ZFS: Snapshots – Parte 05

 

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.

  1. 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  -
  2. 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.

Leitor voraz e um dos administradores do GNU/Linux Brasil no Whatsapp, facebook, youtube e nesse dito site: www.gnulinuxbrasil.com.br

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *