Snapper (Português)

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-git
AUR
também está disponível.
Adicionalmente, interfaces gráficas estão disponíveis com
snapper-gui-git
AUR
e
btrfs-assistant
.
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-grub
AUR
refind-btrfs
— Adiciona entradas ao
rEFInd
depois que
snap-pac
fez os snapshots.
https://github.com/Venom1991/refind-btrfs
||
refind-btrfs
AUR
snp
— Envolve qualquer comando shell em um snapshot pré-pós do snapper, por exemplo
snp pacman -Syu
.
https://gist.github.com/erikw/5229436
||
snp
AUR
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-rollback
AUR
. 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,
snappers
AUR
é 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.
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