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 com base no modelo padrão de .
- Criar um subvolume em onde serão armazenados futuros snapshots para esta configuração. O caminho de um 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 .
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 em 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 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:
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 , você precisa alterar . Para que as limpezas ocorram a cada hora em vez de todos os dias, adicione:
[Timer] OnUnitActiveSec=1h
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 e escolha , , , ou . 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 para limpeza, faça:
# snapper -c config create -c number
Veja #Snapshots automáticos da linha do tempo para saber como os snapshots funcionam e veja #Snapshots pré/pós sobre como e 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 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 , habilite . (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 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 em seu arquivo . Agora você deve ser capaz de executar como um usuário normal.
Eventualmente, você deseja poder navegar no diretório 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 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:
- pacupg — Script que envolve atualizações de pacotes e do AUR em snapshots Btrfs e fornece uma maneira fácil de revertê-los.
- 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 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 .
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
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.
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 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 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 .
# mkdir /.snapshots
Agora monte em . 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 .
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 ou .
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 .
Agora, mova para outro local (por ex. ) para salvar uma cópia do sistema atual. Alternativamente, simplesmente delete usando .
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 é o número do snapshot do snapper que você deseja restaurar.
Se foi usado para a opção de entrada de montagem no fstab, em vez de , 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, é 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 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 , , e .
- 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, (veja mlocale) também indexará o diretório 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 indexe sobre ele editando:
Desativar grupos de cotas
Há relatos de lentidão significativa causada por grupos de cotas, se, por exemplo, levar muitos minutos para retornar um resultado, essa pode ser a causa. Consulte .
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 - 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 ).
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