Quem usa Mac OS X e conhece o Time Machine, sabe como essa ferramenta é muito interessante. Ela realiza backup incremental dos arquivos organizando-os por data de backup, de forma que somente os arquivos modificados sejam copiados novamente, podendo gerar um grande intervalo de retenção de dados.
O Oops!Backup é uma boa solução para o Windows e que realiza exatamente a mesma tarefa. Já fiz uma breve análise deste software em um post anterior, disponível aqui.
Para Linux existe o FlyBack, mas não gostei muito pelo fato de eu ter achado pouco eficiente, algumas vezes ter deixado de funcionar comigo e também pela necessidade de exigir o ambiente gráfico Gnome do computador, o que ia contra as minhas necessidades de utilizá-lo em um servidor de arquivos sem ambiente gráfico algum.
Por causa disso, resolvi fazer um simples shellscript para atender essa minha necessidade e estou disponibilizando abaixo. O script é muito simples e funciona da seguinte forma:
- Verifica se o HD com o label correto está conectado na porta USB e com o nome de dispositivo correto.
- Verifica em seus arquivos de controle a data do último backup.
- O rsync compara os arquivos e copia para a nova data somente os arquivos novos ou que foram alterados.
- O rsync faz hard link em todos os arquivos que não foram alterados.
Hard link? O que é isso?
Existem basicamente dois links mais utilizados pelos usuários Linux: o symbolic link e o hard link.
Explicando de forma simples e objetiva sem entrar em grandes detalhes técnicos, o symbolic link é uma forma de adicionar novas entradas para um arquivo em lugares diferentes do disco rígido, de forma que o usuário possa utilizar em lugares diferentes, ou seja, ele é apenas uma referência para um outro arquivo. Esse recurso é muito utilizado no Linux, principalmente para referenciar bibliotecas que precisam estar localizadas em diversos lugares sem a necessidade de ficar gerando duplicidade de arquivos.
Em compensação, se o arquivo original for apagado, todos os symbolic links ficarão quebrados, pois a sua referência não existirá mais.
Já o hard link permite ao usuário referenciar vários nomes para um mesmo conteúdo gravado nos inodes do disco rígido. Isso quer dizer que seria como uma forma de dar vários nomes para o mesmo conteúdo gravado no disco, o que não gera links quebrados, pois a referência é ao conteúdo e não a outro arquivo.
Vamos tentar entender com as imagens abaixo bem simplificadas:
Symbolic Link:
Repare que os Symbolic Links 1 e 2 apontam para um arquivo e se o mesmo for apagado, os dois ficarão quebrados, pois dependem do arquivo real para existirem.
Hard Link:
Repare que os dois Hard Links apontam para um mesmo conteúdo de disco, isso quer dizer que se um for apagado, o outro continuará existindo com o mesmo conteúdo.
Dessa forma, o nosso sistema de backup baseado em rsync e hard links permitirá que o usuário navegue com o seu gerenciador de arquivos nas datas em que o backup foi realizado e acessar todos os seus arquivos exatamente da forma que eles estavam.
Vamos então à implementação:
1) Instale o rsync e suas dependências.
# apt-get install rsync
2) Crie um diretório onde você guardará o script. Eu guardei em /usr/local/backup
# mkdir /usr/local/backup
3) Copie o arquivo backup.sh
para o diretório /usr/local/backup
# cp ~/backup.sh /usr/local/backup
4) Crie um arquivo dentro de /usr/local/backup com os diretórios que você deseja fazer backup. Coloque um em cada linha. Exemplo:
/home
/etc
/opt
5) Edite o arquivo backup.sh e altere as variáveis PATH_DESTINO e MY_PATH, sendo que a primeira é para onde o backup deverá ser gerado (pode ser um disco externo) e MY_PATH é o caminho onde o script foi instalado, nesse caso, /usr/local/backup.
PATH_DESTINO="/media/backup"
MY_PATH="/usr/local/backup"
6) Execute o script e veja se no diretório de destino foi criado um diretório com a data e a hora que o backup foi rodado. Haverá um diretório com uma data estranha somente para que o primeiro backup seja executado sem erro.
# /usr/local/backup/backup.sh
# ls /media/backup/
20000101-010101 20110217-203854
7) Execute novamente o script e veja se um novo diretório será criado com a data e hora que o backup foi rodado novamente.
# /usr/local/backup/backup.sh
# ls
20000101-010101 20110217-203854 20110217-205043
8) Repare nos tamanhos dos diretórios. Se somente o primeiro backup estiver com o tamanho grande e os demais pequenos, isso quer dizer que o backup diferencial funcionou perfeitamente. Um pequeno espaço em disco será ocupado apenas para a criação dos nomes dos hard links.
#cd /media/backup
# du -hs *
4.0K 20000101-010101
117M 20110217-203854
1.2M 20110217-205043
Se você entrar no diretório 20110217-203854 você terá todos os arquivos que existiam nessa data e horário e o mesmo para o diretório 20110217-205043, contendo as modificações realizadas nesse período.
E o que acontece se apagar os diretórios anteriores de 20110217-205043?
Você apenas ficará com todos os arquivos que foram feitos backup daquela data e as modificações anteriores serão apagadas.
Vou tentar explicar com a tabela abaixo:
- No dia 14/10/10, existiam apenas aqueles três arquivos, cujo o seu status está sendo marcado na cor vermelha apenas para acompanhar a evolução dos mesmos.
- No dia 15/10/10, o arquivo Doc1.doc foi modificado (por isso a cor mudou para exemplificar) e o arquivo Novo.doc foi criado.
- No dia 16/10/10, os arquivos Mais1.doc e Mais2.doc foram criados e os demais permaneceram com o mesmo status.
- No dia 17/10/10, apenas o arquivo Lixo.doc foi apagado.
- No dia 18/10/10, o arquivo teste.txt e Mais2.doc foram alterados (a cor mudou somente para exemplificar) e os demais permaneceram como estavam.
- No dia 19/10/10, tudo permaneceu como estava.
Supomos que você apague todos os diretórios anteriores ao dia 17/10/10. Você perderá definitivamente o arquivo Lixo.doc, mas ainda terá as versões dos arquivos teste.txt e Mais2.doc do dia 17/10/10.
Em resumo, qualquer diretório de backup que você apagar, será removido apenas o status daquela data e hora que o backup foi feito.
Recomendo colocar esse script no crontab para rodar a cada 2 horas.
# crontab -e
0 */2 * * * /usr/local/backup/backup.sh
Experimente utilizar essa forma de backup e navegue pelos diretórios de backup. Surpreenda-se pela praticidade. :-)
Nenhum comentário:
Postar um comentário