Jump to content
From ArchWiki
Status de tradução: Esse artigo é uma tradução de Snapper. Data da última tradução: 2022-08-02. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

Artigos relacionados

- Btrfs
- mkinitcpio

Snapper é uma ferramenta criada por Arvin Schnell, do openSUSE, que ajuda no gerenciamento de snapshots de subvolumes do Btrfs e volumes LVM com provisionamento thin. Ele pode criar e comparar snapshots, reverter entre snapshots e oferecer suporte a linhas de tempo de snapshots automáticos.

## Instalação

Instale o pacote snapper. A versão de desenvolvimento snapper-gitAUR também está disponível.

Adicionalmente, interfaces gráficas estão disponíveis com snapper-gui-gitAUR e btrfs-assistantAUR.

## Criando uma nova configuração

Antes de criar uma configuração do snapper para um subvolume Btrfs, o subvolume já deve existir. Caso contrário você deve criá-lo antes de gerar uma configuração do snapper.

Para criar uma nova configuração do snapper chamada `config` para o subvolume Btrfs em `/caminho/para/subvolume`, execute:

    # snapper -c config create-config /caminho/para/subvolume

Isso vai:

- Criar um arquivo de configuração em `/etc/snapper/configs/config` com base no modelo padrão de `/usr/share/snapper/config-templates`.
- Criar um subvolume em `/caminho/para/subvolume/.snapshots` onde serão armazenados futuros snapshots para esta configuração. O caminho de um snapshot é `/caminho/para/subvolume/.snapshots/#/snapshot`, onde `#` é o número do snapshot.
- Adicionar `config` a `SNAPPER_CONFIGS` em `/etc/conf.d/snapper`.

Por exemplo, para criar um arquivo de configuração para o subvolume montado em `/`, execute:

    # snapper -c root create-config /

Neste ponto, a configuração está ativa. Se seu daemon cron estiver em execução, o snapper fará #Snapshots automáticos da linha do tempo. Se você não usar um daemon cron, precisará usar o serviço e o timer do systemd. Consulte #Ativar/desativar.

Veja também snapper-configs(5).

## Tirando snapshots

### Snapshots automáticos da linha do tempo

Uma linha do tempo de snapshots pode ser criada com um número configurável de snapshots mantidos de hora em hora, diariamente, semanalmente, mensalmente e anualmente. Quando a linha do tempo está habilitada, por padrão, um snapshot é criado uma vez por hora. Uma vez por dia, os snapshots são limpos pelo algoritmo de limpeza da linha do tempo. Consulte as variáveis `TIMELINE_*` em snapper-configs(5) para detalhes.

#### Ativar/desativar

Se você tiver um daemon cron, esse recurso deve iniciar automaticamente. Para desativá-lo, edite o arquivo de configuração correspondente ao subvolume que você não deseja que tenha esse recurso e defina:

    TIMELINE_CREATE="no"

Se você não tiver um daemon cron, poderá usar os units fornecidos pelo systemd. Inicie e habilite `snapper-timeline.timer` para iniciar a linha de tempo automática do snapshot. Além disso, inicie e habilite `snapper-cleanup.timer` para limpar periodicamente os snapshots mais antigos.

Nota: Se você tiver um daemon cron e também habilitar os units do systemd, isso pode resultar na criação de snapshots duplicados. Se você deseja desabilitar a integração do cron enquanto estiver usando os units do systemd, uma solução possível é não instalar os arquivos cron do pacote snapper por meio das opções de configuração NoExtract e NoUpgrade do pacman. Veja [1].

#### Definir limites de snapshots

As configuração padrão manterá 10 snapshots por hora, 10 diários, 10 mensais e 10 anuais. Você pode querer mudar isso na configuração, especialmente em subvolumes ocupados como `/`. Consulte #Evitando lentidão.

Aqui está uma seção de exemplo de uma configuração chamada `config` com apenas 5 snapshots por hora, 7 diários, nenhum mensal e nenhum anual:

    /etc/snapper/configs/config

    TIMELINE_MIN_AGE="1800"
    TIMELINE_LIMIT_HOURLY="5"
    TIMELINE_LIMIT_DAILY="7"
    TIMELINE_LIMIT_WEEKLY="0"
    TIMELINE_LIMIT_MONTHLY="0"
    TIMELINE_LIMIT_YEARLY="0"

#### Alterar as frequências de snapshot e limpeza

Se você estiver usando os timers fornecidos pelo systemd, você pode editá-los para alterar a frequência de snapshots e limpeza.

Por exemplo, ao editar o `snapper-timeline.timer`, adicione o seguinte para tornar a frequência a cada cinco minutos, em vez de por hora:

    [Timer]
    OnCalendar=
    OnCalendar=*:0/5

Ao editar `snapper-cleanup.timer`, você precisa alterar `OnUnitActiveSec`. Para que as limpezas ocorram a cada hora em vez de todos os dias, adicione:

    [Timer]
    OnUnitActiveSec=1h

Veja systemd/Timers e systemd#Arquivos drop-in.

### Snapshots manuais

#### Snapshots individuais

Por padrão, o snapper tira snapshots do tipo single, não tendo nenhum relação especial com outros snapshots.

Para tirar um snapshot de um subvolume manualmente, faça:

    # snapper -c config create --description desc

O comando acima não usa nenhum algoritmo de limpeza, portanto, o snapshot é armazenado permanentemente ou até ser excluído.

Para definir um algoritmo de limpeza, use o sinalizador `-c` após `create` e escolha `number`, `timeline`, `pre`, ou `post`. `number` configura o snapper para remover periodicamente snapshots que excederam um número definido no arquivo de configuração. Por exemplo, para criar um snapshot que usa o algoritmo `number` para limpeza, faça:

    # snapper -c config create -c number

Veja #Snapshots automáticos da linha do tempo para saber como os snapshots `timeline` funcionam e veja #Snapshots pré/pós sobre como `pre` e `post` funcionam.

#### Snapshots pré/pós

O outro tipo de snapshots - snapshots pré/pós - devem ser criados como um par, um antes e outro depois de uma alteração significativa (como uma atualização do sistema).

Se a mudança significativa é/pode ser invocada por um único comando, então `snapper create --command` pode ser usado para invocar o comando e criar automaticamente snapshots pré/pós:

    # snapper -c config create --command comando

Alternativamente, os snapshots pré/pós podem ser criados manualmente.

Primeiro crie um snapshot pré:

    # snapper -c config create -t pre -p

Anote o número do novo snapshot (é necessário para criar o instantâneo pós).

Agora execute as ações que irão modificar o sistema de arquivos (por exemplo, instalar um novo programa, atualizar, etc.).

Finalmente, crie o snapshot pós, substituindo `N` pelo número do snapshot pré:

    # snapper -c config create -t post --pre-number N

Veja também #Envolvendo transações do pacman em snapshots.

### Snapshots na inicialização

Para que o snapper tire um snapshot da configuração do `root`, habilite `snapper-boot.timer`. (Esses snapshots são do tipo single.)

## Gerenciando snapshots

### Listar configurações

Para listar todas as configurações que foram criadas faça:

    # snapper list-configs

### Listar snapshots

Para listar os snapshots tirados para uma determinada configuração config, faça:

    # snapper -c config list

### Excluir um snapshot

Para excluir um snapshot de número `N` faça:

    # snapper -c config delete N

Vários snapshots podem ser excluídos de uma só vez. Por exemplo, para excluir os snapshots 65 e 70 da configuração root, faça:

    # snapper -c root delete 65 70

Para excluir um intervalo de snapshots, neste exemplo entre os snapshots 65 e 70 da configuração root, faça:

    # snapper -c root delete 65-70

Para imediatamente liberar o espaço usado pelo(s) snapshot(s), use `--sync`:

    # snapper -c root delete --sync 65

Nota: Ao excluir um snapshot pré, você deve sempre excluir o snapshot pós correspondente e vice-versa.

### Acesso para usuários não root

Cada configuração é criada com o usuário root e, por padrão, apenas o root pode vê-la e acessá-la.

Para poder listar os snapshots de uma determinada configuração para um usuário específico, basta alterar o valor de `ALLOW_USERS` em seu arquivo `/etc/snapper/configs/config`. Agora você deve ser capaz de executar `snapper -c config list` como um usuário normal.

Eventualmente, você deseja poder navegar no diretório `.snapshots` com um usuário, mas o proprietário deste diretório deve permanecer como root. Portanto, você deve alterar o proprietário do grupo por um grupo contendo o usuário de seu interesse, como `users` por exemplo:

    # chmod a+rx .snapshots
    # chown :users .snapshots

## Dicas e truques

### Envolvendo transações do pacman em snapshots

Existem alguns pacotes usados para criar snapshots automaticamente em uma transação do pacman:

- snap-pac — Faz com que o pacman use automaticamente o snapper para criar snapshots pré/pós como o YaST do openSUSE. Usa hooks do pacman.

  https://github.com/wesbarnett/snap-pac || snap-pac

- snap-pac-grub — Adicionalmente atualiza as entradas do GRUB para o grub-btrfs depois que o snap-pac fez os snapshots. Também usa hooks do pacman.

  https://github.com/maximbaz/snap-pac-grub || snap-pac-grubAUR

- refind-btrfs — Adiciona entradas ao rEFInd depois que snap-pac fez os snapshots.

  https://github.com/Venom1991/refind-btrfs || refind-btrfsAUR

- snp — Envolve qualquer comando shell em um snapshot pré-pós do snapper, por exemplo `snp pacman -Syu`.

  https://gist.github.com/erikw/5229436 || snpAUR

#### Backup de partições boot não Btrfs em transações do pacman

Se sua partição `/boot` estiver em um sistema de arquivos não Btrfs (por exemplo, um ESP), você não poderá fazer backups do snapper com ela. Veja Backup do sistema#Snapshots e partição /boot para copiar a partição de inicialização automaticamente em uma atualização do kernel para sua raiz Btrfs com um hook. Isso também funciona bem junto com snap-pac.

### Backup incremental para unidade externa

Algumas ferramentas podem usar o snapper para automatizar backups. Consulte Backup incremental para unidade externa.

### Layout do sistema de arquivos sugerido

Nota: O layout a seguir se destina a não ser usado com `snapper rollback`, mas destina-se a aliviar os problemas inerentes de #Restaurando / para seu snapshot anterior. Veja este este tópico do fórum.

Aqui está um layout de sistema de arquivos sugerido para restaurar facilmente o subvolume `@` que está montado na raiz de um snapshot anterior:

Layout do sistema de arquivos
Subvolume | Ponto de montagem
--- | ---
@ | /
@home | /home
@snapshots | /.snapshots
@var_log | /var/log

    subvolid=5
      |
      ├── @ -|
      |     diretórios contidos:
      |       ├── /usr
      |       ├── /bin
      |       ├── /.snapshots
      |       ├── ...
      |
      ├── @home
      ├── @snapshots
      ├── @var_log
      └── @...

Os subvolumes `@...` são montados em qualquer outro diretório que deva ter seu próprio subvolume.

Nota:

- Ao tirar um snapshot de `@` (montado na raiz `/`), outros subvolumes não são incluídos no snapshot. Mesmo que um subvolume esteja aninhado abaixo de `@`, um snapshot de `@` não o incluirá. Crie configurações de snapper para subvolumes adicionais além de `@` dos quais você deseja manter snapshots.
- Devido a uma limitação do Btrfs, os volumes de snapshot não podem conter arquivos swap. Coloque o arquivo swap em outro subvolume ou crie uma partição swap.

Se você restaurar seu sistema para um snapshot anterior de `@`, esses outros subvolumes não serão afetados. Por exemplo, isso permite que você restaure `@` para um snapshot anterior enquanto mantém seu `/home` inalterado, devido ao subvolume que está montado em `/home`.

Esse layout permite que o utilitário snapper tire snapshots regulares de `/`, ao mesmo tempo que facilita a restauração de `/` de um Arch Live CD se ele não inicializar.

Nesse cenário, após a configuração inicial, o snapper não precisa de alterações e funcionará conforme o esperado.

#### Configuração do snapper e do ponto de montagem

Supõe-se que o subvolume `@` esteja montado na raiz `/`. Também é assumido que `/.snapshots` não é montado e não existe como pasta, isso pode ser garantido pelos comandos:

    # umount /.snapshots
    # rm -r /.snapshots

Então crie uma nova configuração para `/`. O Snapper create-config cria automaticamente um subvolume `.snapshots` com o subvolume raiz `@` como seu pai, que não é necessário para o layout do sistema de arquivos sugerido e pode ser excluído.

    # btrfs subvolume delete /.snapshots

Após excluir o subvolume, recrie o diretório `/.snapshots`.

    # mkdir /.snapshots

Agora monte `@snapshots` em `/.snapshots`. Por exemplo, para um sistema de arquivos localizado em `/dev/sda1`:

    # mount -o subvol=@snapshots /dev/sda1 /.snapshots

Para tornar esta montagem permanente, adicione uma entrada ao seu fstab.

Ou se você tiver uma entrada fstab existente, remonte o subvolume do snapshot:

    # mount -a

Dê à pasta a permissão `750`.

Isso fará com que todos os snapshots criados pelo snapper sejam armazenados fora do subvolume `@`, para que `@` possa ser facilmente substituído a qualquer momento sem perder os snapshots do snapper.

#### Restaurando / para seu snapshot anterior

Para restaurar o `/` usando um dos snapshots do snapper, primeiro inicialize em um USB/CD live do Arch Linux.

Monte o subvolume de nível superior (subvolid=5). Ou seja, omita quaisquer sinalizadores de montagem `subvolid` ou `subvol`.

Encontre o número do snapshot que você deseja recuperar:

    grep -r '<date>' /mnt/@snapshots/*/info.xml

A saída deve se parecer com isso, há uma linha para cada snapshot, para que você possa combinar facilmente o número e a data de cada snapshot.

     /mnt/@snapshots/número/info.xml: <date>2021-07-26 22:00:00</date>

Lembre-se do `número`.

Agora, mova `@` para outro local (por ex. `/@.broken`) para salvar uma cópia do sistema atual. Alternativamente, simplesmente delete `@` usando `btrfs subvolume delete /mnt/@`.

Crie um snapshot de leitura e gravação (read-write) do snapshot somente leitura (read-only) que o snapper tirou:

    # btrfs subvolume snapshot /mnt/@snapshots/número/snapshot /mnt/@

Onde `número` é o número do snapshot do snapper que você deseja restaurar.

Se `subvolid` foi usado para a opção de entrada de montagem `/` no fstab, em vez de `/caminho/para/subvolume`, altere subvolid no para o novo subvolid.

    # btrfs subvolume list /mnt | grep @$ # Verifique o novo subvolid
    # grep "/ " /mnt/@/etc/fstab          # Verifique o subvolid antigo
    # vim /mnt/@/etc/fstab                # Edite

Altere também a configuração do bootloader, como refind_linux.conf, se ele contiver o subvolid.

Dica: Você também pode usar a ferramenta de reversão automática feita para este layout: snapper-rollbackAUR. Edite o arquivo de configuração em `/etc/snapper-rollback.conf` para corresponder ao seu sistema.

### Excluindo arquivos de snapshots

Se você deseja excluir um arquivo ou pasta específica de snapshots anteriores sem excluir os próprios snapshots, snappersAUR é um script que adiciona essa funcionalidade ao Snapper. Esse script também pode ser usado para manipular snapshots anteriores de várias outras maneiras que o Snapper não suporta atualmente.

Se você deseja remover um arquivo sem usar um script extra, basta fazer com que seu subvolume do snapshot tenha permissões de leitura e escrita, o que você pode fazer com:

    # btrfs property set /caminho/para/.snapshots/<num_do_snapshot>/snapshot ro false

Verifique se `ro=false`:

    # btrfs property get /caminho/para/.snapshots/<num_do_snapshot>/snapshot
    ro=false

Agora você pode modificar arquivos em `/caminho/para/.snapshots/<num_do_snapshot>/snapshot` normalmente. Você pode usar um loop de shell para trabalhar em seus snapshots em massa.

### Evitando lentidão

Manter muitos snapshots por um longo período de tempo em um sistema de arquivos ocupado como `/`, onde muitas atualizações do sistema acontecem ao longo do tempo, pode causar lentidão séria. Você pode evitar isso:

- Criando subvolumes para coisas que não valem a pena serem capturadas, como `/var/cache/pacman/pkg`, `/var/abs`, `/var/tmp` e `/srv`.
- Editando as configurações padrão para snapshots por hora/diário/mensal/anual ao usar #Snapshots automáticos da linha do tempo.

#### updatedb

Por padrão, `updatedb` (veja mlocale) também indexará o diretório `.snapshots` criado pelo snapper, o que pode causar lentidão grave e uso excessivo de memória se você tiver muitos snapshots. Você pode impedir que `updatedb` indexe sobre ele editando:

    /etc/updatedb.conf

    PRUNENAMES = ".snapshots"

#### Desativar grupos de cotas

Há relatos de lentidão significativa causada por grupos de cotas, se, por exemplo, `snapper ls` levar muitos minutos para retornar um resultado, essa pode ser a causa. Consulte [2].

Para determinar se os grupos de cotas estão ou não habilitados, use o seguinte comando:

    # btrfs qgroup show /

Os grupos de cotas podem ser desativados com:

    # btrfs quota disable /

#### Contar o número de snapshots

Se a desativação de grupos de cotas não ajudou na lentidão, pode ser útil contar o número de snapshots, isso pode ser feito com:

    # btrfs subvolume list -s / | wc -l

### Preservando arquivos de log

É recomendado criar um subvolume para `/var/log` para que os snapshots de `/` o excluam. Dessa forma, se um snapshot de `/` for restaurado, seus arquivos de log também não serão revertidos para o estado anterior. Isso facilita a solução de problemas.

## Solução de problemas

### Logs do snapper

O Snapper grava todas as atividades em `/var/log/snapper.log` - verifique este arquivo primeiro se achar que algo está errado.

Se você tiver problemas com snapshots de hora em hora/diários/semanais, a causa mais comum para isso até agora foi que o serviço cronie (ou qualquer daemon cron que você está usando) não estava em execução.

### Erro de E/S

Se você receber um 'IO Error' ao tentar criar um snapshot, certifique-se de que o diretório .snapshots associado ao subvolume que você está tentando fazer o snapshot é um subvolume por si só.

Outra causa possível é que o diretório .snapshots não tem root como proprietário (Você encontrará `Btrfs.cc(openInfosDir):219 - .snapshots must have owner root` em `/var/log /snapper.log`).

### Snapshots órfãos causando desperdício de espaço em disco

É possível que os instantâneos sejam 'perdidos', onde ainda existem no disco, mas não são rastreados pelo snapper. Isso pode resultar em uma grande quantidade de espaço em disco desperdiçado e não contabilizado. Para verificar isso, compare a saída de

    # snapper -c <config> list

com

    # btrfs subvolume list -o <subvolume pai>/.snapshots

Qualquer subvolume na segunda lista que não esteja presente na primeira é órfão e pode ser excluído manualmente.

## Veja também

- Página inicial do Snapper
- Portal openSUSE Snapper
- Página inicial do Btrfs
- Linux.com: Snapper: o Ultimate Btrfs Snapshot Manager do SUSE

Category:

- File systems (Português)