Prevenção virtual 102 : usando backups pessoais versionados (the even cheaper way)

October 29, 2007 on 11:49 pm | In DebianBR, backup, rsync, scripts, tips | 18 Comments


Não, ao contrário do que você pensa, esse não é mais um daqueles posts chatos que falam sobre a importância de backups, puxa suas orelhas por você não estar em dia com eles e lhe deixa com uma sensação de estar fazendo algo errado e de que, a qualquer momento, poderá sofrer com isso.

Mesmo você sabendo que isso tudo é a mais pura verdade, ninguém precisa ficar lhe lembrando sobre isso a todo momento e lhe aporrinhando com esse assunto. Backup sempre é e sempre será esquecido. É comum (ou, ao menos, deveria ser) não esquecermos dos backups de nossos clientes, nossos servidores e de nossos sistemas mais importantes, mas nossos backups pessoais sempre acabam ficando esquecidos.

Por quê ? Simples : porque soluções que você simplesmente coloca para funcionar uma única vez e esquece, deixando que tudo seja feito de forma transparente, são difíceis de serem encontradas e, quando o são, não são das mais fáceis para serem implementadas nem compreeendidas.

Para resolver esse problema, eu escrevi um pequeno script shell simples que uso para meus backups pessoais. Funciona de maneira estremamente simples e me permite ter backups diários ou com periodicidades ainda menores (diversas vezes por dia, por exemplo) ocupando um espaço desprezível em relação ao que seria ocupado caso backups completos fossem utilizados e, de quebra, me permite restaurar a cópia de qualquer arquivo desejado, de uma data específica desejada, sem que seja necessário sair por aí procurando por inúmeras fitas ou sem que seja necessário que eu seja obrigado a usar soluções de backup que criam catálogos de backup e que possuam um uso mais complexo.

Facilidade, esse é o objetivo. Minha solução usa o famoso rsync para implementar backups diferenciais e, mais especificamente, faz uso da opção –link-dest do rsync para criar cópias posteriores dos backups utilizando hardlinks para os arquivos originais da primeira cópia do backup.

O script cria um diretório para cada uma de suas invocações, contendo o dia, mês, ano, hora, minuto e segundo de sua execução e inclui o backup nesse diretório. Dessa forma, você possui uma visão completa de todo o seu conteúdo de backup sob esse diretório representando esse momento no tempo. Sim, o conteúdo completo, tudo, sem mais nem menos, com a diferença de que não é a cada execução que tudo é realmente copiado para o novo diretório criado.

Somente os arquivos/diretórios modificados são criados e, para o restante, somente hardlinks para os arquivos originais criados como resultado da primeira execução do script são criados. O script mantém um arquivo de controle para saber qual o momento no tempo da última execução e ter uma base para saber a partir de qual ponto deve checar por modificações em suas próximas invocações.

O único detalhe é que, como hardlinks não funcionam entre dispositivos (ou seja, entre partições ou discos diferentes), todos os backups devem ser armazenados no mesmo disco ou partição de disco. Sempre, sem fugir dessa regra para não ter uma bela surpresa com espaço em disco astronômico sendo consumido sem necessidade.

Se interessou ? Ok, mão na massa então. Simplesmente copie o script postado em sua íntegra abaixo e grave-o com um nome qualquer desejado, torne-o executável e preencha o valor das variáveis target, sources e lastrunfile, ou seja, o local onde os backups serão criados, qual o conteúdo que será alvo de backup e qual a localizaçao do arquivo que conterá a informação do último momento no tempo em que a última execução do backup foi feita (ele é criado automaticamente na primeira execução do script), respectivamente.

O conteúdo completo do script é o seguinte :


#!/bin/bash

# Name : versioned-backup.sh
# Author : André Luís Lopes
# Description : A simple shell script which deploys a nice
# versioned backup solution based on rsync’s
# hardlinking capability
# Version : 0.0.1
# License : GPL (General Public License) version 2

# Where’s the rsync binary
rsync=”/usr/bin/rsync”
# The miminal rsync options we absolutely want
rsyncminopts=”-az”
# Our target directory, i.e, where we are going
# to dump everything
target=”/backup/archives”
# A space separated list of directories we want to backup
sources=”/etc /home”
# The current point-in-time (pit), constructed in
# the DD-MM-YYY-HH:MM:SS format
pit=$(date +%d-%m-%Y-%H:%M:%S)
# The file which will store the point-in-time
# information about our last snapshot run
lastrunfile=”/backup/archives/lastrun”

# Ensure it works even when running for the very first
# time, as we create the target place where we are going
# to dump everything and the base directory to where we
# are going to hardlink further snapshots to
if [ ! -f $lastrunfile ] ; then
mkdir -p $target/$pit || true
echo $pit > $lastrunfile
for source in $sources ; do
$rsync $rsyncminopts $source $target/$pit
done
exit 0
fi

# As we are dealing with situations where we would need to
# be able to create snapshots every second and be able to
# differentiate between them, we create our point-in-time
# target directory for the current second
mkdir -p $target/$pit

# Create the snapshot of every source directory from the
# current point-in-time into our specific point-in-time
# directory and hardlink all the files and directories which
# where not modified since the last snapshot run
for source in $sources ; do
$rsync $rsyncminopts –link-dest=$target/$(cat $lastrunfile) $source $target/$pit/
done

# Store the identification of our last run into a non-volatile
# place so we can use it on further runs
echo $pit > $lastrunfile

Simplesmente execute o script de tempos em tempos, provavelmente agendado no crontab de um usuário que tenha permissões de ler os arquivos que sofrerão o backup e gravar no local onde o backup deverá ser armazenado (o root serve, mas não necessariamente precisa ser ele). É isso. Simples e fácil. Deixe o cron, o anacron ou seu agendador de tarefas preferido sendo executado e esqueça de suas preocupações com backup.

Lógico que o script pode melhorar bastante. Na verdade, tenho algumas idéias para melhorá-lo já a algum tempo, mas venho usando essa mesma solução a alguns meses sem maiores problemas e ela vem me atendendo bem, por isso nunca achei que fosse necessário melhorá-lo.

Funciona tão bem que algumas pessoas na empresa onde trabalho utilizam uma versão modificada dele, a qual eu modifiquei levemente para que o transporte ssh do rsync fosse utilizado, de forma que eu tivesse a mesma funcionalidade, mas em um ambiente em que o dispositivo que recebe o backup é uma partição de disco em um servidor remoto.

A imaginação é o limite. O que achou da solução ? Gostou ? Comente suas impressões e me deixe feliz ou profundamente triste caso minha solução seja muito tosca :-)

Adicionar esta noticia no Linkk Adicionar aos Favoritos do T
echnorati

Atualizando uma imagem ISO semanal do Debian

October 14, 2006 on 6:35 pm | In DebianBR, Portuguese, isoupdate, littletips, rsync, tips | 2 Comments


Se você é como eu, está sempre (ou melhor, sempre que tem tempo) testando as imagens semanais do Debian. Toda semana são geradas imagens ISO em formato de CD e DVD da próxima versão a ser lançada do Debian, no caso, o Etch.

Como eu ainda não tenho nenhuma máquina com leitor de DVD, uso a imagem ISO no formato de CD e somente a imagem para o primeiro CD. No caso dessa imagem, a mesma é gerada toda segunda-feira (portanto, melhor procurá-la na terça-feira dependendo do seu fuso horário) e disponibilizada junto às outras 20 imagens, completando um conjunto de 21 imagens de binários disponíveis (por isso só uso a primeira).

É meio insano ter que fazer o download de todos os (aproximadamente) 650MB toda a semana sendo que na verdade pouca coisa muda de uma semana para outra. Por isso, me acostumei a usar o rsync para atualizar a imagem da última semana para a imagem da semana em vigor.

Dessa forma, aproveita-se todo o conteúdo da última semana que não foi modificado na imagem da semana atual e o que é trazido são somente as diferenças entre as duas imagens. Resolvi colocar isso aqui para que as pessoas fiquem sabendo como isso pode ser feito e também porque eu vivo esquecendo como isso pode ser feito, o que me obriga a reaprender a cada semana.

Ok, sem mais delongas, o truque é, estando no diretório onde a imagem da última semana foi colocada, executar o comando a seguir, com um usuário que tenha permissões de gravação no arquivo que representa a imagem ISO já existente :

rsync -avz –progress –inplace rsync://cdimage.debian.org/cdimage/weekly-builds/i386/iso-cd/debian-testing-i386-binary-1.iso .

Importante : O comando acima deve ser executado em uma única linha. Reparem também o ponto no final do comando, ele é necessário.

Após executar o comando acima, um acompanhador de progresso será exibido para que você possa ter uma idéia de como o processo de atualização anda. Esse método economiza banda de rede e tempo.

Adicionar esta noticia no Linkk Adicionar aos Favoritos do T
echnorati

Powered by WordPress with Pool theme design by Borja Fernandez.
Entries and comments feeds. Valid XHTML and CSS. ^Top^