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.
Parabéns pelo blog Wanderlei!!
Muito bom!