Borg backup

O que acha de usar um sistema de backup baseados nos principais conceitos de sistemas de controle de versão e que permite a deduplicação, compressão, criptografia dos dados e que tem até mesmo um sistema legal para retenção e rotação dos backups?

É esta a proposta do Borgbackup, um fork de outro sistema com os mesmos recursos chamado Attic e que ficou meio parado no tempo.

Não vou entrar em detalhes sobre o porque você deveria ter um backup dos seus dados, pois há muita gente dizendo isso por ai (eu inclusive, já devo ter dito isso outras vezes), então vou focar apenas nos comando básicos do Borg, que é uma ótima ferramenta de backup, ficando os detalhes para sua pesquisa no site oficial, garimpando no Google ou até mesmo perguntando aqui nos comentários.

A primeira impressão que se tem ao usar o borg é que estamos realmente usando um sistema de controle de versão tal como o Git, Mercurial, Bazaar etc. Isso o torna bastante amigável para quem já usa este tipo de ferramenta no dia-a-dia.

Instalando o Borg

A instalação é bem simples. No Debian e no Ubuntu, por exemplo, você poderia fazê-lo com o comando:

$ sudo apt install borgbackup

Em outros sistemas como Arch Linux, NetBSD e OSX, use a ferramenta de gerenciamento de pacotes adequada.

Criando um repositório

Repositório é como chamamos o diretório que foi devidamente preparado para receber seus backups. Ele pode estar em qualquer lugar no seu disco e preferivelmente em outro disco (bônus de segurança para quem fizé-lo em um disco acessível remotamente em outro computador).

Para exemplificar, neste texto eu vou considerar que o nosso repositório estará em um disco montado em /mnt/backup e com a linha de comandos abaixo, estou criando um repositório chamado “borg” para realizar o backup de todos os meus dados.

$ borg init /mnt/backup/borg

Será solicitado uma senha que posteriormente será exigida para todas as operações neste repositório. Caso você não queira colocar senha no repositório adicione o parâmetro ‘-e none’. Como no exemplo abaixo:

$ borg init -e none /mnt/backup/borg

Veja que em qualquer dos dois casos você ainda não criou qualquer cópia de dados. Você apenas criou o seu repositório que estará pronto para receber seus backups.

Realizando os backups

Com o repositório pronto você pode executar o comando abaixo para realizar um backup da sua pasta Documentos com o nome docs1.

$ borg create /mnt/backup/borg::docs1 Documentos

Caso seu repositório seja protegido por senha, você deverá informá-la para que o borg possa acessá-lo.

É importante observar aqui que todo backup tem um nome. Neste exemplo eu chamei de “docs1”, mas poderia ser qualquer outro nome e em um próximo backup este nome não poderá ser usado novamente, mas se necessário ele pode ser renomeado.

Se você pretende automatizar seus backups de alguma forma pense em um nome que possa ser alterado automaticamente a cada backup. A diante eu darei uma dica de como fazer isso usando algumas “macros” do próprio borg.

Você pode usar o parâmetro “–stats” para ver uma estatística da execução no final do processo.

Se você estiver disposto a perder mais alguns segundos comprimindo os dados para com isso obter melhor ganho de espaço, então use o parâmetro “-C tipo,nível” junto do comando “borg create” para comprimir seus backups.

Os 3 métodos de compressão suportados, cada um com suas vantagens e desvantagens, que estão além do que possa discutir aqui,  são os que seguem:

  • lz4 – velocidade lenta
  • zlib – niveis de 0 a 9 (nivel padrão é 6) – velocidade intermediária
  • lzma – niveis de 0 a 9 (nivel padrão é 6) – velocidade rápida

No exemplo abaixo eu realizo o backup da pasta Músicas, com compressão lzma nível 9 e exibindo as estatísticas do processo ao término.

$ borg create --stats -C lzma,9 /mnt/backup/borg::musicas1 Músicas

Visualizando seus backups

Para verificar seus backups você usa os comandos “list” como no exemplo abaixo onde serão listados todos os backups realizados no repositório /mnt/backup/borg.

$ borg list /mnt/backup/borg

Da mesma forma se você quiser listar os arquivos que foram copiados em determinado backup (basta informá-lo após o caminho para o repositório).

$ borg list /mnt/backup/borg::musicas1

Para informações sobre o uso de espaço por este backup você pode usar o comando “info” como segue:

$ borg info /mnt/backup/borg::musicas1

Recuperando arquivos do backup

Recuperar dados é simples. No exemplo a seguir estou recuperando o arquivo praia-09987.jpg no backup docs1.

$ borg extract /mnt/backup/borg::docs1 Documentos/praia-09987.jpg

Veja que é necessário especificar o caminho completo para o arquivo a ser recuperado e ao término do processo a pasta “Documentos” será recriada com o seu arquivo lá dentro.

Para recuperar mais de um arquivo na mesma linha de comandos podemos especificá-los em sequência, usar caracteres curingas ou  expressão regular como nos exemplos abaixo:

$ borg extract /mnt/backup/borg::docs1 'sh:Documentos/*.doc'
$ borg extract /mnt/backup/borg::docs1 're:Documentos/a([0-9]{1,})\.png'

No primeiro exemplo estou usando caracteres curingas para especificar todos os arquivos de extensão “.doc”. Veja o prefixo “sh:” para especificar o uso de padrão “shell”.

No segundo exemplo estou usando expressão regular (prefixo “re:”) para determinar que apenas os arquivos iniciando com a letra “a” seguida de números e extensão .png.

Montando o repositório como disco local

Se você precisar recuperar arquivos ou executar qualquer tipo de tarefa em um grande número de arquivos é possível montar o seu backup (em modo read only) como se fosse um disco externo, usando o módulo fuse do kernel.

No exemplo abaixo estou montando o backup “musicas1” na pasta “temp” e poderei ter acesso aos arquivos.

$ mkdir temp
$ borg mount /mnt/backup/borg::musicas1 temp

Você poderá entrar na pasta temp e executar qualquer comando que usaria em um disco normal (lembrando que este será um volume somente para leitura).

Ao término das suas atividades desmonte o volume com o comando fusermount como abaixo:

$ fusermount -u temp

Outras tarefas e informações úteis

Criar, visualizar e restaurar backup é apenas a parte mais importe de uma rotina de sysadmin no que tange a backups, mas há outras tarefas que em certos momentos são necessárias como as que seguem.

Renomeando um backup

Caso você precise renomear um backup por qualquer razão, isso é possível com o comando “rename”.

$ borg rename /mnt/backup/borg::docs1 docs-20161230

Repositórios remotos

Como visto nos exemplos anteriores o caminho para backup é sempre especificado por dois elementos separados por “::”. Como no exemplo abaixo:

/caminho/repositorio::etiqueta
  • “/caminho/repositorio” (à esquerda do “::”) é o diretório preparado com o comando “borg init” e onde ficarão seus backups, e
  • “etiqueta” (à direita do “::”) é o nome dado ao seu backup.

Um backup seguro idealmente estará em outro equipamento físico, não apenas outro disco, mas em outro computador, outra sala, outro prédio … se possível em outro planeta.

O Borg permite isso a partir de um simples acesso SSH a outra máquina. Dessa forma, basta que você tenha uma conta SSH para acessar outra máquina.

Seguindo os exemplos anteriores suponhamos que eu precise fazer um backup do notebook no meu desktop (onde já tenho um repositório pronto).

$ borg create welrbraga@desktop/mnt/backup/borg::notebook-20161230 ~

O borg pedirá a senha ssh do usuário welrbraga no Desktop e em seguida pedirá a senha do repositório /mnt/backup/borg. Observe que para isso funcionar o usuário welrbraga (no desktop) deverá ter permissão de escrita no diretório /mnt/backup/borg.

Quebrando o lock após uma falha

É possível que após uma falha ao executar um backup (a máquina travou, faltou energia etc) o seu repositório fique bloqueado e qualquer ação sobre ele resulte em uma mensagem de erro como a mostrada abaixo:

Failed to create/acquire the lock
>>> /mnt/backup/borg/lock.exclusive (timeout).

Caso isso ocorra, apenas mande o borg destravar o repositório.

$ borg break-lock /mnt/backup/borg

Automatizando os nomes dos backups

Ao criar backups é possível usar algumas “macros” para definir nomes automáticos para os backups. São elas: {now}, {utcnow}, {fqdn}, {hostname}, {user}, {pid}, {borgversion}.

Assim, eu posso criar um script de backup genérico contendo o comando abaixo que a cada vez que invocar o script um novo backup será criado com o nome da máquina seguido da data/hora atual:

$ borg create /mnt/backup/borg::{hostname}-{now} ~

Fica uma dica bonus aqui, que quando usar a macro “{now}” você pode personalizar o formato da data/hora. Assim: “{now:%d-%m-%y}” ou “{now:%H%M%S}”. Os códigos são os mesmos usados pelo comando date.

Ignorando arquivos durante o backup

Em muitos casos não faz sentido realizar backups da lixeira, pasta de Thumbnails, arquivos terminados em “~” (geralmente arquivos temprários) etc.

Há dois parâmetros para resolver isso.

–exclude (ou -E) – Indica um padrão para ser desprezado

–exclude-from – Indica um arquivo com a lista de padrões a serem desconsiderados

No exemplo abaixo estou realizando o backup do meu home porém desconsiderando as pastas da Lixeira e de thumbnails.

$ borg create /mnt/backup/borg::{hostname}-{now} ~ -E '.thumbnails' -E '.local/share/Trash'

Variáveis de ambiente

O borg possui uma lista de variáveis de ambiente razoável para simplificar o trabalho de digitar a mesma coisa várias vezes. Uma das minhas preferidas é a “BORG_REPO”.

Toda vez que preciso realizar um conjunto de tarefas em um dado repositório, que ainda não tenha automatizado com algum script, eu faço uso desta variável que define o caminho para o repositório. Se lá no começo do texto eu tivesse digitado a linha abaixo uma vez, isso teria simplificado o meu trabalho, reduzindo a referência ao repositório simplesmente a “::docs1”, “::musicas”, “::{hostname}-{now}” etc.

export BORG_REPO="/mnt/backup/borg"

Outra variável que não posso deixar de mencionar, mas deve ser usada com cautela, é a “BORG_PASSPHRASE” que salva a senha do seu repositório em uma variável de ambiente evitando que ela seja pedida todas as vezes que você executar um comando.

Consulte o manual para outras variáveis.

Removendo backups antigos

O algoritmo do borg faz o seu disco de backup render espaço quase que forma milagrosa, mas em algum momento o espaço chegará ao fim ou próximo disso e então será a hora de remover aqueles backups mais antigos ou usar algum protocolo de retenção que você prefira. Para isso existe o comando prune.

Vale lembrar antes de qualquer exemplo que este é um comando extremamente perigoso afinal de contas você poderá destruir todo o seu backup se informar algo errado.

Os filtros disponíveis são:

  • -H – Horário
  • -d – diário
  • -w – semanal
  • -m – mensal
  • -y – anual
  • -P – prefixo

Agora digamos que eu queira fazer uma faxina no meu repositório mantendo um backup de cada um dos 5 últimos dias e um do mês anterior.

borg prune --list -v -n -d5 -m1

Em outro outro caso, suponha agora que eu queira um backup de cada uma das últimas 10 semanas.

borg prune --list -v -n -w10

Simples assim. 🙂 Observe no entanto o parâmetros em negrito (–list -v -n). Eles pedem que o borg prune seja executado em modo “dry run” (simulação – nada será removido de fato), verboso e listando tudo. Isso é extremamente útil para sabermos o que de fato será excluído.

Para remover de verdade mesmo, remova estes parâmetros, ou ao menos o “-n”, mas fica dica. Sempre use-os quando estiver na dúvida se o seu filtro está correto ou do contrário você poderá remover irreversivelmente o que não deveria.

Outra observação aqui. Veja que eu não informei o caminho para o repositório, partindo do pressuposto que a variável “BORG_REPO” foi declarada antes de executar os comandos acima.

Mais!?

Não há muito mais a se dizer exceto deixar a recomendação de leitura do manual [1] e fazer alguns testes práticos.

Em casa aboli meu velho script de backups baseado em rsync e hardlinks pelo borg que realiza um trabalho muito mais rápido e limpo.

Para se ter uma ideia da vantagem que foi esta mudança, desde que comecei a usar o Borg na prática de verdade (por volta  da segunda quinzena de dez/2016) até hoje, tenho cerca de 30 backups que se fossem mera cópias de pastas ocupariam absurdos 5.5TB. Mas graças aos recursos de compressão e deduplicação do Borg todos eles ocupam pouco menos de 315GB do 1TB disponível em meu HD externo para backups e cada rotina de “borg create” (fazer o backup) para meus 200GB de dados, não costuma durar mais do que 1 ou 2 minutos como se vê nesta saída do “borg info” que mostra informações sobre determinado arquivo de backup.

$ borg info ::weldesk-wbraga-20170221-0825
Enter passphrase for key /media/veracrypt2/borg: 
Name: weldesk-wbraga-20170221-0825
Fingerprint: 528a98eafa68b8758b87b4a40bf6b8caddee200baf173e206d0a02b531f07ec1
Hostname: weldesk
Username: wbraga
Time (start): Tue, 2017-02-21 08:25:48
Time (end):   Tue, 2017-02-21 08:26:52
Command line: /usr/bin/borg create -v --stats --progress --compression=lz4 --exclude-from /tmp/filegUZ0CV ::{hostname}-{user}-{now:%Y%m%d-%H%M} .
Number of files: 176388

                       Original size      Compressed size    Deduplicated size
This archive:              206.96 GB            176.94 GB             18.81 MB
All archives:                5.53 TB              4.73 TB            313.57 GB

                       Unique chunks         Total chunks
Chunk index:                  380980              7309240

[1] Documentação oficial do Borg. http://borgbackup.readthedocs.io

3 thoughts on “Borg backup”

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *