Instalación y configuración de Bacula en CentOS 7

Bacula es un conjunto de programas* Open Source*, permite administrar los respaldos, restauración y verificación de datos en una red heterogénea. Bacula es relativamente fácil de usar y eficiente, a la vez que ofrece muchas funcionalidades avanzadas para la administración de los datos almacenados, lo cual facilita hallar y recuperar archivos perdidos o dañados.

Se basa en una arquitectura Cliente-Servidor que resulta eficaz y fácil de manejar, dada la amplia gama de funciones y características que brinda; copiar y restaurar ficheros dañados o perdidos.

Considere los siguiente al leer este manual:

  • La versión de bacula que se instala es la 5.2
  • Se usara la versión de postgresql 9.2
  • Algunos comandos que se muestran necesitaran de privilegios de superusuario, considere usar sudo o ejecutar el comando como superusuario

Instalaremos Bacula de acuerdo al siguiente esquema:

BaculaARque

En el diagrama tenemos un 3er servidor con el servicio NFS, considere esto un paso opcional.

Componentes

Los componentes de Bacula son:

Bacula-director

Es el servicio (bacula-dir) que gestiona la lógica de los procesos de respaldo y administra los demás servicios que componen Bacula. El servicio bacula-dir hace uso de un servicio de base de datos donde guarda información importante del servicio (Trabajos, Listas de archivos respaldados, etc. Conocido como catalogo) y esta debe estar accesible a bacula-dir.

En el archivo de configuración de este servicio se especifica dónde y cómo acceder al resto de los servicios.

Bacula-storage

Este servicio (bacula-sd) es el encargado de manejar los dispositivos de almacenamiento físicos que se usaran para resguardar los respaldos, tales como: discos locales, grabadoras de CD o DVD, unidades de cinta, volúmenes NAS o SAN, etc.

Su fichero de configuración define los dispositivos de almacenamiento disponibles y los directores (bacula-dir) que pueden utilizarlo.

Bacula-file

Mediante este servicio (bacula-fd) Bacula obtiene los ficheros que necesita respaldar, éste es el componente que hay que instalar en las máquinas que necesiten respaldo. Realiza la función de agente cliente.

Bacula-console

Este es el cliente de administración que se conecta al bacula-dir. En el podemos realizar trabajos de restauración o ejecución de respaldos manuales, monitorear el estatus de los servicios que componen Bacula.

Instalación

En esta ejemplo de instalación manejaremos la siguiente arquitectura.

Base de datos

Todo el conjunto de elementos que forman Bacula trabaja en sincronía y es totalmente compatible con bases de datos como MySQL, SQLite y PostgreSQL.

Usaremos el gestor de base de datos PostgreSQL 9.2 en donde se guardara el catalogo de archivos que se respaldan y otras variables importantes para Bacula.

Instalación del servicio

$ yum install postgresql-server

Inicio automático del servicio

$ systemctl enable postgresql.service

Iniciar las bases de datos y el servicio

$ postgresql-setup initdb
$ systemctl start postgresql.service

Configuración del servicio

$ vim /var/lib/pgsql/data/postgresql.conf
listen_addresses = 'localhost'
port = 5432
max_connections = 100
client_min_messages = notice
log_min_messages = notice
log_min_error_statement = error
log_connections = on
log_line_prefix = '%t %u %d'

Configuraciones de acceso

$ vim /var/lib/pgsql/data/pg_hba.conf
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
# "local" is for Unix domain socket connections only
local	all	all	peer
# IPv4 local connections:
host	all	all	127.0.0.1/32	md5
# IPv6 local connections:
host	all	all	::1/128	md5

Aplicar los cambios

$ systemctl restart postgresql.service

Instalación de los componentes

Instalamos los paquetes de bacula que necesitamos en el servidor

$ yum install bacula-console bacula-director bacula-storage

Configuración de la base de datos bacula

Bacula nos ofrece scripts para configurar la base de datos para el catalogo. Estos comandos son para configurar la base de datos de bacula en Postgresql

$ su postgres -c "/usr/libexec/bacula/create_bacula_database postgresql"
$ su postgres -c "/usr/libexec/bacula/make_bacula_tables postgresql"
$ su postgres -c "/usr/libexec/bacula/grant_bacula_privileges postgresql"

Asignamos una contraseña al usuario bacula de postgresql

$ su postgres -c "psql"
postgres=# ALTER USER bacula WITH LOGIN ENCRYPTED PASSWORD 'MiContraseña';

Otras configuraciones

$ gpasswd -a bacula postgres

Configuración de los componentes

Los archivos de configuración se encuentran en el directorio /etc/bacula

Bacula-sd

Primero empezamos con la configuración del servicio de almacenamiento, este servicio se encarga de administrar los medios de almacenamiento físicos, el archivo de configuración encuentra nombrado generalmente como bacula-sd.conf.

En la sección Storage definimos opciones como el puerto del servicio, directorios donde se alojaran el PID de servicio, cola de tareas, etc. También definimos cuantos trabajos máximos ejecutara el Storage.

Storage {
  Name = bacula-sd
  SDPort = 9103
  WorkingDirectory = "/var/spool/bacula"
  Pid Directory = "/var/run"
  Maximum Concurrent Jobs = 50 		     # Ajustar el máximo de trabajos
}

En esta parte definimos la contraseña con la cual bacula-dir se conectara con nuestro servicio bacula-sd.

Director {
  Name = bacula-dir
  Password = "PasswordSuperSecretoSD"	 # Contraseña de bacula-sd
}

Comentamos la siguiente sección.

#Director {
#  Name = bacula-mon
#  Password = "dsd"
#  Monitor = yes
#}

En esta sección definimos las características de nuestro medio de almacenamiento. Configuramos el Device con el nombre de DiscoNFS, sera un medio de almacenamiento de tipo File (este tipo pueden ser medios externos de almacenamiento montados en el sistema).

Device {
  Name = DiscoNFS					# Nombre de nuestro dispositivo
  Media Type = File					# Tipo de medio
  Archive Device = /mnt/backups		# Punto de montaje
  LabelMedia = yes;
  Random Access = Yes;
  AutomaticMount = no;
  RemovableMedia = no;
  AlwaysOpen = no;
}
Punto de montaje NFS

Como parte de la arquitectura de configuración de ejemplo montaremos un recurso compartido NFS (previamente configurado) en /mnt/backups que nos servirá para guardar los respaldos.

Considere esto un paso opcional, usted puede solo usar un directorio valido de su sistema para alojar los respaldos. Bacula recomienda instalar el servicio bacula-sd en un servidor standalone.

$ yum -y install nfs-utils

Iniciamos los servicios

systemctl restart rpcbind
systemctl start nfs-lock
systemctl start nfs-idmap
systemctl start nfs-mountd

Habilitamos los servicios

$ systemctl enable rpcbind
$ systemctl enable nfs-lock
$ systemctl enable nfs-idmap
$ systemctl enable nfs-mountd

Montando la carpeta NFS

sudo mount -v -t nfs -o sec=sys,proto=tcp 192.168.x.x:/volume/backups /mnt/backups

Si no tenemos ningún problema procedemos a editar el archivo fstab para que el sistema monte la carpeta al iniciar.

$ vim /etc/fstab
192.168.x.x:/volume1/backups    /mnt/backups    nfs    timeo=14,intr,_netdev     0 0

Bacula-dir

Ahora empezaremos la configuración del Bacula director, este se encuentra nombrado como bacula-dir.conf, en este archivo encontraremos las siguientes opciones para configurar.

En la sección Director dentro del archivo de configuración, configuramos el máximo de trabajos concurrentes y la contraseña para bacula-dir (Esta contraseña se usa para conectarse desde la consola de administración, bconsole).

Director {
  Name = bacula-dir
  DIRport = 9101
  QueryFile = "/etc/bacula/query.sql"
  WorkingDirectory = "/var/spool/bacula"
  PidDirectory = "/var/run"
  Maximum Concurrent Jobs = 1		# Numero máximo de trabajos concurrentes
  Password = "MiSuperPaswordBaculaDIR"		# Contraseña de bacula-dir
  Messages = Daemon
}

La sección FileSet es donde se define los archivos y directorios que se respaldaran, así como los que serán excluidos, se puede declarar mas de un FileSet.

FileSet es requerido en la definicion Job.

Vamos a declarar un FileSet con el nombre Linux Set, este tendra un cifrado de tipo SHA1 e ira comprimido con GZIP.

FileSet {
  Name = "Linux Set"		# Nombre
  Include {
	Options {
	  signature = SHA1		# Tipo de cifrado
	  compression = GZIP	# Tipo de compresión
	}
	File = /				# Archivos que se respaldaran
	File = /boot
  }
Exclude {					# Archivos que no se respaldaran
	File = /tmp
	File = /proc
	File = /dev
	File = /sys
	File = /net
	File = /misc
	File = /lost+found
  }
}

En la sección Schedule, se especifica el tipo, fecha y hora en que se realizara los trabajos de respaldo. En la variable Run definimos primero el tipo de respaldo (completo, diferencial o incremental) y después su ciclo de ejecución (definido tipo crontab).

Schedule es requerido en la definición Job.

Definamos un schedule con el nombre CicloServidores que ejecutara un tipo de respaldo completo (Full) todos los primer domingo de cada mes, ejecutara un respaldo diferencial (Differential) a partir del segundo al quinto domingo de cada mes y un respaldo incremental de lunes a sábado (Incremental); todos las tareas se ejecutan a las 23 horas.

Schedule {
  Name = "CicloServidores"						# Nombre
  Run = Full 1st sun at 23:00                   # Full – Mensual
  Run = Differential 2nd-5th sun at 23:00		# Diferencial – Semanal
  Run = Incremental mon-sat at 23:00			# Incremental – Diario
}

En la sección Storage se configura las credenciales del servicio de almacenamiento (bacula-sd). También se define el dispositivo (device) donde se realizará el respaldo.

Configuramos el Storage con el nombre LocalStorage, configuramos las credenciales de acceso, dirección de red y el dispositivo que configuramos en bacula-sd.

Storage {
  Name = LocalStorage					# Nombre
  Address = 192.168.x.x					# No usar localhost
  SDPort = 9103
  Password = "PasswordSuperSecretoSD"	# Contraseña de bacula-sd
  Device = DiscoNFS						# Nombre del dispositivo
  Media Type = File						# Tipo de medio
}

En la directiva Address es importante no usar localhost o la ip 127.0.0.1, si tienes corriendo el servicio bacula-sd en el mismo servidor del bacula-dir (como es nuestro caso) usa la IP LAN o nombre de dominio asignado al servidor.

En la sección Catalog definimos la base de datos que previamente configuramos en PostgreSQL.

Le asignamos el nombre MiCatalogo y configuramos los accesos.

Catalog {
   Name = MiCatalogo		# Nombre del catalogo
   dbname = "bacula"; dbuser = "bacula"; dbpassword = "PasswordSuperSecretoDB"
}

El recurso Pool define el conjunto de volúmenes asociados a un trabajo (Job), es decir es una agrupación de volúmenes de respaldo que se asocian a un trabajo.

Como buena practica podemos crear un Pool por cliente.

Creamos un Pool con el nombre PoolCliente01 y configuramos de la siguiente forma.

Pool {
  Name = PoolCliente01			# Nombre
  Pool Type = Backup			# Tipo backup
  Recycle = yes					# Bacula reutilizara volumenes expirados.
  AutoPrune = yes				# Borra los trabajos en volumenes expirados
  Action On Purge = Truncate	# Trunca los datos cuando se ejecuta purge
  Volume Retention = 2 months	# Expiracion de datos
  Maximum Volume Bytes = 10G	# Maxima capacidad por volumen
  Maximum Volumes = 5			# Numero de volumenes en el pool
  Label Format = "VolCliente01-"	# Formato para autonombrar los volumenes
}

Ahora en la sección Client se define al cliente (bacula-fd), aquí se especifica las credenciales que se utilizara para conectarse, también se define la política de retención de datos y procesos/trabajos.

Client {
  Name = cliente01						# Nombre
  Address = cliente01.example.com		# IP ó dominio
  FDPort = 9102
  Catalog = MiCatalogo					# Catalogo definido
  Password = "PasswordSuperSecretoFD"	# Contraseña de acceso del cliente
  File Retention = 2 months				# Días de retención
  Job Retention = 3 months				# Expira un trabajo
}

Y por ultimo (y no menos importante) el recurso Job, aquí se define un trabajo de respaldo ó restauración y se definen otros atributos como bajo que cliente se realizará el respaldo (Client), el conjunto de datos a respaldar (FileSet), el esquema de agrupación de los volúmenes (Pool), los horarios de ejecución (Schedule) y donde se almacenaran los datos físicamente (Storage).

Para cada cliente debemos generar dos tipos de Job:

También existe el sección JobDefs que nos sirve como una plantilla para usar en los Job, esto es util porque aveces entre los Job pueden compartir ciertos parámetros y no seria necesario declararlos en todos.

# Plantillas para los Job
JobDefs {
   Name = "BackupServerLinux"				# Nombre
   Type = Backup							# Tipo de trabajo
   Level = Incremental						# Nivel
   Schedule = "CicloServidores"				# Ciclo de ejecución
   Storage = LocalStorage					# Donde se guarda el respaldo
   Messages = Standard						# Tipo de notificación
   FileSet = "Linux Set"					# Archivos que respaldara
   Priority = 10							# Prioridad
   Write Bootstrap = "/var/spool/bacula/%c_server.bsr"	# Log del trabajo
}
JobDefs {
   Name = "RestoreServerLinux"		# Nombre
   Type = Restore					# Tipo de trabajo
   Storage = LocalStorage
   FileSet = "Linux Set"
   Messages = Standard
   Where = /tmp/bacula-restores		# Directorio de restauración
}
#
# Definicion de trabajos
#
Job {
   Name = "BackupCliente01"			# Nombre
   JobDefs = "BackupServerLinux"	# Plantilla de Job
   Client = cliente01				# Cliente que lo usara
   Pool = PoolCliente01				# Pool de volumenes que usara
}
Job {
   Name = "RestoreCliente01"
   JobDefs = "RestoreServerLinux"
   Client = cliente01
   Pool = PoolCliente01
}

En la variable Where del JobDefs“RestoreServerLinux” es donde señalamos en que directorio del cliente se va restaurar los archivos.

Firewall

Tenemos que abrir los puertos de los servicios bacula-dir (9101) y bacula-sd (9103) en protocolo TCP.

Iptables:

$ vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9101 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9103 -j ACCEPT
$ service iptables restart

Firewalld:

$ firewall-cmd --zone=public --add-service=bacula --permanent
$ firewall-cmd --reload

Bacula-fd (Cliente)

Una vez terminado con la configuración del director y haber declarado los clientes que se conectaran para ser respaldados procedemos a instalar en los clientes (bacula-fd).

Instalación

La instalación de Bacula-fd es diferente entre el centos 6.x y 5.x, esta radica en que en CentOS 5.x no se encuentra en los repositorios conocidos y se tiene que instalar desde las fuentes.

En Centos 6.x, 7

En centos 6.x y 7 podemos encontrar bacula-fd desde los repositorios base, esto hace mas rapida la instalación y configuraciones del cliente.

Instalación del servicio

$ yum -y install bacula-client
En Centos 5.x

Como se menciono anteriormente en CentOS 5.x realizaremos la instalación desde la fuente de binarios. Haremos los siguiente:

Instalación de compiladores al sistema.

$ yum install gcc gcc-c++ autoconf automake

Descargamos las fuentes de Bacula y descomprimimos la fuente.

$ wget http://sourceforge.net/projects/bacula/files/bacula/5.0.2/bacula-5.0.2.tar.gz/download
$ tar -zxf bacula-5.0.2.tar.gz

Nos cambiamos al directorio donde descomprimimos las fuentes, creamos una variable de sistema CFLAGS que nos servirá en la compilación y después procedemos a configurar la instalación y compilar.

$ cd bacula-5.0.2
$ CFLAGS="-g -Wall"
$ ./configure --sbindir=/usr/sbin --sysconfdir=/etc/bacula --with-pid-dir=/var/run --with-subsys-dir=/usr/libexec/bacula --with-working-dir=/var/spool/bacula --enable-client-only
$ make
$ make install

Configuraciones de arranque del servicio bacula-fd.

Agregar la siguiente linea: # chkconfig: - 87 26 en el archivo /etc/init.d/bacula-fd

$ cp /usr/sbin/bacula-fd /etc/init.d/
$ vim /etc/init.d/bacula-fd
#! /bin/sh
# chkconfig: - 87 26
#
# bacula This shell script takes care of starting and stopping
# the bacula daemons.
.......

Configuración

La configuración están en bacula-fd.conf. Aquí definimos una clave de acceso para el cliente. Agregamos la contraseña que definimos en la sección Client del bacula-dir.

Director {
  Name = bacula-dir
  Password = "PasswordSuperSecretoFD" 		# Contraseña del cliente
}

Se comenta esta sección.

#Director {
#  Name = bacula-mon
#  Password = "vMN"
#  Monitor = yes
#}

Activando el servicio.

En CentOS 7

$ systemctl enable bacula-fd
$ systemctl start bacula-fd

En CentOS 6.x y 5.x

$ chkconfig bacula-fd on
$ service bacula-fd start

#####Firewall

Configuraciones de firewall, abrimos el puerto 9102.

Iptables

$ vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9102 -j ACCEPT
$ service iptables restart

Firewalld

$ firewall-cmd --permanent --zone=public --add-port=9102/tcp

Bacula-console (Consola)

Existen varias opciones para administrar Bacula, una de ellas es por medio de bconsole, donde por medio de lineas de comando interactuamos con bacula-dir.

Este programa la tenemos que instalar desde el equipo donde tengamos pensado realizar las tareas de administrador, no necesariamente se tiene que alojar en el servidor.

Instalación desde repositorios. (RHEL, CentOS, Fedora)

$ yum install bacula-console

En su archivo de configuración agregamos la contraseña de acceso de bacula-dir que definimos anteriormente.

Director {
  Name = bacula-dir
  DIRport = 9101
  address = 192.168.x.x						# IP ó dominio
  Password = "MiSuperPaswordBaculaDIR"		# Contraseña de bacula-dir
}

Administración básica

Generar un respaldo manualmente
$ bconsole
* run 								# Ejecutamos un Job de respaldo (backup)
Select Job resource (1-3): 1 		# Seleccionamos el Job de backup del cliente
OK to run? (yes/mod/no): yes		# Ejecutamos la tarea
Job queued. JobId=1
* exit

Las tareas de respaldo se irán generando automáticamente de acuerdo a las tareas que se definieron en la configuraciones del servicio bacula-dir.

Generar una restauración

Las restauraciones se pueden realizar desde varios puntos o imágenes de archivos que se hayan generado.

$ bconsole
* restore						# Ejecutamos una tarea de restauración
To select the JobIds, you have the following choices:
	1: List last 20 Jobs run
	..
	5: Select the most recent backup for a client
	..
	13: Cancel
Select item: (1-13): 5 			# Seleccionamos el 5 para generar el mas reciente.
Defined Clients:
	 1: cliente01
Select the Client (1-11): 1		# Seleccionamos al cliente
$ ls 							# Listamos los archivos respaldados
home/
$ mark home						# Marcamos los que deseemos restaurar
5 files marked.
$ done							# Terminamos de seleccionar
OK to run? (yes/mod/no): yes 	# Ejecutamos la tarea configurada
Job queued. JobId=2
* exit

Fuentes