Snapper (Portuguê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
aSNAPPER_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.
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
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.
- 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.
- snp — Envolve qualquer comando shell em um snapshot pré-pós do snapper, por exemplo
snp pacman -Syu
.
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
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:
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.
- 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.
/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 locate) 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.