Snapper (Português)

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.

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:

https://github.com/wesbarnett/snap-pac || snap-pac
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