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:
- Creación del escenario de trabajo en OpenStack
- Modificación del escenario de trabajo en OpenStack
- Servidores OpenStack: DNS, Web y Base de Datos
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
-
Director (DIR, bacula-director): es el programa servidor que supervisa todas las funciones necesarias para las operaciones de copia de seguridad y restauración. Es el eje central de Bacula y en él se declaran todos los parámetros necesarios. Se ejecuta como un demonio en el servidor.
-
Storage (SD, bacula-sd): es el programa que gestiona las unidades de almacenamiento donde se almacenarán los datos. Es el responsable de escribir y leer en los medios que utilizaremos para nuestras copias de seguridad. Se ejecuta como un demonio en la máquina propietaria de los medios utilizados. En muchos casos será en el propio servidor, pero también puede ser otro equipo independiente.
-
Catalog: es la base de datos (MySQL en mi caso) que almacena la información necesaria para localizar donde se encuentran los datos salvaguardados de cada archivo, de cada cliente, … En muchos casos será en el propio servidor, pero también puede ser otro equipo independiente.
-
Console (bconsole): es el programa que permite la interacción con el Director para todas las funciones del servidor. La versión original es una aplicación en modo texto (bconsole). Existen igualmente aplicaciones GUI para Windows y Linux (Webmin, Bacula Admin Tool, Bacuview, Webacula, Reportula, Bacula-Web, …).
-
File (FD): este servicio, conocido como cliente o servidor de ficheros está instalado en cada máquina a salvaguardar y es específico al sistema operativo donde se ejecuta. Responsable para enviar al Director los datos cuando este lo requiera.
Conceptos importantes
Para manejar mejor Bacula es importante conocer ciertos conceptos:
-
Un backup consiste en una tarea (JOB), un conjunto de directorios/archivos (FILESET), un cliente (CLIENT), un horario (SCHEDULE) y unos recursos (POOL).
-
El FILESET es lo que vamos a guardar, el CLIENT es la proveniencia de los datos, el SCHEDULE determina cuando lo vamos a ejecutar y el POOL es el destino de la copia de seguridad.
-
Normalmente, una combinación CLIENT/FILESET generará un determinado JOB. Además de los JOB de backup, existirán también JOB de restore y otros de control y administración.
-
Los medios de almacenamiento se definen como POOL. El POOL es un conjunto de volúmenes, son ficheros que actúan como un disco duro, y dentro de ellos están las copias de seguridad.
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:
-
Name: nombre de la tarea
-
Type: tipo de tarea (backup)
-
Level: nivel de la tarea
-
Client: nombre del cliente en el que se va a ejecutar esta tarea
-
FileSet: información que va a copiar. Será definida más adelante en el apartado FileSet
-
Schedule: programación que tendrá dicha tarea
-
Storage: nombre del cargador virtual automático que cargará el recurso de almacenamiento
-
Messages: tipo de mensaje, indica como mandará los mensajes de sucesos
-
Pool: indicaremos el nombre del apartado Pool que se configurará mas adelante y en él estamos indicando el volumen de almacenamiento donde se creará y almacenará las copias
-
SpoolAttributes: esta opción permite trabajar con los atributos del Spool en un fichero temporal
-
Priority: indica el nivel de prioridad
-
Write Bootstrap: este apartado indica donde esta el fichero bacula
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:
-
Name: nombre de la tarea
-
Type: tipo que de la tarea (restore)
-
Client: cliente al que le vamos a poder realizar la restauración de la copia
-
Storage: nombre del cargador virtual automático que cargará el recurso de almacenamiento
-
FileSet: tipo de tarea al que hace referencia la copia de la que queremos realizar la restauración
-
Pool: indicaremos el nombre del apartado Pool que se configurará mas adelante y en él estamos indicando el volumen de almacenamiento donde se creará y almacenará las copias
-
Messages: tipo de mensaje, indica como mandará los mensajes de sucesos
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:
-
Name: Nombre distintivo del cliente
-
Address: Direccion ip del cliente
-
FDPort: el puerto, dejamos el valor por defecto
-
Catalog: dejamos el valor por defecto
-
Password: contraseña del cliente
-
File Retention: dejamos el valor por defecto
-
Job Retention: dejamos el valor por defecto
-
AutoPrune: dejamos el valor por defecto
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:
-
Name: para que concuerde con el que hacemos referencia al principio del fichero en el segundo apartado
-
Address: dirección IP, indicaremos la de nuestro propio servidor para así indicar donde almacenar la información
-
SDPort: el puerto, dejamos el valor por defecto
-
Password: para que sea la misma que hemos indicado anteriormente
-
Device: tipo de dispositivo que en nuestro caso es File
-
Media Type: dejamos el valor por defecto
-
Maximum Concurrent Jobs: dejamos el valor por defecto
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:
-
Name: nombre del pool
-
Pool type: tipo de pool
-
Recycle: reciclado automático de los volúmenes, está activado por defecto
-
AutoPrune: expirador automáticos de los volúmenes, está activado por defecto
-
Volume Retention: tiempo de retención que deseamos almacenar los backups realizados
-
Maximum Volume Bytes: dejamos el valor por defecto
-
Maximum Volumes: dejamos el valor por defecto
-
Label Format: dejamos el valor por defecto
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.