Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

El proceso que se seguirá para realizar una copia de seguridad es el siguiente:

  1. Bacula Director Daemon(backuo01) se comunica con Bacula Client Daemon para que inicie la copia de seguirdad de virtual01. 

     

  2. Bacula Client Daemon(produccion01) sera el encargado de comprobar el estado de virtual01. Y si se encuentra corriendo suspenderá. 

    La copia de seguridad de una maquina completa debe realizarse con la maquina parada o suspendida. De hacerse de otro modo los datos que copiemos pueden estar corruptos y en caso de tener que restaurar los datos no se podría asegurar que en caso de tener que restaurar la maquina virtual, esta funcione correctamente.

  3. Una vez suspedida sera produccion01 el encargado de ejecutar la instrucción reflink que proporcionará una copia del fichero de la maquina virtual en suspensión. 

  4. Con esta copia de virtual01, sera produccion01 la encargada de restaurar a virtual01 de su estado de suspensión, haciendo que virtual01 vuelva ha estar en ejecución. 

  5. Una vez que se tiene una copia de la maquina de la cual se quiere realizar el backup y la original se encuentra en ejecución se comprime, lo que hará que disminuya el tiempo transferencia de la copia a backupstorage. y  ahorrando espacio en disco en el backupstorage.

  6. El siguiente paso es que el Bacula Client Daemon(produccion01) se ponga en contacto con Bacula Storage Daemon(desarrollo01) para que se realice el almacenamiento de virtual01 en el backupstorage.

  7. Por último si la copia se ha ejecutado correctamente se borran los ficheros creados tanto por la instrucción reflink como por el proceso de compresión . 

Una vez explicado el proceso que se va ha seguir para realizar las copias de seguridad se pasa a configurar el fichero Bacula Director Daemon, alojado en backup01 el nuevo Job. Job es la nomenclatura que utiliza Bacula para definir las tareas de respaldo que se quieren programar. Para definir el nuevo Job es necesario añadir 3 nuevos campos a este fichero de configuración. Se añade el cliente que realizara esta nueva tarea:

Code Block
languagebash
titleClient Configuration
Client {
  Name = produccion01-fd
  Address = produccion01    # IP
  FDPort = 9102
  Catalog = MyCatalog
  Password = "produccion01-fd.password"
  File Retention = 1 year
  Job Retention = 1 year
  AutoPrune = yes
  Maximum Concurrent Jobs = 10
}

 

 

Client {
  Name = produccion01-fd
  Address = produccion01    # IP
  FDPort = 9102
  Catalog = MyCatalog
  Password = "produccion01-fd.password"
  File Retention = 1 year
  Job Retention = 1 year
  AutoPrune = yes
  Maximum Concurrent Jobs = 10
}

 

 

Se añade a continuación donde el cliente almacenara la copia de seguridad:

 

Storage {
        Name = storage_virtual01_full"
        Address = desarrollo01
        SDPort = 9103
        Password = "desarrollo01-sd.password"
        Device = backup_erp01_full
        Maximum Concurrent Jobs = 10
        Media Type = file_virtual01_full"
}

 

Por ultimo se añade el Job que el cliente va a realizar. 

 

Schedule {
  Name = "schedule_virtual01_full"
  Run = Level=Full Pool=pool_mensual on 1,16 at 3:00
  Run = Level=Full Pool=pool_quincenal sun-sat at 3:00
}
FileSet {
  Name = "fileset_virtual01_full"
  Include {
    Options { signature = SHA1; onefs = yes; }
    File = /storage/virtual01-bk.tar.gz
  }
}
Job {
  Name = "job_virtual01_full"
  Type = Backup
  Level = Full
  Client = produccion01-fd
  FileSet = "fileset_virtual01_full"
  Schedule = "schedule_virtual01_full"
  Storage = storage_virtual01_full"
  Messages = Standard
  Pool = pool_anual
  Full Backup Pool = pool_mensual
  Incremental Backup Pool = pool_quincenal
  Priority = 11
  Write Bootstrap = "/apps/bacula/opt/bacula/working/virtual01_full.bsr"
  ## Script running on client
  Client Run Before Job = "/bacula/script/vm_stop.sh virtual01"
  Client Run After Job = "/bacula/script/vm_start.sh virtual01"  
}

 

Importarte reseñar que en el código de la izquierda se ha configurado el directorio que se quiere copiar:

 

File = /storage/virtual01-bk.tar.gz

 

Y los scripts que se van a encargar de parar y restaurar virtual01 y borrar los ficheros creados durante la copia de seguridad. Estos scripts se detallan mas adelante. 

 

Client Run Before Job = "/apps/bacula/script/vm_stop.sh virtual01"
Client Run After Job = "/apps/bacula/script/vm_start.sh virtual01"

 

Si desea conocer en profundidad el resto de parámetros configurados acudir a la documentación de Bacula que puede encontrase en su pagina web (www.bacula.org)

 

Una vez definido el Job en el  Bacula Director Daemon, se debe crear Device (lugar en el que se almacenara la copia de seguridad de virtual01) en el Bacula Storage Daemon (desarrollo01), para ello se edita el fichero de configuración (.../bacula/etc/bacula-sd.conf) añadiendo las siguientes lineas.

 

Device {
        Name = backup_virtual01_full
        Media Type = file_erp01_sql
        Archive Device = /backup/vm/virtual01
        LabelMedia = yes;                  
        Random Access = Yes;
        AutomaticMount = yes;             
        RemovableMedia = no;
        AlwaysOpen = no;
        Maximum Concurrent Jobs = 10
}

 

Por ultimo, se deben crear dos scripts encargados de suspender la maquina virtual para realizar la copia y de volver a restaurarla y el script que borra la copia de seguridad ya copiada a storagebackup. Estos scripts deben estar almacenados en produccion01 (Bacula Client Daemon)

vm_stop.sh

 

##/bin/bash
  
PASS=`cat /root/pass`
MACHINE=$1
LOGFILE=/bacula/log/log_$MACHINE.log
DATE=`date +%d%m%Y`
echo " " >> $LOGFILE
echo "-------------------------------" $MACHINE "--" `date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` "---------------------------------------" >> $LOGFILE
ESTADO=`flexadm guest-status -p $PASS -g $MACHINE`
if [ $ESTADO = "running" ]
then
echo "`date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` $MACHINE esta en ejecucion, se suspende..." >> $LOGFILE
flexadm -p $PASS -g $MACHINE suspend -w
sleep 300
ESTADO=`flexadm guest-status -p $PASS -g $MACHINE`
if [ $ESTADO = "running" ]
then
echo "`date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` $MACHINE No se ha suspendido después de 5 minutos se suspende la copia." >> $LOGFILE
flexadm -p $PASS -g $1 restore -w #Asegurar que la maquina queda en ejecucion
elif [ $ESTADO = "suspended" ]
then
echo "`date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` $MACHINE se ha suspendido, se crea backup ($MACHINE-bk)." >> $LOGFILE
LUGAR=`flexadm -p $PASS -g $1 guest-images`
reflink $LUGAR $LUGAR-bk
if [ $? -eq 0 ]
then
if [ -f $LUGAR-bk ]
then
echo "`date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` $MACHINE-bk creado, se comprime ($MACHINE-bk_$DATE.tar.gz)." >> $LOGFILE
fi
tar -cf $LUGAR-bk_$DATE.tar.gz $LUGAR-bk
if [ $? -eq 0 ]
then
if [ -f $LUGAR-bk_$DATE.tar.gz ]
then
echo "`date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` $MACHINE-bk comprimida ($MACHINE-bk_$DATE.tar.gz), se borra $MACHINE-bk." >> $LOGFILE
rm -rf $LUGAR-bk
if [ $? -eq 0 ]
then
if [ ! -f $LUGAR-bk ]
then
echo "`date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` $MACHINE-bk borrada." >> $LOGFILE
echo "`date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` Backup  de $MACHINE creado correctamente." >> $LOGFILE
fi
else
echo "`date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` ERROR AL BORRAR $MACHINE-bk" >> $LOGFILE
fi
fi
else
echo "`date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` ERROR AL COMPRIMIR $MACHINE-bk NO SE HA CREADO ($MACHINE-bk_$DATE.tar.gz)" >> $LOGFILE
fi
else
echo "`date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` ERROR AL CREAR $MACHINE-bk" >> $LOGFILE
fi
fi
elif [ $ESTADO = "suspended" ]
then
echo "`date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` $MACHINE suspendida" >> $LOGFILE
fi
echo "--------------------------------------------------------------------------------------------------------" >> $LOGFILE

 

Este script es el encargado de borrar la copia de la maquina virtual, virtual01 que ya ha sido guardada en storagebackup.

vm_stop.sh

#!/bin/bash                                                                                                                           
                                                                                                                                        
PASS=`cat /root/pass`                                                                                                                 
MACHINE=$1                                                                                                                            
LOGFILE=/bacula/log/log_$MACHINE.log                                                                                             
DATE=`date +%d%m%Y`                                                                                                                   
echo " " >> $LOGFILE                                                                                                                  
echo "-------------------------------" $MACHINE "--" `date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` "---------------------------------------" >> $LOGFILE                                                                                                            
ESTADO=`flexadm guest-status -p $PASS -g $MACHINE`
if [ $ESTADO = "running" ]
then
echo "`date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` $MACHINE esta restaurada" >> $LOGFILE
LUGAR=`flexadm -p $PASS -g $MACHINE guest-images`
if [ -f $LUGAR-bk.tar.gz ]
then
rm -rf $LUGAR-bk.tar.gz
if [ $? -eq 0 ]
then
if [ ! -f $LUGAR-bk.tar.gz ]
then
echo "`date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` $MACHINE-bk.tar.gz borrado con exito" >> $LOGFILE
else
echo "`date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` $MACHINE-bk.tar.gz no se ha borrado" >> $LOGFILE
fi
else
echo "`date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` ERROR AL BORRAR $MACHINE-bk.tar.gz" >> $LOGFILE
fi
else
echo "`date +%d`-`date +%m`-`date +%Y` `date +%H`:`date +%M` $MACHINE-bk.tar.gz no existe" >> $LOGFILE
fi
fi
echo "--------------------------------------------------------------------------------------------------------" >> $LOGFILE