terça-feira, 24 de julho de 2012

Script de Backup Domestico Com Rsync


Galera nesse artigo vamos ver um script de backup básico porem muito funcional, ideal para ambiente domestico e pequena empresa utilizando o rsync. Em breve vou estar postando um artigo sobre o Bacula que é uma ferramenta de backup profissional e bastante robusta, mas vamos ao que interessa.... Pressupondo que você tenha uma máquina com o samba rodando, ou ate mesmo uma máquina onde você simplesmente salva seus arquivos vamos em frente. Iremos precisar de um segundo HD na máquina para servir de backup.


Vamos nos basear que o HD principal é o /dev/sda e o secundário é o /dev/sdb, verifique em seu sistema quais são os dispositivos com o comando “fdisk -l”, se você não formatou o HD e ele não possui nenhuma partição criada formate-o com o comando “cfdisk /dev/sdb”, primeiro iremos criar o diretório onde será o ponto de montagem de nosso HD:

# mkdir /mnt/backup-diferencial

Agora vamos fazer um teste e montar a unidade para ver se esta tudo numa boa.

# mount /dev/sdb1 /mnt/backup-diferencial

Verifique com o comando abaixo se o HD foi montado com sucesso:

# df –h

A saída devera ser mais ou menos assim:
Sist. Arq.            Size  Used Avail Use% Montado em
/dev/sdb1         0,0G     0  0,0G   0% /mnt/backup-diferencial

Depois crie a pasta de log dos backup:

# mkdir /mnt/backup-diferencial/logs

Com tudo funcionando vamos configurar para nosso hd ser montado automaticamente durante o boot, adicione a seguinte linha ao final no arquivo /etc/fstab:

/dev/sdb1 /mnt/backup-diferencial ext3 defaults,user,auto 0 0

Depois disso é só reiniciar a máquina para ver se o HD foi montado. Se tudo estiver certo vamos proseguir.

Agora vamos começar configuração, primeiramente instale o rsync:

# apt-get install rsync

Depois crie o diretório onde irá ficar os arquivos de configurações

# mkdir /etc/backup

Agora precisamos criar o arquivo dir2bkp e adicionar todos os diretório que queremos fazer backup.

# pico /etc/backup/dir2bkp

/etc
/arquivos
/var/profiles
Etc... adicione os diretórios de acordo com sua necessidade

Crie o arquivo que terá as informações do ultimo backup.

# touch /etc/backup/bkp-ultimo

Agora iremos criar o script de backup

# pico /etc/backup/backup.sh

Adicione as seguintes linhas no mesmo:

# Caminho onde este script foi instalado
MY_PATH="/etc/backup"

AGORA=`date +%d-%m-%Y-%H:%M:%S`

# Caminho onde este script foi instalado
MY_PATH="/etc/backup"

AGORA=`date +%d-%m-%Y-%H:%M:%S`
ULTIMOFILE="$MY_PATH/bkp-ultimo"

DIR2BKP="$MY_PATH/dir2bkp"
AGORAESTATICO="$AGORA"

LOGBACKUP="/mnt/backup-diferencial/logs/"$AGORAESTATICO".txt"
EMAIL="/etc/backup/email.sh"
PATH_DESTINO="/mnt/backup-diferencial"

# Se o diretorio de destino nao existir, entao o backup nao sera feito
if [ ! -d $PATH_DESTINO ]
        then
                exit 0
fi

ULTIMO=`cat $MY_PATH/bkp-ultimo`

mkdir -p $PATH_DESTINO/$AGORAESTATICO

for DIRS in `cat $DIR2BKP`
        do

rsync -av -R --delete --delete-excluded --link-dest=$PATH_DESTINO/$ULTIMO $DIRS $PATH_DESTINO/$AGORAESTATICO >> $LOGBACKUP

        echo "" >> $LOGBACKUP
        echo "" >> $LOGBACKUP
        echo "--------------------------------------------------" >> $LOGBACKUP


done

        echo "" >> $LOGBACKUP
        echo "Tamanho dos Backups ja Realizados" >> $LOGBACKUP
        echo "" >> $LOGBACKUP
        du -hs /mnt/backup-diferencial/* >> $LOGBACKUP
        echo "" >> $LOGBACKUP
        echo "--------------------------------------------------" >> $LOGBACKUP

        echo "" >> $LOGBACKUP
        echo "Espaco Disponivel no HD" >> $LOGBACKUP
        echo "" >> $LOGBACKUP
        df -h  >> $LOGBACKUP
        echo "" >> $LOGBACKUP
        echo "--------------------------------------------------" >> $LOGBACKUP


        echo "" >> $LOGBACKUP
        echo "Backup Criado Com Sucesso" >> $LOGBACKUP
        echo "" >> $LOGBACKUP
        echo "--------------------------------------------------" >> $LOGBACKUP


echo $AGORAESTATICO > $ULTIMOFILE

$EMAIL "Relatorio de Backup do Dia "$AGORAESTATICO"" "" $LOGBACKUP

Salve o arquivo e de permissão de execução ao mesmo

# chmod 755 backup.sh

Agora iremos criar o script de email para nos enviar os logs

# pico /etc/backup/email.sh

#!/bin/bash


EMAIL_FROM="email_de_origem "  # usuario de email que se autentica no servidor SMTP
EMAIL_TO="email_de_destino" # usuario que receber. os emails

#Servidor SMTP e porta utilizada
SERVIDOR_SMTP="smtp.seu_dominio:25" #endere.o no servidor SMTP, observar no exemplo o yahoo utiliza a porta 587
SENHA=senha_do_email_de_origem    #informe aqui a senha de autentica..o no servidor SMTP

ASSUNTO="$HOSTNAME - $1"
MENSAGEM=$2

if [ "$1" == "" ] ;then
   ASSUNTO="SEM ASSUNTO"
fi
if [ "$2" == "" ] ;then
   MENSAGEM="SEM MENSAGEM"
fi
if [ "$3" != "" ] ;then
   MENSAGEM="$2  `cat $3`"
fi


sendEmail -f $EMAIL_FROM -t $EMAIL_TO -u "$ASSUNTO" -m "$MENSAGEM" $ANEXO -s $SERVIDOR_SMTP -xu $EMAIL_FROM -xp $SENHA

Salve o arquivo e de permissão de execução ao mesmo

# chmod 755 email.sh

Instale o cliente de email:

# aptitude install sendemail

Pronto feito isso é só executar o script de backup para criar o primeiro backup full, provavelmente não iremos receber o primeiro email com os logs pois como se trata do primeiro backup o log fica muito grande e existe um limite para enviar os logs por email, mas a partir do segundo já começamos a receber normalmente.

# /etc/backup/backup.sh

Podemos automatizar esse processo inserindo a linha a baixo no final do arquivo /etc/crontab

00 20   * * *   root    /etc/backup/backup.sh

Dessa forma o backup será realizado todos os dias as 20:00 horas.

Reinicie o cron

# /etc/init.d/cron restart

Esse pequeno script cria uma política de backup diferencial , um backup diferencial fornece um backup dos arquivos que foram alterados desde que foi realizado um backup completo, ele salva os arquivos que são diferentes ou um novo desde o último backup completo.

Bem pessoal é isso ae, espero que seja útil para todos, até a próxima!!!....... :)

Um comentário:

  1. Muito bom o post! Tive duas dificuldades, hehehe...
    - Primeiro eu estava com preguiça de digitar os scripts no ubuntu server, dei um ctrl+c, ctrol+v pelo bloco de notas do windows(era a máquina que eu tinha a disposição =/) deu um pau maldito... Demorei a diagnosticar essa incompatibilidade.

    - Segundo, o SendEmail não estava enviando os e-mail. Dava um erro de falta de tls e pedia para fazer o "STARTTLS" primeiro. Depois de fuçar um pouco na net vi que tem q instalar mais dois pacotes na instalação do SendEmail.

    #apt-get install sendEmail libnet-ssleay-perl libio-socket-ssl-perl

    Resolvido esses contratempos está funfando bem aqui ;D

    ResponderExcluir