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
Boa tarde!
Simplesmente fantástico o uso da ferramenta
Vou tentar implementar no nosso server!
Obrigado pelas explicações
é possivel agendar backup de forma incremental ?
Opa, na verdade como o borg só transfere aqueles blocos que ainda não estão no servidor todos os backups são incrementais.