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 (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
How To Install Bacula Server on Ubuntu 14.04 - DigitalOcean