Copiar volumes do bacula para HD externo com rsync

Tratando-se de backup, é muito importante ter mais de uma cópia dos dados para poder dormir em paz e não ter incômodos futuros. Uma das alternativa aos Jobs de Cópia do Bacula, é copiar apenas os volumes gerados por ele para um HD externo, com isso fazendo uma redundância dos dados.

Se o tamanho dos volumes for maior do que 4GB é necessário que o HD esteja formatado em NTFS (para Windows) ou EXT4 (para Linux). Se o HD estiver formatado em NTFS é preciso instalar o pacote “ntfs-3g”.
Comandos de instalação:
Debian: apt-get install ntfs-3g
CentOS: yum install ntfs-3g

Para montar o HD externo automaticamente e pegar o ponto de montagem correto, pode-se usar o UUID (Universally Unique Identifier) (Identificador Universal Único) que é um número identificador exclusivo de cada dispositivo.
Você pode obter o UUID do HD usando os seguintes comandos:


/sbin/blkid
/dev/sda1: LABEL="SAMSUNG" UUID="4XXXXXXXXXXXXXX1" TYPE="ntfs" PARTUUID="8818XXXX-01"

ou

/dev/disk/by-uuid/
lrwxrwxrwx 1 root root 10 Jan 28 08:26 4XXXXXXXXXXXXXX1 -> ../../sda1


Copiar o script abaixo e salvar em /etc/bacula/scripts/_rsync.sh
Preencher o campo disk_uuid1=”XXXXXXXXXXXXXXXX” do script substituindo pelo valor do UUID.

(Este exemplo é baseado em um servidor Bacula com 2 HD’s de 500gb, sendo que cada um é considerado como um Storage separado. E o HD onde está sendo feita a cópia dos volumes é um HD de 1TB.
Está sendo copiado também o dump do catálogo do Bacula e os arquivos de configuração.)

#!/bin/bash
# script /etc/bacula/script/_rsync.sh
# Em execução manual mostra quando começa o backup
if [ $# -eq 1 ]; then
   horainicio=`date +%s`
   echo "Backup dos Volumes do Bacula P/ HD Externo"
   c=$1
   while [ $c -ge 0 ]; do
      echo -ne "Aguardando $c segundos para iniciar...\r"
      sleep 1
      (( c-- ))
   done
   echo -ne "\n"
   echo "Rsync do backup iniciado..."
   echo "Hora inicio: `date +%H:%M:%S`"
fi

# Configuração das variáveis
disk_uuid1="XXXXXXXXXXXXXXXX"                         # Disk UUID HD Samsung 1TB
source1="/mnt/disco01/"                               # Origem do Backup StorageLocal1
source2="/mnt/disco02/"                               # Origem do Backup StorageLocal2
source_sql="/etc/bacula/working/bacula.sql"           # Origem do bacula.sql
source_bacula_conf="/etc/bacula"                      # Origem das configurações do bacula
destination="/mnt/disco_usb/backup/bacula"            # Diretorio raiz para onde os volumes serão copiados
storage1="StorageLocal1"                              # Nome do Storage 1
storage2="StorageLocal2"                              # Nome do Storage 2
destination_sql="$destination/$storage1/bacula.sql"   # Copia o bacula.sql para StorageLocal1

# Verifica os discos usando o by-uuid
if [ -e /dev/disk/by-uuid/$disk_uuid1 ];then
  device=`ls -l /dev/disk/by-uuid/$disk_uuid1 | awk -F/ '{print $NF}'`
  disk_id="$disk_uuid1"
  disk_label="HD SAMSUNG USB M3 1TB (HD1)"
else
  device=""
  disk_id=""
  disk_label=""
fi

if [ "$device" == "" ]; then
  echo "Nenhum dispositivo de backup encontrado!"
  exit
fi

# Inicio das mensagens
message=""
if [ "`grep /dev/$device /etc/mtab`" = "" ] ; then
    message+="**********************************************************************\n"
    message+=" Montando dispositivo /dev/$device em $destination \n"
    message+=" $disk_label - $disk_id \n\n"
    mount  /dev/$device /mnt/disco_usb/
else
    message+="**********************************************************************\n"
    message+=" Dispositivo ja montado /dev/$device em $destination \n"
    message+=" $disk_label - $disk_id \n\n"
fi

# Caso aconteça algum erro e queira rodar os comandos manuais
# _rsync.sh 1 -d
if [ "$2" == "-d" ]; then
   echo -e "Storage1\n/usr/bin/rsync -v --progress --modify-window=1 --update --recursive --times --delete --human-readable $source1 $destination/$storage1"
   echo -e "\nStorage2\n/usr/bin/rsync -v --modify-window=1 --update --recursive --times --delete --human-readable $source2 $destination/$storage2"
   echo -e "\nMySQL\n/usr/bin/rsync -v --modify-window=1 --update --times --human-readable $source_sql $destination_sql"
   echo -e "\nBacula\n/bin/tar -cvzf $destination/$storage1/bacula_conf.tar.gz --exclude=working --exclude=log --exclude=plugins --directory=$source_bacula_conf ."
   exit
fi

message+="**********************************************************************\n"
message+=" Iniciando sincronizacao para o HD Externo\n\n"

# Volumes do StorageLocal1 (Diario, Semanal e Mensal)
message+=`/usr/bin/rsync -v --modify-window=1 --update --recursive --times --delete --human-readable $source1 $destination/$storage1`
message+="\n\n"

# Volumes do StorageLocal2 (VM)
message+=`/usr/bin/rsync -v --modify-window=1 --update --recursive --times --delete --human-readable $source2 $destination/$storage2`
message+="\n\n"

# Dump do MySQL
message+=`/usr/bin/rsync -v --modify-window=1 --update --times --human-readable $source_sql $destination_sql`
message+="\n\n"

# Arquivos de Configuração do Bacula /etc/bacula
message+=`/bin/tar -cvzf $destination/$storage1/bacula_conf.tar.gz --exclude=working --exclude=log --exclude=plugins --directory=$source_bacula_conf .`


message+="\n\n**********************************************************************\n"
message+=" Informacoes do Disco\n" 
message+=`df -h -l /dev/$device`

message+="\n\n**********************************************************************\n"
message+=" Desmontando dispositivo /dev/$device em $destination \n\n" 
umount /dev/$device

message+="**********************************************************************\n"
message+=" Sincronizacao efetuada com sucesso "

horafim=`date +%s`
tempototal=`expr $horafim - $horainicio + 10800`

message+="\n\n**********************************************************************\n"
message+="Execucao do backup\n"
message+="Inicio rsync: `date -d @$horainicio +%H:%M:%S`\n"
message+="Fim rsync:    `date -d @$horafim +%H:%M:%S`\n"
message+="Tempo Total:  `date -d @$tempototal +%H:%M:%S`\n"


echo -e "$message" | mail -s "[bacula] Rsync Bacula efetuado com sucesso (`date -d @$tempototal +%H:%M:%S`)" email@dominio.com.br

if [ $# -eq 1 ]; then
   echo "Hora fim:    `date -d @$horafim +%H:%M:%S`"
   echo "Tempo Total: `date -d @$tempototal +%H:%M:%S`"
   echo "Rsync do backup finalizado!"
fi
exit 0

É possível executar o script manualmente, onde é possível informar um parâmetro do tipo inteiro, que é a quantidade de segundos para aguardar antes de iniciar a sincronização dos volumes, e no final da execução do script é mostrado a duração do mesmo. O parâmetro não é obrigatório.
/etc/bacula/scripts/_rsync.sh 60

Ou se preferir, agendar no crontab. É melhor utilizar um horário que você tenha certeza que todos os backups terminaram, por exemplo 03:00 da manhã de segunda à sexta.
crontab -e
00 03 * * 1-5 /etc/bacula/scripts/_rsync.sh # Rsync de volumes do bacula p/ HD externo

Quando o script finalizar você recebe um email com o resumo das informações que foram copiadas para o HD.

FacebooktwitterlinkedinFacebooktwitterlinkedinby feather

Um comentário sobre “Copiar volumes do bacula para HD externo com rsync

Os comentários estão fechados.