Você está na página 1de 5

Escrevendo Scripts de Backup

Durante a dcada de 70, vrios utilitrios foram desenvolvidos para fazer backup de arquivos armazenados em servidores Unix. Os computadores da poca eram muito limitados, por isso os utilitrios precisavam ser simples e eficientes, e deveriam existir meios de agendar os backups para horrios de pouco uso das mquinas. Sugiram ento utilitrios como o tar e o gzip e mais tarde ferramentas como o rsync. Estes utilitrios eram to eficientes que continuaram sendo usados ao longo do tempo. Por incrvel que possa parecer, so usados sem grandes modificaes at os dias hoje. Naturalmente, existem muitos utilitrios amigveis de backup, como o Amanda (para servidores) e o Konserve (um utilitrios mais simples, voltado para usurios domsticos). Mas, internamente, eles continuam utilizando como base o o dump, tar, gzip e outros trigenrios. Mais incrvel ainda, que estes utilitrios possuem uma penetrao relativamente pequena. A maior parte dos backups ainda so feitos atravs de scripts personalizados, escritos pelo prprio administrador. E, novamente, estes scripts utilizam o tar, gzip, rsync e outros. justamente sobre estes scripts personalizados que vou falar aqui. Vamos comear com alguns exemplos simples: Para compactar o contedo de uma pasta, usamos o tar combinado com o gzip ou bzip2. O tar agrupa os arquivos e o gzip os compacta. Os arquivos compactados com o gzip usam por padro a extenso "tar.gz", enquanto os compactados com o bzip2 usam a extenso "tar.bz2". O bzip2 mais eficiente, chega a obter 10% ou mais de compresso adicional, mas em compensao bem mais pesado: demora cerca de 3 vezes mais para compactar os mesmos arquivos. Voc escolhe entre um e outro de acordo com a tarefa. O comando para compactar uma pasta similar ao "tar -zxvf" que usamos para descompactar arquivos. Para compactar a pasta "arquivos/", criando o arquivo "arquivos.tar.gz", o comando seria: $ tar -zcvf arquivos.tar.gz arquivos/ O "c" indica que o tar deve criar um novo arquivo e o "v" faz com que exiba informaes na tela enquanto trabalha. Se preferir comprimir em bz2, muda apenas a primeira letra; a invs de "z" usamos "j": $ tar -jcvf arquivos.tar.bz2 arquivos/ Estes comandos seriam ideais para fazer um backup completo, de uma ou vrias pastas do sistema, gerando um arquivo compactado que poderia ser armazenado num HD externo, gravado num DVD ou mesmo transferido via rede para outro servidor.

Imagine agora um outro cenrio, onde voc precisa fazer backup dos arquivos de uma pasta de trabalho diariamente. Os arquivos gerados no so muito grandes e voc tem muito espao disponvel, mas necessrio que os backups dirios feitos em arquivos separados e sejam guardados por um certo perodo, de forma que seja possvel recuperar um arquivo qualquer a partir da data. Ao invs de ficar renomeando os arquivos, voc poderia usar um pequeno script para que os arquivos fossem gerados j com a data e hora includa no nome do arquivo: DATA=`date +%Y-%m-%d-%H.%M` cd /mnt/backup tar -zcvf trabalho-"$DATA".tar.gz /mnt/hda6/trabalho/ A primeira linha do script cria uma varivel "DATA", contendo o resultado do comando " date +%Y-%m-%d-%H.%M". O comando date retorna a data e hora atual, como em "Sex Set 16 12:36:06 BRST 2005". A sada padro dele no muito adequada para usar em nomes de arquivos, por isso usamos as opes para alterar o formato de sada, de forma que o resultado seja "2005-09-16-12.37" (ano, ms, dia, hora, minuto, segundo). Usamos este valor no nome do arquivo com o backup, de forma que cada vez que voc chame o script, seja gerado um arquivo com a data e hora em que foi gerado, sem a possibilidade de dois arquivos sarem com o mesmo nome. O prximo passo fazer com que este script de backup seja executado diariamente de forma automtica, o que pode ser feito usando o cron. Em primeiro lugar, salve os comandos num arquivo de texto, que vamos chamar de "backup.sh" e transforme-o num executvel usando o comando "chmod +x backup.sh". Para que ele seja executado automaticamente todos os dias, copie-o para dentro da pasta "/etc/cron.daily" e certifique-se que o servio "cron" esteja ativo: # cp -a backup-sh /etc/cron.daily # /etc/init.d/cron start Se preferir que o script seja executado apenas uma vez por semana, ou mesmo uma vez por hora, use as pastas "/etc/cron.weekly" ou a "/etc/cron.hourly". Por padro, os scripts dentro da pasta "/etc/cron.daily" so executados pouco depois das 6 da manh (o horrio exato varia de acordo com a distribuio), para alterar o horrio, edite o arquivo "/etc/crontab", alterando a linha: 25 6 * * * root test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily O "25 6" indica o minuto e a hora. Se quiser que o script seja executado s 11 da noite, por exemplo, mude para "00 23". Neste exemplo usei a pasta "/mnt/backup" para salvar os arquivos. Esta pasta pode ser o ponto de montagem de um HD externo ou de um compartilhamento de rede por exemplo. O seu script pode conter os comandos necessrios para montar e desmontar a pasta automaticamente.

Imagine, por exemplo, que o backup sempre feito na primeira partio de um HD externo, ligado na porta USB, que sempre detectada pelo sistema como "/dev/sda1". O script deve ser capaz de montar a partio, gravar o arquivo de backup e depois desmont-la. Se por acaso o HD no estiver plugado, o script deve abortar o procedimento. Para isso precisamos verificar se o HD realmente foi montado depois de executar o comando "mount /dev/sda1 /mnt/sda1". Existem muitas formas de fazer isso, uma simples simplesmente filtrar a sada do comando "mount" (que mostra todos os dispositivos montados) usando o grep para ver se o "/mnt/sda1" aparece na lista. Se no estiver, o script termina, caso esteja ele continua, executando os comandos de backup: mount /dev/sda1 /mnt/sda1 montado=`mount | grep /mnt/sda1` if [ -z "$montado" ]; then exit 1 else DATA=`date +%Y-%m-%d-%H.%M` cd /mnt/backup tar -zcvf trabalho-"$DATA".tar.gz /mnt/hda6/trabalho/ umount /mnt/sda1 fi A partir da, sempre que voc deixar o HD externo plugado no final do expediente, o backup feito e estar pronto no outro dia. Se esquecer de plugar o HD num dia, o script percebe e no faz nada. Se preferir que o script grave o backup num DVD, ao invs de simplesmente salvar numa pasta, voc pode usar o "growisofs" para grav-lo no DVD. Neste caso, vamos gerar o arquivo numa pasta temporria e delet-lo depois da gravao: DATA=`date +%Y-%m-%d-%H.%M` rm -rf /tmp/backup; mkdir /tmp/backup; cd /tmp/backup tar -zcvf trabalho-"$DATA".tar.gz /mnt/hda6/trabalho/ growisofs -speed=2 -Z /dev/dvd -R -J /tmp/backup/trabalho-"$DATA".tar.gz rm -rf /tmp/backup O "-speed=2" permite que voc especifique a velocidade de gravao do DVD, o "-Z" cria uma nova seo no DVD, possvel usar o mesmo disco para gravar vrios backups (se o espao permitir) usando a opo "-M" a partir da segunda gravao, que adiciona novas sees no DVD, at que o espao se acabe. O "/dev/dvd" indica o dispositivo do drive de DVD. A maioria das distribuies cria o link /dev/dvd apontando para o dispositivo correto, mas, em caso de problemas, voc pode indicar diretamente o dispositivo correto, como, por exemplo, "/dev/hdc". As opes "-R -J" adicionam suporte s extenses RockRidge e Joilet. Se o cron for configurado para executar o script todos os dias, voc s precisar se preocupar em deixar o DVD no drive antes de sair.

Outro grande aliado na hora de programar backups o rsync. Ele permite sincronizar o contedo de duas pastas, transferindo apenas as modificaes. Ele no trabalha apenas comparando arquivo por arquivo, mas tambm comparando o contedo de cada um. Se apenas uma pequena parte do arquivo foi alterada, o rsync transferir apenas ela, sem copiar novamente todo o arquivo. Ele uma forma simples de fazer backups incrementais, de grandes quantidades de arquivos, ou mesmo parties inteiras, mantendo uma nica cpia atualizada de tudo num HD externo ou num servidor remoto. Este backup incremental pode ser atualizado todo dia e complementado por um backup completo (para o caso de um desastre acontecer), feito uma vez por semana ou uma vez por ms. Para instalar o rsync, procure pelo pacote "rsync" no gerenciador de pacotes. No Debian instale com um "apt-get install rsync" e no Mandriva com um "urpmi rsync". Para fazer um backup local, basta informar a pasta de origem e a pasta de destino, para onde os arquivos sero copiados: $ rsync -av /mnt/hda6/trabalho /mnt/backup/ A opo "-a" (archive) faz com que todas as permisses e atributos dos arquivos sejam mantidos, da mesma forma que ao criar os arquivos com o tar e o "v" (verbose) mostra o progresso na tela. A cpia inicial vai demorar um pouco, mais do que demoraria uma cpia simples dos arquivos. Mas, a partir da segunda vez a operao ser muito mais rpida. Note que neste comando estamos copiando a pasta "trabalho" recursivamente para dentro da "/mnt/backup", de forma que seja criada a pasta "/mnt/backup/trabalho". Adicionando uma barra, como em "/mnt/hda6/trabalho/", o rsync copiaria o contedo interno da pasta diretamente para dentro da "/mnt/backup". Se algum desastre acontecer e voc precisar recuperar os dados, basta inverter a ordem das pastas no comando, como em: $ rsync -av /mnt/backup/trabalho /mnt/hda6/trabalho/ O rsync pode ser tambm usado remotamente. Originalmente ele no utiliza nenhum tipo de criptografia, o que faz com que ele no seja muito adequado para backups via Internet. Mas, este problema pode ser resolvido com a ajuda do SSH, que pode ser utilizado como meio de transporte. No a toa que o SSH chamado de canivete suo, ele realmente faz de tudo. Neste caso o comando ficaria um pouco mais complexo: $ rsync -av --rsh="ssh -C -l tux" /mnt/hda6/trabalho tux@192.168.0.1:/mnt/backup/

Veja que foi adicionado um parmetro adicional, o --rsh="ssh -C -l tux", que orienta o rsync a utilizar o SSH como meio de transporte. O "-C" orienta o SSH a comprimir todos os dados (economizando banda da rede) e a se conectar ao servidor remoto usando o login tux (-l tux). Naturalmente, para que o comando funcione preciso que o servidor esteja com o SSH habilitado, e voc tenha um login de acesso. Em seguida vem a pasta local com os arquivos, o endereo IP (ou domnio) do servidor e a pasta (do servidor) para onde vo os arquivos. Para recuperar o backup, basta novamente inverter a ordem do comando, como em: $ rsync -av --rsh="ssh -C -l tux" tux@192.168.0.1:/mnt/backup/ /mnt/hda6/trabalho Originalmente, voc vai precisar fornecer a senha de acesso ao servidor cada vez que executar o comando. Ao usar o comando dentro do script de backup, voc pode gerar uma chave de autenticao, tornando o login automtico. Esta opo menos segura, pois caso algum consiga copiar a chave (o arquivo .ssh/id_rsa dentro no home do usurio), poder ganhar acesso ao servidor. De qualquer forma, para usar este recurso, rode o comando "ssh-keygen -t rsa" (que gera a chave de autenticao) usando o login do usurio que executar o script de backup, deixando a passprase em branco. Em seguida, copie-o para o servidor, usando o comando: $ ssh-copy-id -i ~/.ssh/id_rsa.pub tux@192.168.0.1 A partir da, o script de backup pode ser executado diretamente, atravs do cron, pois no ser mais solicitada a senha.