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!