Este (extenso) artículo cubre la instalación, configuración y puesta en funcionamiento de todos los componentes de un servidor de backup Bacula sobre Debian con PostgreSQL. Además de una breve introducción de cada uno de sus componentes y funcionamiento.

Instalación de Bacula

Este artículo explica cómo instalar la última versión de Bacula desde los fuentes, aunque en las distribuciones GNU/Linux más populares es posible instalarlo directamente desde el gestor de paquetes (apt-get install bacula-server bacula-client en Debian y derivados).

Obtener una copia del código fuente de Bacula:

$ cd && git clone http://git.bacula.org/bacula

Revisar la documentación de instalación:

$ cd bacula/
$ less INSTALL

Revisar las opciones de configuración de Bacula:

$ ./configure --help

Instalar las dependencias necesarias para compilar:

# apt-get install g++

Configurar Bacula con soporte para OpenSSL y bases de datos PostgreSQL:

$ ./configure --prefix=/usr/local/bacula --with-openssl --with-postgresql

Compilar e instalar:

$ make
# make install

Por último, instalar los scripts de inicio bacula-dir, bacula-fd y bacula-sd en el directorio /etc/init.d:

# make install-autostart

Instalación y configuración del catálogo

El siguiente paso consiste en instalar el motor de bases de datos donde alojar el catálogo de Bacula. Tal como mencioné anteriormente, Bacula soporta MySQL, PostgreSQL y SQLite. En este caso voy a utilizar un servidor de bases de datos PostgreSQL. Luego de instalar Postgres desde el gestor de paquetes (apt-get install postgresql), o compilar e instalar Postgres desde sus fuentes, es necesario instalar el catálogo de Bacula. Si se utiliza un servidor de bases de datos Postgres existente, sólo es necesario crear una nueva instancia.

Si se va a utilizar el código Batch Insert (carga los atributos diez veces más rápido), es necesario que PostgreSQL haya sido compilado con la opción --enable-thread-safety, de lo contrario se producirá corrupción de datos. Para determinar si el driver de Postgres referencia a la función de semáforos (mutex) de la librería Pthreads, en el caso de utilizar un servidor Postgres ya existente, es posible recurrir al utilitario readelf:

root@debian7:~# readelf -a /usr/lib/libpq.so.5 | grep -i mutex_lock
00000022bea0  009800000007 R_X86_64_JUMP_SLO 0000000000000000 pthread_mutex_lock + 0
   152: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND pthread_mutex_lock@GLIBC_2.2.5 (5)

Esto significa que Postgres fue compilado con la opción --enable-thread-safety.

Se debe tener en cuenta que Bacula abre dos conexiones contra el servidor de bases de datos por cada trabajo de backup. Por ende se debe tener cuidado con la especificación de max_connections en la configuración del servidor Postgres, de lo contrario es posible que queden trabajos de backup sin correr.

Cambiar al directorio de instalación de Bacula:

root@debian7:~# cd /usr/local/bacula/etc/

Si el servidor Postgres no escucha en el puerto estándar (5432) será necesario especificarlo por parámetro (al igual que el usuario, host, y cualquier otro parámetro adicional a psql):

Antes es necesario otorgar permisos de lectura y ejecución para que el usuario "postgres" pueda ejecutar los scripts:

root@debian7:/usr/local/bacula/etc# chmod +rx .
root@debian7:/usr/local/bacula/etc# chmod +rx *

Luego, cambiar al usuario "postgres":

root@debian7:/usr/local/bacula/etc# su - postgres
postgres@debian7:~$ cd /usr/local/bacula/etc/
postgres@debian7:/usr/local/bacula/etc$ psql -l -h localhost -p 5433
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | es_AR.UTF-8 | es_AR.UTF-8 | 
 template0 | postgres | UTF8     | es_AR.UTF-8 | es_AR.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | es_AR.UTF-8 | es_AR.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 rows)

Se observa que la instancia está vacía (no posee bases de datos).

Crear la base de datos para Bacula:

postgres@debian7:/usr/local/bacula/etc$ ./create_postgresql_database -U postgres -h localhost -p 5433
CREATE DATABASE
ALTER DATABASE
Creation of bacula database succeeded.
Database encoding OK
postgres@debian7:/usr/local/bacula/etc$ psql -l -h localhost -p 5433
                                  List of databases
   Name    |  Owner   | Encoding  |   Collate   |    Ctype    |   Access privileges   
-----------+----------+-----------+-------------+-------------+-----------------------
 bacula    | postgres | SQL_ASCII | C           | C           | 
 postgres  | postgres | UTF8      | es_AR.UTF-8 | es_AR.UTF-8 | 
 template0 | postgres | UTF8      | es_AR.UTF-8 | es_AR.UTF-8 | =c/postgres          +
           |          |           |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8      | es_AR.UTF-8 | es_AR.UTF-8 | =c/postgres          +
           |          |           |             |             | postgres=CTc/postgres
(4 rows)

Luego crear las tablas:

postgres@debian7:/usr/local/bacula/etc$ ./make_postgresql_tables -U postgres -h localhost -p 5433
CREATE TABLE
ALTER TABLE
CREATE INDEX
CREATE TABLE
ALTER TABLE
CREATE INDEX
CREATE TABLE
CREATE INDEX
CREATE INDEX
CREATE TABLE
CREATE INDEX
CREATE TABLE
CREATE INDEX
CREATE TABLE
CREATE INDEX
CREATE TABLE
CREATE TABLE
CREATE INDEX
CREATE TABLE
CREATE INDEX
CREATE TABLE
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE INDEX
CREATE TABLE
CREATE INDEX
CREATE TABLE
CREATE INDEX
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE INDEX
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE INDEX
CREATE TABLE
CREATE INDEX
CREATE TABLE
CREATE TABLE
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
CREATE TABLE
CREATE INDEX
INSERT 0 1
Creation of Bacula PostgreSQL tables succeeded.
postgres@debian7:/usr/local/bacula/etc$ psql -h localhost -p 5433 -d bacula
psql (9.3.4)
Type "help" for help.

bacula=# \dt
             List of relations
 Schema |      Name      | Type  |  Owner   
--------+----------------+-------+----------
 public | basefiles      | table | postgres
 public | cdimages       | table | postgres
 public | client         | table | postgres
 public | counters       | table | postgres
 public | device         | table | postgres
 public | file           | table | postgres
 public | filename       | table | postgres
 public | fileset        | table | postgres
 public | job            | table | postgres
 public | jobhisto       | table | postgres
 public | jobmedia       | table | postgres
 public | location       | table | postgres
 public | locationlog    | table | postgres
 public | log            | table | postgres
 public | media          | table | postgres
 public | mediatype      | table | postgres
 public | path           | table | postgres
 public | pathhierarchy  | table | postgres
 public | pathvisibility | table | postgres
 public | pool           | table | postgres
 public | restoreobject  | table | postgres
 public | snapshot       | table | postgres
 public | status         | table | postgres
 public | storage        | table | postgres
 public | unsavedfiles   | table | postgres
 public | version        | table | postgres
(26 rows)

bacula=# \q

Y crear el usuario "bacula" con privilegios restringidos:

postgres@debian7:/usr/local/bacula/etc$ ./grant_postgresql_privileges -U postgres -h localhost -p 5433
CREATE ROLE
ALTER DATABASE
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
Privileges for user bacula granted on database bacula.

Finalmente, asignar una contraseña al usuario "bacula":

postgres@debian7:/usr/local/bacula/etc$ psql -h localhost -p 5433
psql (9.3.4)
Type "help" for help.

postgres=# alter user bacula with password 'trustno1';
ALTER ROLE
postgres=# \q

Habiendo creado e inicializado el catálogo (base de datos), resta configurar el acceso en la configuración de Bacula.

Primero en la configuración del catálogo del director (bacula-dir.conf):

# Generic catalog service
Catalog { 
  Name = MyCatalog
  dbport = "5432"; dbname = "bacula"; dbuser = "bacula"; dbpassword = "trustno1"
}

Luego en la configuración del trabajo de backup del catálogo ("BackupCatalog"):

  RunBeforeJob = "/usr/local/bacula/etc/make_catalog_backup.pl MyCatalog bacula trustno1"

Configuración de Bacula

Bacula está conformado por 4 componentes principales: Console, Director, Storage, Client. Cada uno tiene su propio archivo de configuración y puede correr en un mismo servidor o en sistemas separados.

  • Console - Programa que hace de interfaz de usuario al Director. En la configuración de la consola se define a qué directores es posible conectarse.
  • Director - Servicio principal que define y ejecuta las tareas de backup. En la configuración del director se definen los clientes y demonios de almacenamiento (Storage Deamons).
  • Client - Clientes a los que se les realizarán copias de seguridad. En la configuración de cada cliente se definen los recursos a los que se les realizarán copias de seguridad.
  • Storage - Demonio que se encarga de gestionar las copias sobre los diversos dispositivos de backup disponibles (discos, cintas, etc.)

Antes de comenzar con la configuración de los diversos componentes, crear dos directorios locales en el servidor de backup para guardar copias de resguardo y restauraciones:

root@debian7:/usr/local/bacula# mkdir /usr/local/bacula/backup
root@debian7:/usr/local/bacula# mkdir /usr/local/bacula/restore

Configuración del director

bacula-dir.conf

La configuración del director es la más compleja y la que más a menudo debe modificarse (a medida que se agregan nuevos clientes al servicio de backup).

Dentro de la configuración se definen trabajos (Job), valores por defecto para trabajos (JobDefs), programación de trabajos (Schedule), archivos a resguardar para cada cliente (FileSet), clientes (Client), medios de almacenamiento (Storage), pooles de almacenamiento asociados a trabajos (Pool), bases de datos (Catalog) y mensajes (Messages) a enviar o loguear.

El inconveniente al aglomerar tantas clases de configuraciones en un único archivo, es que el tamaño y complejidad aumenta al punto de volverse inmanejable. Sin embargo es posible separar la configuración en múltiples archivos utilizando la sentencia @Filename.

Por lo general se define un trabajo para cada cliente. Cada trabajo puede referenciar a un único FileSet y a un único cliente.

Es posible definir diferentes pooles de almacenamiento, aunque es común utilizar un único pool si se cuenta con pocos clientes. El uso de múltiples catálogos está pensado para garantizar la escalabilidad del servidor de backup en caso de contar con muchos clientes.

Por defecto, el director incluye una configuración mínima con algunos trabajos de ejemplo sobre sí mismo. Durante la instalación, se crean contraseñas aleatorias. Si se desean modificar es necesario mantener la consistencia entre todos los componentes (director, clientes y storage).

El director escucha peticiones desde la consola (Console) en una dirección IP y puerto (9101 por defecto) que se pueden especificar a través de las directivas DirAddresses, DirAddress o DirPort.

La configuración de trabajos es extensa y compleja, por lo que se requiere revisar cuidadosamente la documentación al respecto. Los trabajos pueden ser de tipo backup, restore y más. Cada trabajo indica un conjunto de archivos a resguardar (FileSet), un cliente, un tipo (Level, que puede ser completo, diferencial, incremental, etc.), una planificación (Schedule), y muchas opciones más.

Cada trabajo puede tener a lo sumo un único schedule, aunque la configuración Schedule admite múltiples directivas run, para lanzar una tarea en diferentes tiempos. Si un trabajo no tiene un schedule asociado, sólo puede ser lanzado manualmente. La documentación posee varios ejemplos útiles de programación de trabajos.

Una funcionalidad interesante que tiene Bacula es la capacidad de monitorear y controlar la evolución temporal de los diferentes trabajos. Es posible configurar el tiempo máximo que un trabajo puede esperar para iniciar (porque otros trabajos están corriendo), el tiempo máximo que puede esperar por un recurso, el tiempo máximo de corrida, y el tiempo máximo total desde que fue planificado. Esto permite evitar inconsistencias, demoras que compitan por los recursos y provoquen conflictos con los periodos de mayor carga (los casos en que las tareas de backup demoran y se solapan con los horarios habituales de mayor carga en los sistemas), detectar cuellos de botella en medios de almacenamiento, etc.

Cada FileSet define un conjunto de archivos y directorios a resguardar y excluir. Siempre se deben especificar rutas absolutas. Bacula procesa los directorios recursivamente pero por defecto no atraviesa sistemas de archivos (ver opción onefs en la configuración del FileSet), por lo que es necesario indicarlos explícitamente en la configuración de Include. Tener cuidado de no incluir un directorio dos veces, porque Bacula resguardará dos copias, desperdiciando tiempo y espacio. El manual de Bacula provee diferentes ejemplos de configuración de FileSets.

En la configuración de clientes (secciones Client), es posible definir un máximo número de trabajos concurrentes por clientes, e incluso es posible definir un ancho de banda máximo permitido por cliente a través de la directiva Maximum Bandwidth Per Job.

Los recursos de almacenamiento (Storage) asociados al Director poseen una configuración Heartbeat Interval para mantener las conexiones con los demonios de almacenamiento abiertas (keepalive).

Tal como menciona el manual, la mayoría de las instalaciones de Bacula utilizan un único pool.

El catálogo (Catalog) define la base de datos (SQLite, MySQL o PostgreSQL) utilizada por el director para cada trabajo. Bacula admite cualquier número de catálogos, y cada trabajo puede usar uno distinto. SQLite es un motor implementado como librería y compilado junto con Bacula, por lo cual debe residir en el mismo host que el director. En cambio, los catálogos implementados con MySQL y PostgreSQL pueden residir en hosts remotos.

El director incluye trabajos de ejemplo para utilizar a modo de prueba, e incluye un trabajo para resguardar el catálogo. Editar el archivo de configuración y realizar los siguientes cambios.

Buscar el trabajo "BackupClient1" y renombrarlo de manera adecuada:

Job {
  Name = "BackupArchivosLocales"
  JobDefs = "DefaultJob"
}

Este trabajo guarda copias de respaldo de los archivos del propio servidor de backup.

Buscar el trabajo "RestoreFiles", renombrarlo adecuadamente y configurar el directorio de restauración creado anteriormente:

Job {
  Name = "RestoreArchivosLocales"
  Type = Restore
  Client=debian7-fd
  Storage = File1
# The FileSet and Pool directives are not used by Restore Jobs
# but must not be removed
  FileSet="Full Set"
  Pool = File
  Messages = Standard
  Where = /usr/local/bacula/restore
}

Dentro del FileSet "Full Set", es posible habilitar la compresión con GZIP:

FileSet {
  Name = "Full Set"
  Include {
    Options {
      signature = MD5
      compression = GZIP
    }

Inicialmente es deseable crear, a modo de prueba, backups de un único directorio de poco tamaño, por ejemplo /etc:

    File = /etc

Además, excluir los directorios utilizados para backup y restauración:

  Exclude {
    File = /opt/bacula/working
    File = /usr/local/bacula/backup
    File = /usr/local/bacula/restore
    File = /tmp
    File = /proc
    File = /tmp
    File = /sys
    File = /.journal
    File = /.fsck
  }

Luego configurar la conexión al demonio de almacenamiento:

Storage {
  Name = File1
# Do not use "localhost" here
  Address = backup.linuxito.com                # N.B. Use a fully qualified name here
  SDPort = 9103
  Password = "bFsCqLHR4N/yP6dhb+/JoaGs0UrcBZWjJGtc5x3hsDKQ"
  Device = FileStorage
  Media Type = File

En la variable Address se debe especificar un nombre calificado o dirección IP donde escuchará el demonio de almacenamiento. Es importante no utilizar "localhost". Si se desea mejorar la seguridad, se debe utilizar una red privada de backup o VPN, junto con un firewall. Pero no funciona utilizando "localhost".

Además, utilizar el dispositivo "FileStorage" y el medio "File", tal como se observa.

La configuración del director incluye el acceso a un segundo demonio de almacenamiento, a modo de ejemplo, que es posible deshabilitar utilizando comentarios.

En la configuración del pool "File", indicar un nombre más significativo para las etiquetas, por ejemplo "Local-":

Pool {
  Name = File
  Pool Type = Backup
  Recycle = yes                       # Bacula can automatically recycle Volumes
  AutoPrune = yes                     # Prune expired volumes
  Volume Retention = 365 days         # one year
  Maximum Volume Bytes = 50G          # Limit Volume size to something reasonable
  Maximum Volumes = 100               # Limit number of Volumes in Pool
  Label Format = "Local-"

Configuración de los clientes

bacula-fd.conf

La configuración de los clientes (sistemas sobre los que se desea guardar copias de seguridad de sus datos) es la más simple. Dentro de su configuración se define información asociada al mismo (Client), información sobre los directores que tienen acceso al cliente (en un infraestructura pequeña será sólo uno), e información relacionada a mensajes.

El cliente debe contar con un directorio de trabajo donde guardar archivos con información acerca de su estado. En la configuración del mismo es necesario especificar una lista de direcciones IP y puertos en los cuales aceptar conexiones desde el director (FDAddresses). Por defecto, los clientes escuchan en el puerto 9102.

En la configuración del recurso Director se define el nombre y contraseña del director que tiene acceso al cliente. La contraseña debe coincidir con aquella especificada en la configuración del cliente, dentro de la configuración director.

La configuración de ejemplo incluida en la instalación es suficiente para realizar pruebas de backup sobre los archivos del propio servidor de backup.

Configuración de los Storage Deamons

bacula-sd.conf

La configuración de los Storage es mucho más simple que la del director. Los storages definen los distintos dispositivos de almacenamiento disponibles donde guardar las copias de seguridad (discos, cinteras, robots, etc.), por lo cual es altamente configurable.

En la especificación de cada Storage se definen propiedades globales como el directorio de trabajo del demonio (Working Director), direcciones IP y puertos donde atender peticiones, etc. Por defecto, los Storage Deamons escuchan peticiones en el puerto 9103.

La configuración del director es similar a la que utilizan los clientes. Básicamente se define qué director o directores pueden disponer del Storage.

La configuración de los dispositivos (Device) especifica cada detalle acerca de los mismos. Puede haber múltiples dispositivos para un mismo demonio de almacenamiento (Storage). Existen 3 tipos de dispositivos (Device Type): archivos (File); cintas (Tape); y colas (Fifo, dispositivos secuenciales de acceso first-in-first-out de sólo lectura o sólo escritura). Si no se especifica el tipo de un dispositivo, Bacula intenta determinarlo de forma automática. Existe un amplio conjunto de configuraciones específicas para cinteras y cinteras robotizadas (auto-cargadoras de cintas). Revisar cuidadosamente el manual al respecto. Además, el capítulo 19 del manual incluye configuraciones de ejemplo para diferentes autochangers.

Editar el archivo de configuración del Storage Deamon y realizar los siguientes cambios.

Configurar la dirección donde escucha peticiones el demonio, a través de la variable SDAddress:

Storage {                             # definition of myself
  Name = debian7-sd
  SDPort = 9103                  # Director's port
  WorkingDirectory = "/opt/bacula/working"
  Pid Directory = "/var/run"
  Maximum Concurrent Jobs = 20
  SDAddress = backup.linuxito.com

Comentar las configuraciones de ejemplo de los autochangers "FileChgr1" y "FileChgr2", junto con sus respectivos dispositivos (Device) y definir un nuevo dispositivo "FileStorage":

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

Configuración de los mensajes

El recurso Messages define cómo y a qué destino los mensajes son enviados. A pesar de que cada demonio tiene su propio gestor de mensajes, normalmente es deseable enviar todos los mensajes al director. Esto permite que todos los mensajes asociados a un trabajo sean combinados en un único mensaje (que luego será enviado por mail o registrado en el log). En general todos los mensajes asociados a un trabajo son agregados en el reporte del mismo.

La configuración de mensajes consiste de una especificación de destino o destinatario, seguida de una lista de tipos de mensajes. Para los destinatarios que requieren una dirección, esta se especifica luego del destinatario: destination = address = message-type1, message-type2, ....

Los destinos pueden ser de cualquier tipo: salida estándar (stdout), salida de errores (stderr), un operador (un mensaje por correo electrónico), la consola de Bacula, un director, un archivo de log o syslog, etc. Para el caso de los mensajes por correo electrónico, Bacula provee su propio cliente SMTP (bsmtp) para mejorar la portabilidad y simplificar la configuración entre sistemas heterogéneos.

Configuración de la consola de Bacula

bconsole.conf

La configuración de la consola es la más simple. Básicamente contiene la información necesaria para conectarse con el director.

Una consola puede gestionar distintos directores y existen diferentes tipos de consolas. La consola por defecto (anonymous) tiene privilegios de administrador. Luego existen otras consolas restringidas que sólo pueden ejecutar los comandos explícitamente permitidos en la configuración del director.

Pruebas de backup

Una vez finalizada la configuración, iniciar los servicios.

Iniciar el director:

root@debian7:/usr/local/bacula/etc# service bacula-dir start
Starting Bacula Director: bacula-dir

Iniciar el demonio de almacenamiento:

root@debian7:/usr/local/bacula/etc# service bacula-sd start
Starting Bacula Storage Daemon: bacula-sd

Iniciar el cliente (para hacer backups del propio servidor de backup):

root@debian7:/usr/local/bacula/etc# service bacula-fd start 
Starting Bacula File Daemon: bacula-fd

Verificar que todos los servicios hayan iniciado:

root@debian7:~# ps aux | grep bacula-
root     14708  0.0  0.6 134436  3360 ?        Ssl  11:45   0:00 /usr/local/bacula/sbin/bacula-fd -c /usr/local/bacula/etc/bacula-fd.conf
root     15569  0.0  0.5  52092  2640 ?        Ssl  12:28   0:00 /usr/local/bacula/sbin/bacula-sd -c /usr/local/bacula/etc/bacula-sd.conf
root     15714  0.0  0.6  69548  3236 ?        Ssl  12:41   0:00 /usr/local/bacula/sbin/bacula-dir -c /usr/local/bacula/etc/bacula-dir.conf
root     15726  0.0  0.1   7856   876 pts/0    R+   12:42   0:00 grep bacula-

Abrir la consola de Bacula:

root@debian7:~# /usr/local/bacula/sbin/bconsole 
Connecting to Director debian7:9101
1000 OK: 102 debian7-dir Version: 7.4.4 (28 September 2016)
Enter a period to cancel a command.
*

Para obtener ayuda, es posible ejecutar el comando help:

*help
  Command       Description
  =======       ===========
  add           Add media to a pool
  autodisplay   Autodisplay console messages
  automount     Automount after label
  cancel        Cancel a job
  create        Create DB Pool from resource
  delete        Delete volume, pool or job
  disable       Disable a job, attributes batch process
  enable        Enable a job, attributes batch process
  estimate      Performs FileSet estimate, listing gives full listing
  exit          Terminate Bconsole session
  gui           Non-interactive gui mode
  help          Print help on specific command
  label         Label a tape
  list          List objects from catalog
  llist         Full or long list like list command
  messages      Display pending messages
  memory        Print current memory usage
  mount         Mount storage
  prune         Prune expired records from catalog
  purge         Purge records from catalog
  quit          Terminate Bconsole session
  query         Query catalog
  restore       Restore files
  relabel       Relabel a tape
  release       Release storage
  reload        Reload conf file
  run           Run a job
  restart       Restart a job
  resume        Resume a job
  status        Report status
  stop          Stop a job
  setdebug      Sets debug level
  setbandwidth  Sets bandwidth
  snapshot      Handle snapshots
  setip         Sets new client address -- if authorized
  show          Show resource records
  sqlquery      Use SQL to query catalog
  time          Print current time
  trace         Turn on/off trace to file
  truncate      Truncate one or more Volumes
  unmount       Unmount storage
  umount        Umount - for old-time Unix guys, see unmount
  update        Update volume, pool or stats
  use           Use catalog xxx
  var           Does variable expansion
  version       Print Director version
  wait          Wait until no jobs are running

When at a prompt, entering a period cancels the command.

Para obtener ayuda sobre un comando en particular, especificarlo luego de list:

*help list
  Command       Description
  =======       ===========
  list          List objects from catalog

Arguments:
        jobs [client=<cli>] [jobid=<nn>] [ujobid=<name>] [job=<name>] [joberrors] [jobstatus=<s>] [limit=<n>]|
        jobtotals | pools | volume | media <pool=pool-name> | files jobid=<nn> | copies jobid=<nn> |
        joblog jobid=<nn> | pluginrestoreconf jobid=<nn> restoreobjectid=<nn> | snapshot

When at a prompt, entering a period cancels the command.

Para ejecutar un trabajo de forma manual, se puede recurrir al comando run:

*run
Using Catalog "MyCatalog"
A job name must be specified.
The defined Job resources are:
     1: BackupArchivosLocales
     2: BackupCatalog
     3: RestoreArchivosLocales

Este comando pregunta qué trabajo se desea ejecutar:

Select Job resource (1-3): 2
Run Backup job
JobName:  BackupCatalog
Level:    Full
Client:   debian7-fd
FileSet:  Catalog
Pool:     File (From Job resource)
Storage:  File1 (From Job resource)
When:     2016-10-27 12:01:35
Priority: 11
OK to run? (yes/mod/no): yes
Job queued. JobId=1

Inmediatamente es posible listar los trabajos en ejecución con el comando list jobs:

*list jobs
+-------+---------------+---------------------+------+-------+----------+----------+-----------+
| jobid | name          | starttime           | type | level | jobfiles | jobbytes | jobstatus |
+-------+---------------+---------------------+------+-------+----------+----------+-----------+
|     1 | BackupCatalog | 2016-10-27 12:01:46 | B    | F     |        1 |   59,011 | T         |
+-------+---------------+---------------------+------+-------+----------+----------+-----------+
You have messages.

Al ser un trabajo sencillo, termina inmediatamente, por lo que su estado es "T" (terminated).

Notar que se generan mensajes ("You have messages"). Es posible listarlos con el comando messages:

*messages
27-oct 12:01 debian7-dir JobId 1: shell command: run BeforeJob "/usr/local/bacula/etc/make_catalog_backup.pl MyCatalog bacula q1w2e3r4t5y6u7i8o9p0"
27-oct 12:01 debian7-dir JobId 1: Start Backup JobId 1, Job=BackupCatalog.2016-10-27_12.01.43_04
27-oct 12:01 debian7-dir JobId 1: Created new Volume="Local-0001", Pool="File", MediaType="File" in catalog.
27-oct 12:01 debian7-dir JobId 1: Using Device "FileStorage" to write.
27-oct 12:01 debian7-sd JobId 1: Labeled new Volume "Local-0001" on file device "FileStorage" (/usr/local/bacula/backup).
27-oct 12:01 debian7-sd JobId 1: Wrote label to prelabeled Volume "Local-0001" on file device "FileStorage" (/usr/local/bacula/backup)
27-oct 12:01 debian7-sd JobId 1: Elapsed time=00:00:01, Transfer rate=59.12 K Bytes/second
27-oct 12:01 debian7-sd JobId 1: Sending spooled attrs to the Director. Despooling 286 bytes ...
27-oct 12:01 debian7-dir JobId 1: Bacula debian7-dir 7.4.4 (28Sep16):
  Build OS:               x86_64-unknown-linux-gnu debian 7.11
  JobId:                  1
  Job:                    BackupCatalog.2016-10-27_12.01.43_04
  Backup Level:           Full
  Client:                 "debian7-fd" 7.4.4 (28Sep16) x86_64-unknown-linux-gnu,debian,7.11
  FileSet:                "Catalog" 2016-10-27 12:01:43
  Pool:                   "File" (From Job resource)
  Catalog:                "MyCatalog" (From Client resource)
  Storage:                "File1" (From Job resource)
  Scheduled time:         27-oct-2016 12:01:35
  Start time:             27-oct-2016 12:01:46
  End time:               27-oct-2016 12:01:46
  Elapsed time:           0 secs
  Priority:               11
  FD Files Written:       1
  SD Files Written:       1
  FD Bytes Written:       59,011 (59.01 KB)
  SD Bytes Written:       59,123 (59.12 KB)
  Rate:                   0.0 KB/s
  Software Compression:   None
  Snapshot/VSS:           no
  Encryption:             no
  Accurate:               no
  Volume name(s):         Local-0001
  Volume Session Id:      1
  Volume Session Time:    1477579555
  Last Volume Bytes:      59,798 (59.79 KB)
  Non-fatal FD errors:    0
  SD Errors:              0
  FD termination status:  OK
  SD termination status:  OK
  Termination:            Backup OK

27-oct 12:01 debian7-dir JobId 1: Begin pruning Jobs older than 6 months .
27-oct 12:01 debian7-dir JobId 1: No Jobs found to prune.
27-oct 12:01 debian7-dir JobId 1: Begin pruning Files.
27-oct 12:01 debian7-dir JobId 1: No Files found to prune.
27-oct 12:01 debian7-dir JobId 1: End auto prune.

27-oct 12:01 debian7-dir JobId 1: shell command: run AfterJob "/usr/local/bacula/etc/delete_catalog_backup"

Tener en cuenta que una vez leídos, ya no figuran como pendientes:

*messages
You have no messages.

Para salir de la consola, ejecutar quit.

Se puede comprobar que se ha creado un nuevo archivo dentro del directorio configurado en el Storage Deamon, con la etiqueta "Local-" (tal como se ha configurado en el pool):

root@debian7:~# ll /usr/local/bacula/backup/
total 68
drwxr-sr-x 2 root staff  4096 oct 27 12:01 .
drwxr-sr-x 8 root staff  4096 oct 27 10:37 ..
-rw-r----- 1 root staff 59798 oct 27 12:01 Local-0001

Es interesante notar que dicho archivo posee un formato propio de Bacula reconocido por la herramienta file:

root@debian7:~# file /usr/local/bacula/backup/Local-0001 
/usr/local/bacula/backup/Local-0001: Bacula volume, started Thu Oct 27 11:45:55 2016

Dicho archivo ha crecido hasta los 60 KB (espacio que ocupa el primer backup full de un catálogo vacío):

root@debian7:~# du -h /usr/local/bacula/backup/Local-0001
60K     /usr/local/bacula/backup/Local-0001

Ahora es posible lanzar la consola nuevamente para correr el trabajo que hace un backup completo del sistema de archivos (en realidad sólo del directorio /etc, según se ha configurado en el FileSet):

root@debian7:~# /usr/local/bacula/sbin/bconsole 
Connecting to Director debian7:9101
1000 OK: 102 debian7-dir Version: 7.4.4 (28 September 2016)
Enter a period to cancel a command.
*run
Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"
A job name must be specified.
The defined Job resources are:
     1: BackupArchivosLocales
     2: BackupCatalog
     3: RestoreArchivosLocales
Select Job resource (1-3): 1
Run Backup job
JobName:  BackupArchivosLocales
Level:    Incremental
Client:   debian7-fd
FileSet:  Full Set
Pool:     File (From Job resource)
Storage:  File1 (From Job resource)
When:     2016-10-27 12:14:07
Priority: 10
OK to run? (yes/mod/no): yes
Job queued. JobId=2
You have messages.
*list jobs
Using Catalog "MyCatalog"
+-------+-----------------------+---------------------+------+-------+----------+----------+-----------+
| jobid | name                  | starttime           | type | level | jobfiles | jobbytes | jobstatus |
+-------+-----------------------+---------------------+------+-------+----------+----------+-----------+
|     1 | BackupCatalog         | 2016-10-27 12:01:46 | B    | F     |        1 |   59,011 | T         |
|     2 | BackupArchivosLocales | 2016-10-27 12:14:15 | B    | F     |    1,781 |  885,979 | T         |
+-------+-----------------------+---------------------+------+-------+----------+----------+-----------+
*messages
27-oct 12:14 debian7-dir JobId 2: No prior Full backup Job record found.
27-oct 12:14 debian7-dir JobId 2: No prior or suitable Full backup found in catalog. Doing FULL backup.
27-oct 12:14 debian7-dir JobId 2: Start Backup JobId 2, Job=BackupArchivosLocales.2016-10-27_12.14.13_06
27-oct 12:14 debian7-dir JobId 2: Using Device "FileStorage" to write.
27-oct 12:14 debian7-sd JobId 2: Volume "Local-0001" previously written, moving to end of data.
27-oct 12:14 debian7-sd JobId 2: Ready to append to end of Volume "Local-0001" size=59,798
27-oct 12:14 debian7-sd JobId 2: Elapsed time=00:00:03, Transfer rate=367.3 K Bytes/second
27-oct 12:14 debian7-sd JobId 2: Sending spooled attrs to the Director. Despooling 451,415 bytes ...
27-oct 12:14 debian7-dir JobId 2: Bacula debian7-dir 7.4.4 (28Sep16):
  Build OS:               x86_64-unknown-linux-gnu debian 7.11
  JobId:                  2
  Job:                    BackupArchivosLocales.2016-10-27_12.14.13_06
  Backup Level:           Full (upgraded from Incremental)
  Client:                 "debian7-fd" 7.4.4 (28Sep16) x86_64-unknown-linux-gnu,debian,7.11
  FileSet:                "Full Set" 2016-10-27 12:14:13
  Pool:                   "File" (From Job resource)
  Catalog:                "MyCatalog" (From Client resource)
  Storage:                "File1" (From Job resource)
  Scheduled time:         27-oct-2016 12:14:07
  Start time:             27-oct-2016 12:14:15
  End time:               27-oct-2016 12:14:18
  Elapsed time:           3 secs
  Priority:               10
  FD Files Written:       1,781
  SD Files Written:       1,781
  FD Bytes Written:       885,979 (885.9 KB)
  SD Bytes Written:       1,102,174 (1.102 MB)
  Rate:                   295.3 KB/s
  Software Compression:   55.2% 2.2:1
  Snapshot/VSS:           no
  Encryption:             no
  Accurate:               no
  Volume name(s):         Local-0001
  Volume Session Id:      2
  Volume Session Time:    1477579555
  Last Volume Bytes:      1,201,150 (1.201 MB)
  Non-fatal FD errors:    0
  SD Errors:              0
  FD termination status:  OK
  SD termination status:  OK
  Termination:            Backup OK

27-oct 12:14 debian7-dir JobId 2: Begin pruning Jobs older than 6 months .
27-oct 12:14 debian7-dir JobId 2: No Jobs found to prune.
27-oct 12:14 debian7-dir JobId 2: Begin pruning Files.
27-oct 12:14 debian7-dir JobId 2: No Files found to prune.
27-oct 12:14 debian7-dir JobId 2: End auto prune.

*quit

Ahora el archivo Local-0001 ocupa 1,2 MB:

root@debian7:~# du -h /usr/local/bacula/backup/Local-0001 
1.2M    /usr/local/bacula/backup/Local-0001

Sin embargo el directorio /etc local ocupa 5.7 MB:

root@debian7:~# du -hs /etc/
5.7M    /etc/

Esto se debe a que se ha utilizado compresión GZIP en la configuración del FileSet.

Conclusiones

Como toda herramienta de backup, Bacula es una pieza de software grande y compleja, que tiene la gran responsabilidad de mantener la persistencia y simplificar la recuperación de nuestros datos en caso de fallos y catástrofes.

Siendo una tarea tan crítica y delicada (ya que se transmiten todos los datos de todas las aplicaciones en nuestra infraestructura) es altamente recomendable que el servidor de backup se comunique con los clientes (resto de los servidores de la organización) a través de una red privada. Tener en cuenta que tanto el director, cliente (File Deamon) como Storage Deamon se comunican a través de diferentes puertos (9101, 9102 y 9103 respectivamente) que serán necesario abrir en los respectivos firewalls:

root@debian7:~# netstat -tulpn | grep bacula
tcp        0      0 0.0.0.0:9101            0.0.0.0:*               LISTEN      15714/bacula-dir
tcp        0      0 0.0.0.0:9102            0.0.0.0:*               LISTEN      14708/bacula-fd 
tcp        0      0 10.100.200.123:9103     0.0.0.0:*               LISTEN      15569/bacula-sd

En el próximo artículo explicaré cómo instalar el cliente Bacula en un servidor FreeBSD para hacer copias de seguridad de su sistema de archivos, y cómo programar diversos trabajos de backup.

Referencias

Bacula Main Reference

How To Install Bacula Server on Ubuntu 14.04 - DigitalOcean


Tal vez pueda interesarte


Compartí este artículo