Sistema De Copias De Seguridad

En este artículo vamos a implementar un sistema de copias de seguridad para las máquinas del escenario de OpenStack y la máquina de OVH.

En primer lugar, me gustaría aclarar un poco cuál va a ser el entorno de trabajo, y es que el escenario sobre el que vamos a trabajar, ha sido construido en diferentes posts previamente elaborados. Los dejo ordenados a continuación por si te interesa:

He hecho más tareas sobre este escenario, las puedes encontrar todas aquí.

Respecto al equipo de OVH, se trata de un VPS con un sistema Debian.

Explicado esto, vamos a pasar con el contenido del post en cuestión, no sin antes explicar un poco la aplicación que vamos a utilizar y sus componentes.

Bacula

He decidido escoger Bacula como aplicación para llevar a cabo este sistema de backups.

Bacula es una colección de herramientas de respaldo capaz de cubrir las necesidades de respaldo de equipos bajo redes IP. 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. Además, debido a su desarrollo y estructura modular, Bacula se adapta tanto al uso personal como profesional, desde un equipo hasta grandes parques de servidores. Todo el conjunto de elementos que forman Bacula trabajan en sincronía y son totalmente compatibles con bases de datos como MySQL, SQLite y PostgreSQL.

Componentes de Bacula

Conceptos importantes

Para manejar mejor Bacula es importante conocer ciertos conceptos:

Sistema de copias de seguridad

En mi caso, he decidido escoger como servidor (también conocido como director) de copias de seguridad a Dulcinea (máquina que también actuará como cliente). Le he añadido un nuevo volumen de 10 GB de espacio, donde se irán almacenando las copias de las distintas máquinas.

Empezaremos por instalar el software de Bacula y MySQL.

apt install mariadb-server mariadb-client bacula bacula-common-mysql bacula-director-mysql -y

Durante la instalación de Bacula, nos saldrá este mensaje emergente, en el que seleccionaremos Yes, para especificarle a la aplicación que deseamos configurarla con la base de datos MySQL:

┌───────────────────────────────┤ Configuring bacula-director-mysql ├───────────────────────────────┐
│                                                                                                   │
│ The bacula-director-mysql package must have a database installed and configured before it can be  │
│ used. This can be optionally handled with dbconfig-common.                                        │
│                                                                                                   │
│ If you are an advanced database administrator and know that you want to perform this              │
│ configuration manually, or if your database has already been installed and configured, you        │
│ should refuse this option. Details on what needs to be done should most likely be provided in     │
│ /usr/share/doc/bacula-director-mysql.                                                             │
│                                                                                                   │
│ Otherwise, you should probably choose this option.                                                │
│                                                                                                   │
│ Configure database for bacula-director-mysql with dbconfig-common?                                │
│                                                                                                   │
│                            <\Yes\>                               <\No\>                           │
│                                                                                                   │
└───────────────────────────────────────────────────────────────────────────────────────────────────┘

A continuación, nos pedirá que introduzcamos una contraseña y habremos finalizado el proceso de instalación.

Vamos a pasar directamente con el fichero de configuración del director Bacula, que se encuentra en /etc/bacula/bacula-dir.conf. En este archivo nos encontraremos diferentes secciones, que tenemos que diferenciar, veamos la primera, que se trata de la configuración del director de copias de seguridad:

Director {
  Name = dulcinea-dir
  DIRport = 9101
  QueryFile = "/etc/bacula/scripts/query.sql"
  WorkingDirectory = "/var/lib/bacula"
  PidDirectory = "/run/bacula"
  Maximum Concurrent Jobs = 20
  Password = "bacula"
  Messages = Daemon
  DirAddress = 10.0.1.11
}

La siguiente sección trata de las tareas que se van a realizar, es decir, los procesos encargados de hacer las copias de seguridad.

En este apartado tendremos bloques como el siguiente:

JobDefs {
  Name =
  Type =
  Level =
  Client =
  FileSet =
  Schedule =
  Storage =
  Messages =
  Pool =
  SpoolAttributes =
  Priority =
  Write Bootstrap =
}

Os preguntaréis qué es cada apartado, pues vamos a verlos uno a uno:

En mi caso, introduciré tres tipos de tareas distintas, una para las copias diarias, otra para las copias semanales y otra para las copias mensuales, de manera que me queda un bloque como el siguiente:

JobDefs {
  Name = "BackupDiario"
  Type = Backup
  Level = Incremental
  Client = dulcinea-fd
  FileSet = "Full Set"
  Schedule = "Daily"
  Storage = volcopias
  Messages = Standard
  Pool = Daily
  SpoolAttributes = yes
  Priority = 10
  Write Bootstrap = "/var/lib/bacula/%c.bsr"
}

JobDefs {
  Name = "BackupSemanal"
  Type = Backup
  Level = Incremental
  Client = dulcinea-fd
  FileSet = "Full Set"
  Schedule = "Weekly"
  Storage = volcopias
  Messages = Standard
  Pool = Weekly
  SpoolAttributes = yes
  Priority = 10
  Write Bootstrap = "/var/lib/bacula/%c.bsr"
}

JobDefs {
  Name = "BackupMensual"
  Type = Backup
  Level = Incremental
  Client = dulcinea-fd
  FileSet = "Full Set"
  Schedule = "Monthly"
  Storage = volcopias
  Messages = Standard
  Pool = Monthly
  SpoolAttributes = yes
  Priority = 10
  Write Bootstrap = "/var/lib/bacula/%c.bsr"
}

A continuación nos encontramos con la sección donde definiremos las tareas de los clientes a los que vamos a realizar las copias de seguridad. Dentro de los siguientes bloques, indicamos el nombre de la tarea con la que va a ir relacionado y el nombre del cliente (se definirá más adelante). Introduciremos tantos bloques Job como tareas tengamos que asignar a los clientes. En mi caso:

# Dulcinea
Job {
  Name = "Dulcinea-Diario"
  Client = "dulcinea-fd"
  JobDefs = "BackupDiario"
  FileSet= "Dulcinea-Datos"
}

Job {
  Name = "Dulcinea-Semanal"
  Client = "dulcinea-fd"
  JobDefs = "BackupSemanal"
  FileSet= "Dulcinea-Datos"
}

Job {
  Name = "Dulcinea-Mensual"
  Client = "dulcinea-fd"
  JobDefs = "BackupMensual"
  FileSet= "Dulcinea-Datos"
}

# Sancho
Job {
  Name = "Sancho-Diario"
  Client = "sancho-fd"
  JobDefs = "BackupDiario"
  FileSet= "Sancho-Datos"
}

Job {
  Name = "Sancho-Semanal"
  Client = "sancho-fd"
  JobDefs = "BackupSemanal"
  FileSet= "Sancho-Datos"
}

Job {
  Name = "Sancho-Mensual"
  Client = "sancho-fd"
  JobDefs = "BackupMensual"
  FileSet= "Sancho-Datos"
}

# Freston
Job {
  Name = "Freston-Diario"
  Client = "freston-fd"
  JobDefs = "BackupDiario"
  FileSet= "Freston-Datos"
}

Job {
  Name = "Freston-Semanal"
  Client = "freston-fd"
  JobDefs = "BackupSemanal"
  FileSet= "Freston-Datos"
}

Job {
  Name = "Freston-Mensual"
  Client = "freston-fd"
  JobDefs = "BackupMensual"
  FileSet= "Freston-Datos"
}

# Quijote
Job {
  Name = "Quijote-Diario"
  Client = "quijote-fd"
  JobDefs = "BackupDiario"
  FileSet= "Quijote-Datos"
}

Job {
  Name = "Quijote-Semanal"
  Client = "quijote-fd"
  JobDefs = "BackupSemanal"
  FileSet= "Quijote-Datos"
}

Job {
  Name = "Quijote-Mensual"
  Client = "quijote-fd"
  JobDefs = "BackupMensual"
  FileSet= "Quijote-Datos"
}

# vpsjavierpzh
Job {
  Name = "vpsjavierpzh-Diario"
  Client = "vpsjavierpzh-fd"
  JobDefs = "BackupDiario"
  FileSet= "vpsjavierpzh-Datos"
}

Job {
  Name = "vpsjavierpzh-Semanal"
  Client = "vpsjavierpzh-fd"
  JobDefs = "BackupSemanal"
  FileSet= "vpsjavierpzh-Datos"
}

Job {
  Name = "vpsjavierpzh-Mensual"
  Client = "vpsjavierpzh-fd"
  JobDefs = "BackupMensual"
  FileSet= "vpsjavierpzh-Datos"
}

Igualmente que hemos definido en los clientes las tareas de backups, debemos definir las tareas de restauración (restore), para poder restaurar las copias de seguridad. En esta sección, tendremos bloques con el siguiente aspecto:

En mi caso, introduzco los siguientes bloques:

# Dulcinea
Job {
  Name = "DulcineaRestore"
  Type = Restore
  Client=dulcinea-fd
  Storage = volcopias
  FileSet="Dulcinea-Datos"
  Pool = Backup-Restore
  Messages = Standard
}

# Sancho
Job {
  Name = "SanchoRestore"
  Type = Restore
  Client=sancho-fd
  Storage = volcopias
  FileSet="Sancho-Datos"
  Pool = Backup-Restore
  Messages = Standard
}

# Freston
Job {
  Name = "FrestonRestore"
  Type = Restore
  Client=freston-fd
  Storage = volcopias
  FileSet="Freston-Datos"
  Pool = Backup-Restore
  Messages = Standard
}

# Quijote
Job {
  Name = "QuijoteRestore"
  Type = Restore
  Client=quijote-fd
  Storage = volcopias
  FileSet="Quijote-Datos"
  Pool = Backup-Restore
  Messages = Standard
}

# vpsjavierpzh
Job {
  Name = "vpsjavierpzhRestore"
  Type = Restore
  Client=vpsjavierpzh-fd
  Storage = volcopias
  FileSet="vpsjavierpzh-Datos"
  Pool = Backup-Restore
  Messages = Standard
}

Seguimos con la sección donde indicaremos, que tipo de información se almacenarán en los backups, indicando que directorios se copiarán y cuáles no, y el tipo de almacenamiento, que en mi caso se tratará de un almacenamiento comprimido para así ahorrar espacio.

# Full Set
FileSet {
 Name = "Full Set"
 Include {
   Options {
     signature = MD5
     compression = GZIP
   }
   File = /home
   File = /etc
   File = /var
 }
 Exclude {
   File = /var/lib/bacula
   File = /nonexistant/path/to/file/archive/dir
   File = /proc
   File = /var/cache
   File = /var/tmp
   File = /tmp
   File = /sys
   File = /.journal
   File = /.fsck
 }
}

# Dulcinea
FileSet {
 Name = "Dulcinea-Datos"
 Include {
   Options {
     signature = MD5
     compression = GZIP
   }
   File = /home
   File = /etc
   File = /var
 }
 Exclude {
   File = /nonexistant/path/to/file/archive/dir
   File = /proc
   File = /var/cache
   File = /var/tmp
   File = /tmp
   File = /sys
   File = /.journal
   File = /.fsck
 }
}

# Sancho
FileSet {
 Name = "Sancho-Datos"
 Include {
   Options {
     signature = MD5
     compression = GZIP
   }
   File = /home
   File = /etc
   File = /var
 }
 Exclude {
   File = /var/lib/bacula
   File = /nonexistant/path/to/file/archive/dir
   File = /proc
   File = /var/cache
   File = /var/tmp
   File = /tmp
   File = /sys
   File = /.journal
   File = /.fsck
 }
}

# Freston
FileSet {
 Name = "Freston-Datos"
 Include {
   Options {
     signature = MD5
     compression = GZIP
   }
   File = /home
   File = /etc
   File = /var
 }
 Exclude {
   File = /var/lib/bacula
   File = /nonexistant/path/to/file/archive/dir
   File = /proc
   File = /var/tmp
   File = /tmp
   File = /sys
   File = /.journal
   File = /.fsck
 }
}

# Quijote
FileSet {
 Name = "Quijote-Datos"
 Include {
   Options {
     signature = MD5
     compression = GZIP
   }
   File = /home
   File = /etc
   File = /var
 }
 Exclude {
   File = /var/lib/bacula
   File = /nonexistant/path/to/file/archive/dir
   File = /proc
   File = /var/tmp
   File = /tmp
   File = /sys
   File = /.journal
   File = /.fsck
 }
}

# vpsjavierpzh
FileSet {
 Name = "vpsjavierpzh-Datos"
 Include {
   Options {
     signature = MD5
     compression = GZIP
   }
   File = /home
   File = /etc
   File = /var
 }
 Exclude {
   File = /var/lib/bacula
   File = /nonexistant/path/to/file/archive/dir
   File = /proc
   File = /var/tmp
   File = /tmp
   File = /sys
   File = /.journal
   File = /.fsck
 }
}

Llegamos a la sección de los bloques de tipo SCHEDULE, en éstos definiremos la programación de estas tareas, es decir, cuando se llevarán a cabo cada una. En mi caso:

Schedule {
 Name = "Daily"
 Run = Level=Incremental Pool=Daily daily at 02:00
}

Schedule {
 Name = "Weekly"
 Run = Level=Full Pool=Weekly sun at 02:00
}

Schedule {
 Name = "Monthly"
 Run = Level=Full Pool=Monthly 1st sun at 02:00
}

Estamos llegando al final de la configuración de este fichero, en este caso nos encontramos con los equipos clientes, cuyos bloques incluirán las siguientes opciones:

Añado mis clientes:

# Dulcinea
Client {
 Name = dulcinea-fd
 Address = 10.0.1.11
 FDPort = 9102
 Catalog = MyCatalog
 Password = "bacula"
 File Retention = 60 days
 Job Retention = 6 months
 AutoPrune = yes
}

# Sancho
Client {
 Name = sancho-fd
 Address = 10.0.1.8
 FDPort = 9102
 Catalog = MyCatalog
 Password = "bacula"
 File Retention = 60 days
 Job Retention = 6 months
 AutoPrune = yes
}

# Freston
Client {
 Name = freston-fd
 Address = 10.0.1.6
 FDPort = 9102
 Catalog = MyCatalog
 Password = "bacula"
 File Retention = 60 days
 Job Retention = 6 months
 AutoPrune = yes
}

# Quijote
Client {
 Name = quijote-fd
 Address = 10.0.2.6
 FDPort = 9102
 Catalog = MyCatalog
 Password = "bacula"
 File Retention = 60 days
 Job Retention = 6 months
 AutoPrune = yes
}

# vpsjavierpzh
Client {
 Name = vpsjavierpzh-fd
 Address = 51.210.105.17
 FDPort = 9102
 Catalog = MyCatalog
 Password = "bacula"
 File Retention = 60 days
 Job Retention = 6 months
 AutoPrune = yes
}

Una vez definidos los clientes, lo que tendremos que definir es que tipo de almacenamiento vamos a tener, en mi caso, los parámetros a modificar son:

Nos quedaría un bloque como este:

Storage {
 Name = volcopias
 Address = 10.0.1.11
 SDPort = 9103
 Password = "bacula"
 Device = FileChgr1
 Media Type = File
 Maximum Concurrent Jobs = 10
}

En la sección Catalog, nos encontraremos con la configuración relativa a la base de datos:

Catalog {
  Name = MyCatalog
  dbname = "bacula"; DB Address = "localhost"; DB Port= "3306"; dbuser = "bacula"; dbpassword = "bacula"
}

Nos encontramos frente a la última sección a editar, que no es otra que dónde se encuentran los bloques Pool. En ellos nos encontramos con estos parámetros:

Introduzco los siguientes bloques:

Pool {
 Name = Daily
 Pool Type = Backup
 Recycle = yes
 AutoPrune = yes
 VolumeRetention = 8d
}

Pool {
 Name = Weekly
 Pool Type = Backup
 Recycle = yes
 AutoPrune = yes
 VolumeRetention = 32d
}

Pool {
 Name = Monthly
 Pool Type = Backup
 Recycle = yes
 AutoPrune = yes
 VolumeRetention = 365d
}

Pool {
 Name = Backup-Restore
 Pool Type = Backup
 Recycle = yes
 AutoPrune = yes
 Volume Retention = 366 days
 Maximum Volume Bytes = 50G
 Maximum Volumes = 100
 Label Format = "Remoto"
}

En este punto, ya habríamos terminado de modificar el fichero /etc/bacula/bacula-dir.conf, ya que los apartados siguientes los dejaríamos como vienen por defecto.

Para comprobar que no hay ningún error en nuestra configuración anterior, podemos emplear el siguiente comando:

bacula-dir -tc /etc/bacula/bacula-dir.conf

¿No nos reporta ningún error? Perfecto, podemos seguir con el siguiente punto.

Al principio comenté que había añadido un nuevo volumen en el que iría almacenando las distintas copias, pero ese nuevo disco aún no se encuentra montado en el sistema, por tanto vamos a proceder a prepararlo para su correcto funcionamiento.

Vamos a crear en él una partición nueva:

root@dulcinea:~# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    254:0    0  10G  0 disk
└─vda1 254:1    0  10G  0 part /
vdb    254:16   0  10G  0 disk

root@dulcinea:~# gdisk /dev/vdb
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.

Command (? for help): n
Partition number (1-128, default 1):
First sector (34-20971486, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-20971486, default = 20971486) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/vdb.
The operation has completed successfully.

root@dulcinea:~# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda    254:0    0  10G  0 disk
└─vda1 254:1    0  10G  0 part /
vdb    254:16   0  10G  0 disk
└─vdb1 254:17   0  10G  0 part

Bien, ahora nos quedaría asignarle un sistema de ficheros (en mi caso, ext4) y montarlo en nuestro sistema, pero además me interesa que se monte automáticamente en cada arranque del sistema, por tanto, también lo añadiré al fichero /etc/fstab. Crearé un directorio /bacula, ruta donde se montará este nuevo dispositivo y además se almacenarán las distintas copias:

root@dulcinea:~# mkfs.ext4 /dev/vdb1
mke2fs 1.44.5 (15-Dec-2018)
Creating filesystem with 2621179 4k blocks and 655360 inodes
Filesystem UUID: 436fe1ec-96a3-4531-9815-74254d6a730d
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

root@dulcinea:~# lsblk -f
NAME   FSTYPE LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINT
vda                                                                     
└─vda1 ext4         9659e5d4-dd87-42af-bf70-0bb6f7b2e31b    7.7G    17% /
vdb                                                                     
└─vdb1 ext4         436fe1ec-96a3-4531-9815-74254d6a730d

root@dulcinea:~# mkdir -p /bacula/backup

root@dulcinea:~# chown -R bacula:bacula /bacula/

root@dulcinea:~# chmod 755 -R /bacula/backup/

root@dulcinea:~# cd ../

root@dulcinea:/# ls -l
...
drwxr-xr-x  3 bacula bacula  4096 Jan 28 12:05 bacula
...

root@dulcinea:/# ls -l /bacula/
total 4
drwxr-xr-x 2 bacula bacula 4096 Jan 28 12:05 backup

Lo último que nos quedaría por realizar es la configuración del /etc/fstab, para lo que añadimos la siguiente línea:

UUID=436fe1ec-96a3-4531-9815-74254d6a730d       /bacula ext4    defaults        0       0

Hecho esto, vamos a indicarle a nuestro sistema que vuelve a leer este fichero de configuración (lo que sería lo mismo que un reinicio), con el siguiente comando:

root@dulcinea:~# mount -a

root@dulcinea:~# lsblk -f
NAME   FSTYPE LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINT
vda                                                                     
└─vda1 ext4         9659e5d4-dd87-42af-bf70-0bb6f7b2e31b    7.7G    17% /
vdb                                                                     
└─vdb1 ext4         436fe1ec-96a3-4531-9815-74254d6a730d    9.2G     0% /bacula

Pasamos con el fichero /etc/bacula/bacula-sd.conf. En él se encuentran los paŕametros del director, que, al fin y al cabo, será el encargado de utilizar el nuevo volumen.

Haré igual que con el primer fichero, y lo he ordenado por secciones. En ésta primera, nos encontramos con la definición del nombre del director, además de su dirección IP:

Storage {                             # definition of myself
  Name = dulcinea-sd
  SDPort = 9103                  # Director's port
  WorkingDirectory = "/var/lib/bacula"
  Pid Directory = "/run/bacula"
  Plugin Directory = "/usr/lib/bacula"
  Maximum Concurrent Jobs = 20
  SDAddress = 10.0.1.11
}

La siguiente sección define el director encargado de conectar con el demonio Storage, que acabamos de definir anteriormente. Como en mi caso, es el mismo director, los diferencio con las terminaciones (“-sd” y “-dir”). También indicamos la contraseña que estamos utilizando:

Director {
  Name = dulcinea-dir
  Password = "bacula"
}

Este apartado se encargará de proporcionarle al director los permisos adecuados para que pueda ver el estado del proceso de almacenamiento de las copias. Se le añade la terminación “-mon”:

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

Nos encontramos ante la última sección del fichero, en ella se define el cargador automático virtual, que si recordamos hicimos mención a él en el primer fichero. En el primer bloque hacemos referencia al dispositivo que se configura en el segundo bloque:

Autochanger {
  Name = FileChgr1
  Device = FileStorage
  Changer Command = ""
  Changer Device = /dev/null
}

Device {
  Name = FileStorage
  Media Type = File
  Archive Device = /bacula/backup
  LabelMedia = yes;                   # lets Bacula label unlabeled media
  Random Access = Yes;
  AutomaticMount = yes;               # when device opened, read it
  RemovableMedia = no;
  AlwaysOpen = no;
  Maximum Concurrent Jobs = 5
}

Al igual que con el primer fichero, para comprobar que no hay ningún error en nuestra configuración, vamos a emplear el siguiente comando:

bacula-sd -tc /etc/bacula/bacula-sd.conf

¿No nos reporta ningún error? Perfecto, podemos seguir con el siguiente y último fichero por parte del servidor.

Vamos a reiniciar los servicios que hacen uso de los ficheros modificados hasta este punto para que las nuevas configuraciones sean cargadas, y además los habilitaremos para que se inicien en cada arranque:

systemctl restart bacula-sd.service
systemctl enable bacula-sd.service
systemctl restart bacula-director.service
systemctl enable bacula-director.service

Estamos a punto de terminar las configuraciones del servidor, de hecho nos falta tan sólo un fichero, y es el /etc/bacula/bconsole.conf. Este fichero contiene la configuración que nos permite acceder a la consola, y dentro de él tendremos que asegurarnos que los apartados de nombre, dirección y contraseña se encuentran correctamente.

Director {
  Name = dulcinea-dir
  DIRport = 9101
  address = 10.0.1.11
  Password = "bacula"
}

Hecho esto, habremos terminado la configuración en la parte del director.

Pasamos a la parte de los clientes.

Aunque hayamos terminado de configurar el servidor, aún no hemos terminado nuestro trabajo en Dulcinea, ya que esta máquina también va a formar parte de los clientes como hemos visto antes. Hay que decir que las configuraciones de los clientes se realizan todas de la misma forma, por lo que, explicaré ésta primera con más detalle y las siguientes obviando los hechos.

El primer paso sería instalar el software necesario, que en Dulcinea ya se encuentra instalado, y además habilitar su funcionamiento en cada inicio:

apt install bacula-client -y
systemctl enable bacula-fd.service

En CentOS (Quijote) se instala con el comando:

dnf install bacula-client -y

El fichero que debemos modificar es el que se encuentra en la ruta /etc/bacula/bacula-fd.conf.

En dicho archivo indicaremos los parámetros del director, que en este primer caso, es el propio equipo. Además, indicaremos el director que gestionará el demonio. También tendremos que definir el cliente, del que debemos indicar el nombre y la dirección IP. Por último, en el bloque llamado Messages, indicaremos el nombre del director, esto nos permitirá realizar un restore cuando nos sea necesario.

En mi caso, el fichero /etc/bacula/bacula-fd.conf de la máquina Dulcinea queda de esta forma:

Director {
  Name = dulcinea-dir
  Password = "bacula"
}

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

FileDaemon {                          # this is me
  Name = dulcinea-fd
  FDport = 9102                  # where we listen for the director
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /run/bacula
  Maximum Concurrent Jobs = 20
  Plugin Directory = /usr/lib/bacula
  FDAddress = 10.0.1.11
}

Messages {
  Name = Standard
  director = dulcinea-dir = all, !skipped, !restored
}

Una vez terminada la configuración, reiniciamos el servicio y aplicaremos los cambios:

systemctl restart bacula-fd.service

Llegó el turno de Sancho. Su configuración queda de la siguiente forma:

Director {
  Name = dulcinea-dir
  Password = "bacula"
}

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

FileDaemon {                          # this is me
  Name = sancho-fd
  FDport = 9102                  # where we listen for the director
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /run/bacula
  Maximum Concurrent Jobs = 20
  Plugin Directory = /usr/lib/bacula
  FDAddress = 10.0.1.8
}

Messages {
  Name = Standard
  director = dulcinea-dir = all, !skipped, !restored
}

Es el turno de Freston. Su configuración queda de la siguiente forma:

Director {
  Name = dulcinea-dir
  Password = "bacula"
}

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

FileDaemon {                          # this is me
  Name = freston-fd
  FDport = 9102                  # where we listen for the director
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /run/bacula
  Maximum Concurrent Jobs = 20
  Plugin Directory = /usr/lib/bacula
  FDAddress = 10.0.1.6
}

Messages {
  Name = Standard
  director = dulcinea-dir = all, !skipped, !restored
}

En Quijote el contenido del fichero sería:

Director {
  Name = dulcinea-dir
  Password = "bacula"
}

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

FileDaemon {                          # this is me
  Name = quijote-fd
  FDport = 9102                  # where we listen for the director
  WorkingDirectory = /var/spool/bacula
  Pid Directory = /var/run
  Maximum Concurrent Jobs = 20
  Plugin Directory = /usr/lib64/bacula
}

Messages {
  Name = Standard
  director = dulcinea-dir = all, !skipped, !restored
}

En la máquina de OVH el fichero tendría este aspecto:

Director {
  Name = dulcinea-dir
  Password = "bacula"
}

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

FileDaemon {                          # this is me
  Name = vpsjavierpzh-fd
  FDport = 9102                  # where we listen for the director
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /run/bacula
  Maximum Concurrent Jobs = 20
  Plugin Directory = /usr/lib/bacula
  FDAddress = 51.210.105.17
}

Messages {
  Name = Standard
  director = dulcinea-dir = all, !skipped, !restored
}

En teoría, ya tendríamos configurados todos los clientes, por lo que supuestamente ya podrían conectar con nuestro director ubicado en Dulcinea. Vamos a ver si es así, pero antes, debemos reiniciar los servicios del director:

root@dulcinea:~# systemctl restart bacula-fd.service

root@dulcinea:~# systemctl restart bacula-sd.service

root@dulcinea:~# systemctl restart bacula-director.service

root@dulcinea:~# bconsole
Connecting to Director 10.0.1.11:9101
1000 OK: 103 dulcinea-dir Version: 9.4.2 (04 February 2019)
Enter a period to cancel a command.

*status client
The defined Client resources are:
     1: dulcinea-fd
     2: sancho-fd
     3: freston-fd
     4: quijote-fd
     5: vpsjavierpzh-fd
Select Client (File daemon) resource (1-5): 1
Connecting to Client dulcinea-fd at 10.0.1.11:9102

dulcinea-fd Version: 9.4.2 (04 February 2019)  x86_64-pc-linux-gnu debian 10.5
Daemon started 28-Jan-21 14:11. Jobs: run=0 running=0.
 Heap: heap=114,688 smbytes=23,250 max_bytes=23,267 bufs=70 max_bufs=70
 Sizes: boffset_t=8 size_t=8 debug=0 trace=0 mode=0,0 bwlimit=0kB/s
 Plugin: bpipe-fd.so

Running Jobs:
Director connected at: 28-Jan-21 14:25
No Jobs running.
====

Terminated Jobs:
====

*status client
The defined Client resources are:
     1: dulcinea-fd
     2: sancho-fd
     3: freston-fd
     4: quijote-fd
     5: vpsjavierpzh-fd
Select Client (File daemon) resource (1-5): 2
Connecting to Client sancho-fd at 10.0.1.8:9102

sancho-fd Version: 9.4.2 (04 February 2019)  x86_64-pc-linux-gnu ubuntu 20.04
Daemon started 28-Jan-21 13:27. Jobs: run=0 running=0.
 Heap: heap=110,592 smbytes=22,002 max_bytes=22,019 bufs=68 max_bufs=68
 Sizes: boffset_t=8 size_t=8 debug=0 trace=0 mode=0,0 bwlimit=0kB/s
 Plugin: bpipe-fd.so

Running Jobs:
Director connected at: 28-Jan-21 14:25
No Jobs running.
====

Terminated Jobs:
====

*status client
The defined Client resources are:
The defined Client resources are:
     1: dulcinea-fd
     2: sancho-fd
     3: freston-fd
     4: quijote-fd
     5: vpsjavierpzh-fd
Select Client (File daemon) resource (1-5): 3
Connecting to Client freston-fd at 10.0.1.6:9102

freston-fd Version: 9.4.2 (04 February 2019)  x86_64-pc-linux-gnu debian 10.5
Daemon started 28-Jan-21 13:29. Jobs: run=0 running=0.
 Heap: heap=114,688 smbytes=23,242 max_bytes=23,260 bufs=70 max_bufs=70
 Sizes: boffset_t=8 size_t=8 debug=0 trace=0 mode=0,0 bwlimit=0kB/s
 Plugin: bpipe-fd.so

Running Jobs:
Director connected at: 28-Jan-21 14:25
No Jobs running.
====

Terminated Jobs:
====

*status client
The defined Client resources are:
     1: dulcinea-fd
     2: sancho-fd
     3: freston-fd
     4: quijote-fd
     5: vpsjavierpzh-fd
Select Client (File daemon) resource (1-5): 4
Connecting to Client quijote-fd at 10.0.2.6:9102
Failed to connect to Client quijote-fd.

*status client
The defined Client resources are:
     1: dulcinea-fd
     2: sancho-fd
     3: freston-fd
     4: quijote-fd
     5: vpsjavierpzh-fd
Select Client (File daemon) resource (1-5): 5
Connecting to Client vpsjavierpzh-fd at 51.210.105.17:9102

vpsjavierpzh-fd Version: 9.4.2 (04 February 2019)  x86_64-pc-linux-gnu debian 10.5
Daemon started 28-Jan-21 14:52. Jobs: run=0 running=0.
 Heap: heap=114,688 smbytes=22,016 max_bytes=22,033 bufs=68 max_bufs=68
 Sizes: boffset_t=8 size_t=8 debug=0 trace=0 mode=0,0 bwlimit=0kB/s
 Plugin: bpipe-fd.so

Running Jobs:
Director connected at: 28-Jan-21 14:58
No Jobs running.
====

Terminated Jobs:
====

Vaya, parece que con Quijote no llega a conectar, pero con los otros equipos sí. La cuestión es que hay que recordar que CentOS incorpora un firewall por defecto bastante restrictivo, por lo que debemos abrir los puertos que utiliza Bacula:

[root@quijote ~]# firewall-cmd --permanent --add-port=9101/tcp
success

[root@quijote ~]# firewall-cmd --permanent --add-port=9102/tcp
success

[root@quijote ~]# firewall-cmd --permanent --add-port=9103/tcp
success

[root@quijote ~]# firewall-cmd --reload
success

Vamos a probar de nuevo a ver si ahora se produce la conexión con Quijote:

root@dulcinea:~# bconsole
Connecting to Director 10.0.1.11:9101
1000 OK: 103 dulcinea-dir Version: 9.4.2 (04 February 2019)
Enter a period to cancel a command.

*status client
The defined Client resources are:
     1: dulcinea-fd
     2: sancho-fd
     3: freston-fd
     4: quijote-fd
     5: vpsjavierpzh-fd
Select Client (File daemon) resource (1-5): 4
Connecting to Client quijote-fd at 10.0.2.6:9102

quijote-fd Version: 9.0.6 (20 November 2017) x86_64-redhat-linux-gnu redhat (Core)
Daemon started 28-Jan-21 13:43. Jobs: run=0 running=0.
 Heap: heap=102,400 smbytes=21,976 max_bytes=21,993 bufs=68 max_bufs=68
 Sizes: boffset_t=8 size_t=8 debug=0 trace=0 mode=0,0 bwlimit=0kB/s
 Plugin: bpipe-fd.so

Running Jobs:
Director connected at: 28-Jan-21 14:28
No Jobs running.
====

Terminated Jobs:
====

Ahora sí se conecta, problema resuelto.

Una vez hemos comprobado que las conexiones se realizan, debemos crear los nodos de almacenamiento, donde se irán guardando las diferentes copias.

root@dulcinea:~# bconsole
Connecting to Director 10.0.1.11:9101
1000 OK: 103 dulcinea-dir Version: 9.4.2 (04 February 2019)
Enter a period to cancel a command.

*label
Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"
Automatically selected Storage: volcopias
Enter new Volume name: backup-diario
Defined Pools:
     1: Backup-Restore
     2: Daily
     3: Default
     4: File
     5: Monthly
     6: Scratch
     7: Weekly
Select the Pool (1-7): 2
Connecting to Storage daemon volcopias at 10.0.1.11:9103 ...
Sending label command for Volume "backup-diario" Slot 0 ...
3000 OK label. VolBytes=255 VolABytes=0 VolType=1 Volume="backup-diario" Device="FileStorage" (/bacula/backup)
Catalog record for Volume "backup-diario", Slot 0  successfully created.
Requesting to mount FileChgr1 ...
3906 File device ""FileStorage" (/bacula/backup)" is always mounted.

*label
Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"
Automatically selected Storage: volcopias
Enter new Volume name: backup-semanal
Defined Pools:
     1: Backup-Restore
     2: Daily
     3: Default
     4: File
     5: Monthly
     6: Scratch
     7: Weekly
Select the Pool (1-7): 7
Connecting to Storage daemon volcopias at 10.0.1.11:9103 ...
Sending label command for Volume "backup-semanal" Slot 0 ...
3000 OK label. VolBytes=257 VolABytes=0 VolType=1 Volume="backup-semanal" Device="FileStorage" (/bacula/backup)
Catalog record for Volume "backup-semanal", Slot 0  successfully created.
Requesting to mount FileChgr1 ...
3906 File device ""FileStorage" (/bacula/backup)" is always mounted.

*label
Automatically selected Storage: volcopias
Enter new Volume name: backup-mensual
Defined Pools:
     1: Backup-Restore
     2: Daily
     3: Default
     4: File
     5: Monthly
     6: Scratch
     7: Weekly
Select the Pool (1-7): 5
Connecting to Storage daemon volcopias at 10.0.1.11:9103 ...
Sending label command for Volume "backup-mensual" Slot 0 ...
3000 OK label. VolBytes=258 VolABytes=0 VolType=1 Volume="backup-mensual" Device="FileStorage" (/bacula/backup)
Catalog record for Volume "backup-mensual", Slot 0  successfully created.
Requesting to mount FileChgr1 ...
3906 File device ""FileStorage" (/bacula/backup)" is always mounted.

Para terminar, y escribiendo esto varias semanas más tarde, vamos a comprobar que las copias se están realizando de manera correcta y por supuesto, automática.

*status client=dulcinea-fd
Connecting to Client dulcinea-fd at 10.0.1.11:9102

dulcinea-fd Version: 9.4.2 (04 February 2019)  x86_64-pc-linux-gnu debian 10.5
Daemon started 09-Feb-21 12:34. Jobs: run=4 running=0.
 Heap: heap=126,976 smbytes=23,327 max_bytes=681,576 bufs=77 max_bufs=161
 Sizes: boffset_t=8 size_t=8 debug=0 trace=0 mode=0,0 bwlimit=0kB/s
 Plugin: bpipe-fd.so

Running Jobs:
Director connected at: 13-Feb-21 12:43
No Jobs running.
====

Terminated Jobs:
 JobId  Level    Files      Bytes   Status   Finished        Name
===================================================================
    47  Incr        101    18.23 M  OK       06-Feb-21 02:00 Dulcinea-Diario
    52  Incr        126    18.70 M  OK       07-Feb-21 02:00 Dulcinea-Diario
    53  Full      4,952    47.55 M  OK       07-Feb-21 02:31 Dulcinea-Semanal
    54  Full      4,953    53.34 M  OK       07-Feb-21 03:01 Dulcinea-Mensual
    67  Incr        100    29.05 M  OK       08-Feb-21 02:00 Dulcinea-Diario
    72  Incr        580    51.11 M  OK       09-Feb-21 02:00 Dulcinea-Diario
    77  Incr        560    31.45 M  OK       10-Feb-21 02:00 Dulcinea-Diario
    82  Incr        141    29.21 M  OK       11-Feb-21 02:00 Dulcinea-Diario
    87  Incr        103    30.76 M  OK       12-Feb-21 02:00 Dulcinea-Diario
    92  Incr        103    30.89 M  OK       13-Feb-21 02:00 Dulcinea-Diario
====

*status client=freston-fd
Connecting to Client freston-fd at 10.0.1.6:9102

freston-fd Version: 9.4.2 (04 February 2019)  x86_64-pc-linux-gnu debian 10.5
Daemon started 09-Feb-21 12:33. Jobs: run=4 running=0.
 Heap: heap=126,976 smbytes=23,325 max_bytes=679,213 bufs=77 max_bufs=155
 Sizes: boffset_t=8 size_t=8 debug=0 trace=0 mode=0,0 bwlimit=0kB/s
 Plugin: bpipe-fd.so

Running Jobs:
Director connected at: 13-Feb-21 12:43
No Jobs running.
====

Terminated Jobs:
 JobId  Level    Files      Bytes   Status   Finished        Name
===================================================================
    49  Incr         48    2.348 M  OK       06-Feb-21 02:00 Freston-Diario
    58  Incr         60    2.920 M  OK       07-Feb-21 02:00 Freston-Diario
    59  Full      3,277    53.23 M  OK       07-Feb-21 02:30 Freston-Semanal
    60  Full      3,277    53.24 M  OK       07-Feb-21 03:01 Freston-Mensual
    69  Incr         48    1.487 M  OK       08-Feb-21 02:00 Freston-Diario
    74  Incr        482    84.39 M  OK       09-Feb-21 02:00 Freston-Diario
    79  Incr        642    29.99 M  OK       10-Feb-21 02:00 Freston-Diario
    84  Incr         94    27.96 M  OK       11-Feb-21 02:00 Freston-Diario
    89  Incr         50    963.8 K  OK       12-Feb-21 02:00 Freston-Diario
    94  Incr         50    1.001 M  OK       13-Feb-21 02:00 Freston-Diario
====

*status client=quijote-fd
Connecting to Client quijote-fd at 10.0.2.6:9102

quijote-fd Version: 9.0.6 (20 November 2017) x86_64-redhat-linux-gnu redhat (Core)
Daemon started 02-Feb-21 12:54. Jobs: run=11 running=0.
 Heap: heap=8,192 smbytes=23,297 max_bytes=1,139,409 bufs=77 max_bufs=281
 Sizes: boffset_t=8 size_t=8 debug=0 trace=0 mode=0,0 bwlimit=0kB/s
 Plugin: bpipe-fd.so

Running Jobs:
Director connected at: 13-Feb-21 12:43
No Jobs running.
====

Terminated Jobs:
 JobId  Level      Files    Bytes   Status   Finished        Name
===================================================================
    50  Incr          49    21.17 M  OK       06-Feb-21 02:00 Quijote-Diario
    61  Incr          49    21.17 M  OK       07-Feb-21 02:00 Quijote-Diario
    62  Full      21,048    209.2 M  OK       07-Feb-21 02:31 Quijote-Semanal
    63  Full      21,048    209.2 M  OK       07-Feb-21 03:02 Quijote-Mensual
    70  Incr          78    21.20 M  OK       08-Feb-21 02:00 Quijote-Diario
    75  Incr       1,977    75.43 M  OK       09-Feb-21 02:00 Quijote-Diario
    80  Incr         245    51.14 M  OK       10-Feb-21 02:00 Quijote-Diario
    85  Incr      14,058    101.5 M  OK       11-Feb-21 02:01 Quijote-Diario
    90  Incr          52    21.32 M  OK       12-Feb-21 02:00 Quijote-Diario
    95  Incr          62    22.35 M  OK       13-Feb-21 02:00 Quijote-Diario
====

Podemos ver, como he puesto de ejemplo a las máquinas Dulcinea, Freston y Quijote, y en todas ellas se están realizando correctamente todas las copias, lo que significa que el sistema de copias de seguridad se encuentra funcionando correctamente, y el contenido del post habría finalizado.