Sie sind auf Seite 1von 22

Qu es bacula

Bacula es un programa para hacer copias de seguridad de una mquina... pues no del todo: bacula es una coleccin de demonios que cooperan entre s para realizar copias de respaldo de los archivos necesarios, sean de la mquina que sea. Para interactuar con bacula se necesita un elemento ms: la consola de bacula. Todos estos elementos son independientes entre s y pueden estar en mquinas distintas, as pues el principal problema a la hora de configurar bacula consiste en hacer que todos estos elementos se comuniquen correctamente entre ellos.

Los elementos necesarios para que bacula funcione son:

y y y

bacula-dir (o bacula-director) bacula-sd (o bacula-storage daemon) bacula-fd (o bacula-file daemon)

Si, como es de suponer, queremos poder interactuar con el servicio de backup, necesitaremos:

bacula-console (disponible en varios sabores:gnome y wx)

bacula-director
Es el demonio que maneja al resto. El servidor de la base de datos MySQL debe estar accesible desde la mquina que ejecuta el director (o estar en ella misma y escuchar en localhost... como viene siendo habitual en Debian). Debe poder acceder tanto al bacula-sd como al bacula-fd para poder leer los archivos a guardar y para poder guardarlos en el soporte fsico final.

En el archivo de configuracin del director configuraremos dnde y cmo acceder al resto de demonios, la c ontrasea para el acceso mediante bacula-console y los trabajos o jobs.

bacula-storage daemon
Este demonio es el encargado de manejar el dispositivo de almacenamiento de los backups; esto exige que este demonio est instalado en la mquina que contenga fsicamente el dispositivo de almacenamiento, que puede ser: archivos en el disco local, grabadoras de CD o DVD y unidades de cinta.

Su archivo de configuracin define el (o los) dispositivos de almacenamiento que maneja as como que directores pueden utilizarlo.

bacula-file daemon
Mediante este demonio bacula obtiene los ficheros que necesita respaldar, as pues ste es el componente que hay que instalar en las mquinas que necesiten respaldo.

El archivo de configuracin es el ms simple de todos, smplemente especifica qu directores pueden realizarle peticiones.

bacula-console
Una vez instalado y configurado bacula comenzar a realizar copias de seguridad el solito sin intervencin nuestra, pero puede suceder que queramos forzar una copia cuando nosotros lo deseemos, o que tengamos que recuperar unos ficheros (protgenos Santa Tecla) o smplemente saber qu tal est nuestro bacula. Para ello necesitamos este componente, similar a una shell pero con pocos comandos (resulta hasta intuitivo... en serio...). Exis ten varios tipos de consolas: en modo texto, para gnome, con widgets wx, etc. Supongo que tambin existirn clientes grficos que no tengan nada que ver con una consola y que harn lo mismo... yo por ahora no he buscado ninguno...

Qu necesitamos
Bueno, bacula necesitar de una base de datos SQL para apuntar sus cosillas, as pues es necesario tener instalado y configuradoMySQL. No es obligatorio pero si muy recomendable que todas las mquinas que intervengan en el proceso sean accesibles por un nombre de dominio (o tengan IP esttica).

Si tenemos nuestra base de datos lista ya podemos instalar en la mquina que realizar los backups los siguientes paquetes:

# apt-get install bacula-director-mysql


Bueno, hay que decir que exiten ms versiones del director: pqsql (para postgress SQL, sqlite y sqlite3 (imaginad...). En la instalacin del director os pedirn los datos necesarios para configurar la base de datos que necesitar bacula. Es muy sencillo y si os equivocis simplemente haced:

# dpkg-reconfigure bacula-director-mysql
Y arreglis el fallo... zoquetes! Ahora, en la mquina que tenga nuestra unidad de almacenamiento (una cinta, por ejemplo) y que puede ser la misma o no que la anterior, instalamos lo siguiente:

# apt-get install bacula-sd bacula-sd-tools


Al igual que el director, este componente tambin tiene ms alternativas: mysql, pgsql, sqlite y sqlite3. Usaremos el simple porque nuestro director ya se encargar de crear catlogos y todo eso, no es necesario que nos los cree tambin el storage daemon.

Finalmente, instalaremos lo siguiente en la mquina que queramos respaldar:

# apt-get install bacula-fd


Ahora slo nos faltar configurar todo esto para que se comuniquen entre s... vamos a ello!

Atencin: Debian unstable instala la versin 1.38.11-7 (a fecha de 6 de feb, 2007) y el paquete no consigue configurar correctamente su base de datos. Pasa lo mismo con los paquetes 2.0.1 de la pgina de bcula. Consulta los apndices de la receta para ms informacin.

Configurando bacula-fd
Por ser ms simple ser el primero que configuremos, echemos un vistazo a su archivo de configuracin (/etc/bacula/bacula -fd.conf):

Director { Name = director_admitido1 Password = "password_chorrotronica_para_el_director_admitido1" } Director { Name = backup-mon Password = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" Monitor = yes } FileDaemon { Name = nombre_del_file-daemon FDport = 9102 WorkingDirectory = /var/lib/bacula Pid Directory = /var/run/bacula Maximum Concurrent Jobs = 20 FDAddress = maquina.dominio # O si tiene IP estatica pues X.X.X.X } # Esto es nuevo en bacula 2.0.0 Messages { Name = Standard director = director_admitido1 = all, !skipped, !restored }

Vemos que los archivos de configuracin tienen una estructura que se repite:

nombre_resource { opcion = valor ... }

Es lo que en bacula llaman resources. Un resource define un elemento de bacula, hay muchos tipos de resources diferentes, cada uno con sus propias opciones. El manual describe detalladamente todos ellos...

En este archivo hemos definido tres tipos de resources distintos:

Director: Identifica qu director puede conectarse con este file daemon; como veis se definen dos: director_admitido1 y backup-mon. El segundo es un director especial que acta de monitor... se configura automticamente. El primero es el que hemos aadido/modificado nosotros. El nombre que especificamos es el nombre que hemos dado a nuestro director (lo veremos ms adelante) y la pas sword es la que se espera que d cuando se autentifique.

FileDaemon: Define los parmetros del propio file daemon, parmetros como el puerto de escucha o la IP a la que debe asociarse (recordad que si esa IP es 127.0.0.1 el demonio slo aceptar conexiones de la propia mquina local). Como vis tambin especifica el nombre que se da a nuestro file daemon, es importante que coincida con el nombre que luego introduciremos en el director.

Messages: Indica qu mensajes podemos enviar a cada director.

Una vez modificado el archivo reiniciaremos el demonio y lo tendremos listo para funcionar con bacula, ahora vayamos con el siguiente.

Configuracin de bacula-sd
Abramos su archivo de configuracin ( /etc/bacula/bacula -sd.conf) y veamos sus resources (este es una modificacin del "original", para utilizar como almacenamiento un carrusel automtico de cintas con seis slots):

Storage { Name = nombre_del_storage-daemon SDPort = 9103 WorkingDirectory = "/var/lib/bacula" Pid Directory = "/var/run/bacula" Maximum Concurrent Jobs = 20 SDAddress = maquina.dominio }

Director { Name = director_admitido1 Password = "password_chorrotronica_para_el_director_admitido1" } Director { Name = backup-mon Password = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" Monitor = yes }

Device { Name = FileStorage

Media Type = File Archive Device = /tmp LabelMedia = yes; Random Access = Yes; AutomaticMount = yes; RemovableMedia = no; AlwaysOpen = no; } # when device opened, read it # lets Bacula label unlabeled media

Autochanger { Name = Autochanger Device = Tape1, Tape2, Tape3, Tape4, Tape5, Tape6 Changer Command = "/etc/bacula/scripts/mtx-changer %c %o %S %a %d" Changer Device = /dev/sg2 }

Device { Name = Tape1 Drive Index = 0 Autochanger = yes Media Type = DDS-4 Archive Device = /dev/nst0 AutomaticMount = yes RemovableMedia = yes RandomAccess = no AutoChanger = yes LabelMedia = yes } ... Device { Name = Tape6 Drive Index = 0 Autochanger = yes Media Type = DDS-4 Archive Device = /dev/nst0

AutomaticMount = yes RemovableMedia = yes RandomAccess = no AutoChanger = yes LabelMedia = yes }

Messages { Name = Standard director = director_admitido1 = all }

y y y

Storage: Como antes, se define as mismo y qu parmetros usar. Director: Igual que en el file daemon. Device: Especifica un dispositivo de almacenamiento manejado por el storage daemon. El nombre que se le da aqu y el tipo de medio es el que luego necesitaremos usar en el director. Es importante aclarar que si tenemos un dispositivo de cintas con una sola unidad no ser necesario definir tantos "devices" como cintas tengas, ya que todas sern cargadas por el autochanger

Autochanger: Es un Device especial que define un cargador automtico de cintas. Se debe indicar el comando a emplear para usar el cargador.

Existen muchsimos parmetros para los resources de tipo device pero no es objetivo de la receta crear un manual de bcula en castellano... as que... al manual...

Configurando bacula-director
Este es el archivo ms complicado... pero que slo veremos "a medias", la "otra mitad" se queda para una prxima receta. Veamos la parte que nos interesa ahora, tenemos esto en el fichero

/etc/bacula/bacula-dir.conf:

Director { Name = director_admitido1 DIRport = 9101 QueryFile = "/etc/bacula/scripts/query.sql" WorkingDirectory = "/var/lib/bacula" PidDirectory = "/var/run/bacula" Maximum Concurrent Jobs = 1 Password = "password_chorrotronica_para_las_consolas" # Console password Messages = Daemon DirAddress = 127.0.0.1 # Esto slo vale para las consolas } [... cosas interesantsimas que ahora no vienen a cuento ...] Client { Name = nombre_del_file-daemon Address = maquina.dominio FDPort = 9102 Catalog = MyCatalog Password = "password_chorrotronica_para_el_director_admitido1" # pwd for FD File Retention = 30 days # 30 days Job Retention = 6 months # six months AutoPrune = yes # Prune expired Jobs/Files } Storage { Name = File Address = maquina.dominio

SDPort = 9103 Password = "password_chorrotronica_para_el_director_admitido1" Device = FileStorage Media Type = File } Storage { Name = nombre_del_almacenamiento Address = maquina.dominio SDPort = 9103 Password = "password_chorrotronica_para_el_director_admitido1" Device = Autochanger Media Type = DDS-4 Autochanger = yes } Catalog { Name = MyCatalog dbname = bacula; DB Address = "" ; user = bacula; password = "XXXXX" } [...cosas tremendamente interesantes que ahora tampoco explicaremos...]

Director
Igual que en los casos anteriores se define a s mismo, los cam os habituales son:

DIRport: Puerto de escucha para las consolas. QueryFile: Archivo con las consultas a la bbdd. WorkingDirectory: Directorio de trabajo (no cambiar). PidDirectory: Directorio donde crear los archivos con pid.

este valor a 1 implica que el director s lo har un trabajo cada vez, que es el valor por defecto.

tambin se almacena en el archivo de configuracin del programa de consola.

y y

Messages: Donde se enviarn los mensajes no asociados a un trabajo concreto. DirAddress: Direccin donde escuchar el director. Indicar 127.0.0.1 implicar que no podrn abrirse consolas bacula en mquinas remotas, pero no causa problemas si tenemos los dems demonios en otras mquinas puesto que es el director el que abre las conexiones con los otros demonios.

Client
Aqu especificaremos los datos del bacula file daemon con el que necesitamos conectar para leer los ficheros necesarios. Para ello especificaremos lo siguiente:

para nombralo dentro de bacula. Mi recomendacin es que coincida, ms que nada para entendernos mejor.

y y y y y y y

Address: IP o hostname de la mquina que tiene nuestro file daemon. FDPort: Puerto donde escucha el file daemon. Catalog: Qu catlogo usa nuestro file daemon. Un catlogo es algo as como un listado de los ficheros que se estn respaldando. Pass ord: Contrasea que enviar el director al file daemon para autentificarse. File Retention: ste parmetro indica cuanto tiempo deben permanecer los archivos en el catlogo. Pasado este tiempo se eliminan del catlogo (pero esto no influye en que se haga o no backups de estos ficheros). Job Retention: Indica cuanto tiempo como mximo estar un trabajo esperando. AutoPrune: Si est a yes, una vez pasados los periodos File Retention y/o Job Retention se eliminan del catlogo y/o cola los ficheros/trabajos.

Storage
Ahora especificaremos los dispositivos que podr emplear bacula para hacer las copias de respaldo, pueden existir varios (que se diferenciarn por el nombre). Debemos indicar los siguientes camp os:

Name: Nombre del file daemon.

ste nombre no tiene porqu coincidir con el que dimos a nuestro file daemon, es

Pass ord: Contrasea que se pedir al programa de consola.

sta contrasea no se pide por teclado sino que

&

tenamos un valor mayor a 1, esto permitir que varios directores utilicen esos demonios a la vez.

&

Maximum Concurrent Jobs: Nmero m x imo de trabajos concurrentes que acepta.

y y y y y y

Name: Nombre que damos al director.

s el mismo nombre que hemos permitido en los otros demonios.

"

'

C m

m sc c

m s res

rce a res

rce m s des ac

  
n los casos anteriores stablecer aqu





 

y y y y y

Name: Nombre del medio de backup. No es el nombre del storage daemon sino del medio, por ejemplo: Carrusel_cintas o Fichero_local, etc. Address: Mquina donde est el storage daemon que maneja el medio de almacenamiento. SDPort: Puerto de escucha. Pass ord: Contrasea que enviar el director para autentificarse contra el storage daemon. Device: Nombre del medio configurado en el st rage daemon que debemos usar. Como dijimos, el storage daemon configura uno o varios dispositivos de almacenamiento, nombrndolos de alguna manera. Pues ese nombre es el que usamos aqu.

Media Type: Cuando se configura el medio se especifica que tipo de medio es, aqu tambin tenemos que indicarlo (y debe coincidir). Bacula lo usa para "hacer sus cuentas".

y Autochanger: Parmetro opcional, indica si es o no un autocargador. Catalog y Name: Nombre del catlogo (que usamos en el resource del file daemon). y dbname: Nombre de la base de datos. y DB Address: Mquina donde tenemos nuestro servidor MySQL. y user: Usuario con privilegios en la base de datos especificada anteriormente suficientes como para crear y
modificar datos.

Bien, con todo esto ya tenemos un sistema bacula distribuido funcionando a las mil maravillas... para comprobarlo podemos hacer lo siguiente:

# apt-get install bacula-console

Y lo configuramos para conectarse a nuestro director modificando

Director { Name = nombre_director-dir DIRport = 9101 address = maquina_director.dominio Password = "passwordchorrotronicaparalasconsolas" }

Si todo ha ido bien podremos ejecutar bconsole como root o como un usuario que pertenezca al grupo bacula y teclear lo siguiente:

*status

l asterisco es el prompt de la consola de bacula, ejecutamos status y le decimos que all cuando nos pregunte de qu

queremos el estado. Si algn componente no puede contactarse, se notificar con el error correspondiente. Si no obtenemos ninguno de esos errores tenemos el bcula funcionando. Ahora slo nos queda indicarle qu archivos hay que respaldar y cuando.

x iste un problema que no puede detectarse as y que es muy peligroso: puede suceder que el director pueda

comunicarse con el storage daemon y con el file daemon, por tanto dir que todo esta funcionando; sin embargo, el storage daemon y el file daemon no puedan conectarse entre s; esto provocar que los backups darn siempre error y daemon directamente y ellos dos realizan las transferencias de datos. Debis tener esto en cuenta cuando pongis vuestro bacula a funcionar. no se realizarn. sto sucede porque cuando el director va a hacer una copia, conecta al file daemon con el storage

Apndice A: Preparar la base de datos bacula en MySQL

pass ord: Pass ord de dicho usuario en esa base de datos.

/etc/bacula/bconsole.conf :

6 7

Bueno, como dijimos antes, la instalacin de bacula por paquetes no crea la base de datos que utiliza para realizar los backups, as que nosotros haremos ese trabajo "a mano". Vamos a asumir que tenemos correctamente instalado y funcionando MySQL Server y phpmyadmin (tal y como se quedan despus de una instalacin con apt-get).

La base de datos que debemos crear es la que se especific en el resource Catalog que vimos anteriormente, por ejemplo una base de datos llamada bacula (que es la usada por defecto). La creamos con phpmyadmin, tambin podemos crear el usuario (que por defecto tambin debe ser uno llamado bacula) con la contrasea que hayamos especificado. Lo nico que debemos hacer ahora es crear unas tablillas y listo, la siguiente porcin de cdigo SQL (que se puede pegar directamente en phpmyadmin y listo) lo debera resolver (por cierto que est sacado de un script que viene en los paquetes de bacula pero que a mi no me funcionaba):

USE bacula;

CREATE TABLE Filename ( FilenameId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Name BLOB NOT NULL, PRIMARY KEY(FilenameId), INDEX (Name(255)) );

CREATE TABLE Path ( PathId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Path BLOB NOT NULL, PRIMARY KEY(PathId), INDEX (Path(255)) );

CREATE TABLE File ( FileId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, FileIndex INTEGER UNSIGNED DEFAULT 0, JobId INTEGER UNSIGNED NOT NULL REFERENCES Job, PathId INTEGER UNSIGNED NOT NULL REFERENCES Path, FilenameId INTEGER UNSIGNED NOT NULL REFERENCES Filename, MarkId INTEGER UNSIGNED DEFAULT 0, LStat TINYBLOB NOT NULL, MD5 TINYBLOB, PRIMARY KEY(FileId), INDEX (JobId), INDEX (PathId), INDEX (FileNameId, PathId),

INDEX (JobId, PathId, FilenameId) );

CREATE TABLE MediaType ( MediaTypeId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, MediaType TINYBLOB NOT NULL, ReadOnly TINYINT DEFAULT 0, PRIMARY KEY(MediaTypeId) );

CREATE TABLE Storage ( StorageId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Name TINYBLOB NOT NULL, AutoChanger TINYINT DEFAULT 0, PRIMARY KEY(StorageId) );

CREATE TABLE Device ( DeviceId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Name TINYBLOB NOT NULL, MediaTypeId INTEGER UNSIGNED DEFAULT 0 REFERENCES MediaType, StorageId INTEGER UNSIGNED DEFAULT 0 REFERENCES Storage, DevMounts INTEGER UNSIGNED DEFAULT 0, DevReadBytes BIGINT UNSIGNED DEFAULT 0, DevWriteBytes BIGINT UNSIGNED DEFAULT 0, DevReadBytesSinceCleaning BIGINT UNSIGNED DEFAULT 0, DevWriteBytesSinceCleaning BIGINT UNSIGNED DEFAULT 0, DevReadTime BIGINT UNSIGNED DEFAULT 0, DevWriteTime BIGINT UNSIGNED DEFAULT 0, DevReadTimeSinceCleaning BIGINT UNSIGNED DEFAULT 0, DevWriteTimeSinceCleaning BIGINT UNSIGNED DEFAULT 0, CleaningDate DATETIME DEFAULT 0, CleaningPeriod BIGINT UNSIGNED DEFAULT 0, PRIMARY KEY(DeviceId) );

CREATE TABLE Job ( JobId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Job TINYBLOB NOT NULL, Name TINYBLOB NOT NULL, Type BINARY(1) NOT NULL, Level BINARY(1) NOT NULL, ClientId INTEGER DEFAULT 0 REFERENCES Client, JobStatus BINARY(1) NOT NULL, SchedTime DATETIME DEFAULT 0, StartTime DATETIME DEFAULT 0, EndTime DATETIME DEFAULT 0, RealEndTime DATETIME DEFAULT 0, JobTDate BIGINT UNSIGNED DEFAULT 0, VolSessionId INTEGER UNSIGNED DEFAULT 0, VolSessionTime INTEGER UNSIGNED DEFAULT 0, JobFiles INTEGER UNSIGNED DEFAULT 0, JobBytes BIGINT UNSIGNED DEFAULT 0, JobErrors INTEGER UNSIGNED DEFAULT 0, JobMissingFiles INTEGER UNSIGNED DEFAULT 0, PoolId INTEGER UNSIGNED DEFAULT 0 REFERENCES Pool, FileSetId INTEGER UNSIGNED DEFAULT 0 REFERENCES FileSet, PriorJobId INTEGER UNSIGNED DEFAULT 0 REFERENCES Job, PurgedFiles TINYINT DEFAULT 0, HasBase TINYINT DEFAULT 0, PRIMARY KEY(JobId), INDEX (Name(128)) );

CREATE TABLE Location ( LocationId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Location TINYBLOB NOT NULL, Cost INTEGER DEFAULT 0, Enabled TINYINT, PRIMARY KEY(LocationId)

);

CREATE TABLE LocationLog ( LocLogId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Date DATETIME DEFAULT 0, Comment BLOB NOT NULL, MediaId INTEGER UNSIGNED DEFAULT 0 REFERENCES Media, LocationId INTEGER UNSIGNED DEFAULT 0 REFERENCES Location, NewVolStatus ENUM('Full', 'Archive', 'Append', 'Recycle', 'Purged', 'Read-Only', 'Disabled', 'Error', 'Busy', 'Used', 'Cleaning') NOT NULL, NewEnabled TINYINT, PRIMARY KEY(LocLogId) );

CREATE TABLE FileSet ( FileSetId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, FileSet TINYBLOB NOT NULL, MD5 TINYBLOB, CreateTime DATETIME DEFAULT 0, PRIMARY KEY(FileSetId) );

CREATE TABLE JobMedia ( JobMediaId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, JobId INTEGER UNSIGNED NOT NULL REFERENCES Job, MediaId INTEGER UNSIGNED NOT NULL REFERENCES Media, FirstIndex INTEGER UNSIGNED DEFAULT 0, LastIndex INTEGER UNSIGNED DEFAULT 0, StartFile INTEGER UNSIGNED DEFAULT 0, EndFile INTEGER UNSIGNED DEFAULT 0, StartBlock INTEGER UNSIGNED DEFAULT 0, EndBlock INTEGER UNSIGNED DEFAULT 0, VolIndex INTEGER UNSIGNED DEFAULT 0, Copy INTEGER UNSIGNED DEFAULT 0, Stripe INTEGER UNSIGNED DEFAULT 0,

PRIMARY KEY(JobMediaId), INDEX (JobId, MediaId) );

CREATE TABLE Media ( MediaId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, VolumeName TINYBLOB NOT NULL, Slot INTEGER DEFAULT 0, PoolId INTEGER UNSIGNED DEFAULT 0 REFERENCES Pool, MediaType TINYBLOB NOT NULL, MediaTypeId INTEGER UNSIGNED DEFAULT 0 REFERENCES MediaType, LabelType TINYINT DEFAULT 0, FirstWritten DATETIME DEFAULT 0, LastWritten DATETIME DEFAULT 0, LabelDate DATETIME DEFAULT 0, VolJobs INTEGER UNSIGNED DEFAULT 0, VolFiles INTEGER UNSIGNED DEFAULT 0, VolBlocks INTEGER UNSIGNED DEFAULT 0, VolMounts INTEGER UNSIGNED DEFAULT 0, VolBytes BIGINT UNSIGNED DEFAULT 0, VolParts INTEGER UNSIGNED DEFAULT 0, VolErrors INTEGER UNSIGNED DEFAULT 0, VolWrites INTEGER UNSIGNED DEFAULT 0, VolCapacityBytes BIGINT UNSIGNED DEFAULT 0, VolStatus ENUM('Full', 'Archive', 'Append', 'Recycle', 'Purged', 'Read-Only', 'Disabled', 'Error', 'Busy', 'Used', 'Cleaning') NOT NULL, Enabled TINYINT DEFAULT 1, Recycle TINYINT DEFAULT 0, VolRetention BIGINT UNSIGNED DEFAULT 0, VolUseDuration BIGINT UNSIGNED DEFAULT 0, MaxVolJobs INTEGER UNSIGNED DEFAULT 0, MaxVolFiles INTEGER UNSIGNED DEFAULT 0, MaxVolBytes BIGINT UNSIGNED DEFAULT 0, InChanger TINYINT DEFAULT 0, StorageId INTEGER UNSIGNED DEFAULT 0 REFERENCES Storage,

DeviceId INTEGER UNSIGNED DEFAULT 0 REFERENCES Device, MediaAddressing TINYINT DEFAULT 0, VolReadTime BIGINT UNSIGNED DEFAULT 0, VolWriteTime BIGINT UNSIGNED DEFAULT 0, EndFile INTEGER UNSIGNED DEFAULT 0, EndBlock INTEGER UNSIGNED DEFAULT 0, LocationId INTEGER UNSIGNED DEFAULT 0 REFERENCES Location, RecycleCount INTEGER UNSIGNED DEFAULT 0, InitialWrite DATETIME DEFAULT 0, ScratchPoolId INTEGER UNSIGNED DEFAULT 0 REFERENCES Pool, RecyclePoolId INTEGER UNSIGNED DEFAULT 0 REFERENCES Pool, Comment BLOB, PRIMARY KEY(MediaId), INDEX (PoolId) );

CREATE INDEX inx8 ON Media (PoolId);

CREATE TABLE Pool ( PoolId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Name TINYBLOB NOT NULL, NumVols INTEGER UNSIGNED DEFAULT 0, MaxVols INTEGER UNSIGNED DEFAULT 0, UseOnce TINYINT DEFAULT 0, UseCatalog TINYINT DEFAULT 0, AcceptAnyVolume TINYINT DEFAULT 0, VolRetention BIGINT UNSIGNED DEFAULT 0, VolUseDuration BIGINT UNSIGNED DEFAULT 0, MaxVolJobs INTEGER UNSIGNED DEFAULT 0, MaxVolFiles INTEGER UNSIGNED DEFAULT 0, MaxVolBytes BIGINT UNSIGNED DEFAULT 0, AutoPrune TINYINT DEFAULT 0, Recycle TINYINT DEFAULT 0, PoolType ENUM('Backup', 'Copy', 'Cloned', 'Archive', 'Migration', 'Scratch') NOT NULL, LabelType TINYINT DEFAULT 0,

LabelFormat TINYBLOB, Enabled TINYINT DEFAULT 1, ScratchPoolId INTEGER UNSIGNED DEFAULT 0 REFERENCES Pool, RecyclePoolId INTEGER UNSIGNED DEFAULT 0 REFERENCES Pool, NextPoolId INTEGER UNSIGNED DEFAULT 0 REFERENCES Pool, MigrationHighBytes BIGINT UNSIGNED DEFAULT 0, MigrationLowBytes BIGINT UNSIGNED DEFAULT 0, MigrationTime BIGINT UNSIGNED DEFAULT 0, UNIQUE (Name(128)), PRIMARY KEY (PoolId) );

CREATE TABLE Client ( ClientId INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, Name TINYBLOB NOT NULL, Uname TINYBLOB NOT NULL, AutoPrune TINYINT DEFAULT 0, FileRetention BIGINT UNSIGNED DEFAULT 0, JobRetention BIGINT UNSIGNED DEFAULT 0, /* full uname -a of client */

UNIQUE (Name(128)), PRIMARY KEY(ClientId) );

CREATE TABLE Log ( LogId INTEGER UNSIGNED AUTO_INCREMENT, JobId INTEGER UNSIGNED DEFAULT 0 REFERENCES Job, Time DATETIME DEFAULT 0, LogText BLOB NOT NULL, PRIMARY KEY(LogId), INDEX (JobId) );

CREATE TABLE BaseFiles ( BaseId INTEGER UNSIGNED AUTO_INCREMENT, BaseJobId INTEGER UNSIGNED NOT NULL REFERENCES Job,

JobId INTEGER UNSIGNED NOT NULL REFERENCES Job, FileId INTEGER UNSIGNED NOT NULL REFERENCES File, FileIndex INTEGER UNSIGNED, PRIMARY KEY(BaseId) );

CREATE TABLE UnsavedFiles ( UnsavedId INTEGER UNSIGNED AUTO_INCREMENT, JobId INTEGER UNSIGNED NOT NULL REFERENCES Job, PathId INTEGER UNSIGNED NOT NULL REFERENCES Path, FilenameId INTEGER UNSIGNED NOT NULL REFERENCES Filename, PRIMARY KEY (UnsavedId) );

CREATE TABLE Counters ( Counter TINYBLOB NOT NULL, MinValue INTEGER DEFAULT 0, MaxValue INTEGER DEFAULT 0, CurrentValue INTEGER DEFAULT 0, WrapCounter TINYBLOB NOT NULL, PRIMARY KEY (Counter(128)) );

CREATE TABLE CDImages ( MediaId INTEGER UNSIGNED NOT NULL, LastBurn DATETIME NOT NULL, PRIMARY KEY (MediaId) );

CREATE TABLE Status ( JobStatus CHAR(1) BINARY NOT NULL, JobStatusLong BLOB, PRIMARY KEY (JobStatus) );

INSERT INTO Status (JobStatus,JobStatusLong) VALUES ('C', 'Created, not yet running'), ('R', 'Running'), ('B', 'Blocked'), ('T', 'Completed successfully'), ('E', 'Terminated with errors'), ('e', 'Non-fatal error'), ('f', 'Fatal error'), ('D', 'Verify found differences'), ('A', 'Canceled by user'), ('F', 'Waiting for Client'), ('S', 'Waiting for Storage daemon'), ('m', 'Waiting for new media'), ('M', 'Waiting for media mount'), ('s', 'Waiting for storage resource'), ('j', 'Waiting for job resource'), ('c', 'Waiting for client resource'), ('d', 'Waiting on maximum jobs'), ('t', 'Waiting on start time'), ('p', 'Waiting on higher priority jobs');

CREATE TABLE Version ( VersionId INTEGER UNSIGNED NOT NULL );

INSERT INTO Version (VersionId) VALUES (10);

Ejecutis eso (como administradores de MySQL si queris), dis permisos al usuario bcula en todas esas tablas creadas y ya tenis la base de datos lista para su uso por parte del director.

Apndice B: Archivos de configuracin de ejemplo


Por ltimo, pondr unos archivos que uso yo y estn funcionando, para que veis unos ya configurados y tal. Las contraseas debis cambiarlas (es un consejo). El escenario es el siguiente: tenemos un equipo con cargador de cintas (de tres slots) que hace b ackup de un segundo equipo. Para no instalar muchas cosas en el segundo equipo (no interferir en su funcionanmiento) lo nico que instalaremos en ese equipo es el file daemon. El equipo con el cargador va a tener por tanto el director y el storage daemon. La mquina con el director se llamar respaldadora (192.168.0.2) y de la que queremos hacer backup se llamar importante (192.168.0.1). Primero instalamos bacula-fd en importante y lo configuramos con este fichero ( /etc/bacula/bacula -

fd.conf):

Director { Name = backup-mon Password = "password_para_backup-mon" Monitor = yes }

FileDaemon { Name = importante-fd # Podria ser cualquier otro nombre FDport = 9102 WorkingDirectory = /var/lib/bacula Pid Directory = /var/run/bacula Maximum Concurrent Jobs = 20 FDAddress = 192.168.0.1 }

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

Reinciamos el demonio y ya podemos olvidarnos de esta mquina

Ahora vamos con respaldadora, primero instalamos el storage daemon y lo configuramos con el siguiente arhivo (/etc/bacula/bacula -sd.conf):

Storage { Name = respaldadora-sd SDPort = 9103 WorkingDirectory = "/var/lib/bacula" Pid Directory = "/var/run/bacula" Maximum Concurrent Jobs = 20 SDAddress = 192.168.0.2 }

Director { Name = respaldadora-dir Password = "password_para_respaldadora-dir"

Director { Name = respaldadora-mon Password = "password_para_respaldadora-mon" Monitor = yes }

Device { Name = FileStorage Media Type = File Archive Device = /tmp LabelMedia = yes; Random Access = Yes; AutomaticMount = yes; RemovableMedia = no; AlwaysOpen = no; }

Autochanger { Name = Autochanger Device = Tape1, Tape2, Tape3 Changer Command = "/etc/bacula/scripts/mtx-changer %c %o %S %a %d" Changer Device = /dev/sg2 }

Device { Name = Tape1 Drive Index = 0 Autochanger = yes Media Type = DDS-4 Archive Device = /dev/nst0 AutomaticMount = yes RemovableMedia = yes RandomAccess = no

AutoChanger = yes LabelMedia = yes } Device { Name = Tape2 Drive Index = 0 Autochanger = yes Media Type = DDS-4 Archive Device = /dev/nst0 AutomaticMount = yes RemovableMedia = yes RandomAccess = no AutoChanger = yes LabelMedia = yes }

Device { Name = Tape3 Drive Index = 0 Autochanger = yes Media Type = DDS-4 Archive Device = /dev/nst0 AutomaticMount = yes RemovableMedia = yes RandomAccess = no AutoChanger = yes LabelMedia = yes }

Messages { Name = Standard director = respaldadora-dir = all }

Y finalmente instalamos el bacula director y lo configuramos, muy importante: este archivo no est completo, falta la definicion de trabajos que se explicar en una prxima receta. l archivo es el siguiente (/etc/bacula /bacula-dir.conf ):

Director { Name = respaldadora-dir DIRport = 9101 QueryFile = "/etc/bacula/scripts/query.sql" WorkingDirectory = "/var/lib/bacula" PidDirectory = "/var/run/bacula" Maximum Concurrent Jobs = 1 Password = "password_para_respaldadora-dir" Messages = Daemon DirAddress = 127.0.0.1 # Esto obliga a que las consolas bacula solo se puedan ejecutar desde localhost }

Client { Name = importante-fd Address = 192.168.0.1 FDPort = 9102 Catalog = MyCatalog Password = "password_para_respaldadora-dir" File Retention = 30 days Job Retention = 6 months AutoPrune = yes }

Storage { Name = File Address = 192.168.0.2 SDPort = 9103 Password = "password_para_respaldadora-dir" Device = FileStorage Media Type = File }

Storage { Name = respaldadora-sd

Address = 192.168.0.2 SDPort = 9103 Password = "password_para_respaldadora-dir" Device = Autochanger Media Type = DDS-4 Autochanger = yes }

Catalog { Name = MyCatalog dbname = bacula; DB Address = "" ; user = bacula; password = "password_de_bbdd" }

Messages { Name = Standard mailcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) %r\" -s \"Bacula: %t %e of %c %l\" %r" operatorcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) %r\" -s \"Bacula: Intervention needed for %j\" %r" mail = root@localhost = all, !skipped operator = root@localhost = mount console = all, !skipped, !saved append = "/var/lib/bacula/log" = all, !skipped }

Messages { Name = Daemon mailcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) %r\" -s \"Bacula daemon message\" %r" mail = root@localhost = all, !skipped console = all, !skipped, !saved append = "/var/lib/bacula/log" = all, !skipped }

Pool { Name = Default Pool Type = Backup

Recycle = yes AutoPrune = yes Volume Retention = 365 days }

Console { Name = respaldadora-mon Password = "password_para_respaldadora-mon" CommandACL = status, .status }

Das könnte Ihnen auch gefallen