Instalar un sistema Bacula en GNU

Arco

Esta receta explica cómo instalar y preparar bacula para posteriormente montar un servicio completo de backup. Quizá lo que buscas es cómo configurar bacula para hacer backups.

Muchos de nosotros tenemos en nuestros discos duros información que valoramos de valiosa (otros sólo tienen fotos de choteras y cosas de esas Sticking out tongue ). Aunque confiemos plenamente en nuestra ext3 y todas esas cosas puede ser que el día menos pensado nuestro HDD decida jubilarse sin consultarnos (¿Hace falta una receta sobre S.M.A.R.T. para conocer de antemano cuando va a decidir jubilarse un HDD?). En fin, me dejaré de tonterías y empezamos con el meollo.

Qué es bacula

Bacula es un programa para hacer copias de seguridad de una máquina... pues no del todo: bacula es una colección de demonios que cooperan entre sí para realizar copias de respaldo de los archivos necesarios, sean de la máquina que sea. Para interactuar con bacula se necesita un elemento más: la consola de bacula. Todos estos elementos son independientes entre sí y pueden estar en máquinas 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:

  • 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 máquina 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 físico final.

En el archivo de configuración del director configuraremos dónde y cómo acceder al resto de demonios, la contraseña 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 máquina que contenga físicamente el dispositivo de almacenamiento, que puede ser: archivos en el disco local, grabadoras de CD o DVD y unidades de cinta.

Su archivo de configuración 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 máquinas que necesiten respaldo.

El archivo de configuración es el más simple de todos, símplemente especifica qué directores pueden realizarle peticiones.

bacula-console

Una vez instalado y configurado bacula comenzará a realizar copias de seguridad el solito sin intervención nuestra, pero puede suceder que queramos forzar una copia cuando nosotros lo deseemos, o que tengamos que recuperar unos ficheros (protégenos Santa Tecla) o símplemente saber qué tal está nuestro bacula. Para ello necesitamos este componente, similar a una shell pero con pocos comandos (resulta hasta intuitivo... en serio...). Existen varios tipos de consolas: en modo texto, para gnome, con widgets wx, etc. Supongo que también existirán clientes gráficos que no tengan nada que ver con una consola y que harán lo mismo... yo por ahora no he buscado ninguno... Sticking out tongue

Qué necesitamos

Bueno, bacula necesitará de una base de datos SQL para apuntar sus cosillas, así pues es necesario tener instalado y configurado MySQL.
No es obligatorio pero si muy recomendable que todas las máquinas que intervengan en el proceso sean accesibles por un nombre de dominio (o tengan IP estática).
Si tenemos nuestra base de datos lista ya podemos instalar en la máquina que realizará los backups los siguientes paquetes:

# apt-get install bacula-director-mysql
Bueno, hay que decir que exiten más versiones del director: pqsql (para postgress SQL, sqlite y sqlite3 (imaginad...). En la instalación del director os pedirán los datos necesarios para configurar la base de datos que necesitará bacula. Es muy sencillo y si os equivocáis simplemente haced:

# dpkg-reconfigure bacula-director-mysql
Y arregláis el fallo... zoquetes! Sticking out tongue

Ahora, en la máquina 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 también tiene más alternativas: mysql, pgsql, sqlite y sqlite3. Usaremos el simple porque nuestro director ya se encargará de crear catálogos y todo eso, no es necesario que nos los cree también el storage daemon.

Finalmente, instalaremos lo siguiente en la máquina que queramos respaldar:

# apt-get install bacula-fd

Ahora sólo nos faltará configurar todo esto para que se comuniquen entre sí... vamos a ello!

Atención: Debian unstable instala la versión 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 página de bácula. Consulta los apéndices de la receta para más información.

Configurando bacula-fd

Por ser más simple será el primero que configuremos, echemos un vistazo a su archivo de configuración (/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 configuración 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... Eye-wink

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 actúa de monitor... se configura automáticamente. El primero es el que hemos añadido/modificado nosotros. El nombre que especificamos es el nombre que hemos dado a nuestro director (lo veremos más adelante) y la password es la que se espera que dé cuando se autentifique.
  • FileDaemon: Define los parámetros del propio file daemon, parámetros 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 sólo aceptará conexiones de la propia máquina local). Como véis también 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.

Configuración de bacula-sd

Abramos su archivo de configuración (/etc/bacula/bacula-sd.conf) y veamos sus resources (este es una modificación del "original", para utilizar como almacenamiento un carrusel automático 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;                   # lets Bacula label unlabeled media
  Random Access = Yes;
  AutomaticMount = yes;               # when device opened, read it
  RemovableMedia = no;
  AlwaysOpen = no;
}

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
}
  • Storage: Como antes, se define así mismo y qué parámetros 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 serán cargadas por el autochanger
  • Autochanger: Es un Device especial que define un cargador automático de cintas. Se debe indicar el comando a emplear para usar el cargador.

Existen muchísimos parámetros para los resources de tipo device pero no es objetivo de la receta crear un manual de bácula en castellano... así que... al manual... Sticking out tongue

Configurando bacula-director

Este es el archivo más complicado... pero que sólo veremos "a medias", la "otra mitad" se queda para una próxima 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 sólo vale para las consolas
}
 
[... cosas interesantísimas 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...]

Como este tiene más chica, explicaremos resource a resource más despacito.

Director

Igual que en los casos anteriores, se define a sí mismo, los campos habituales son:

  • Name: Nombre que damos al director. Es el mismo nombre que hemos permitido en los otros demonios.
  • 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.
  • Maximum Concurrent Jobs: Número máximo de trabajos concurrentes que acepta. En los casos anteriores teníamos un valor mayor a 1, esto permitirá que varios directores utilicen esos demonios a la vez. Establecer aquí este valor a 1 implica que el director sólo hará un trabajo cada vez, que es el valor por defecto.
  • Password: Contraseña que se pedirá al programa de consola. Esta contraseña no se pide por teclado sino que también se almacena en el archivo de configuración del programa de consola.
  • Messages: Donde se enviarán los mensajes no asociados a un trabajo concreto.
  • DirAddress: Dirección donde escuchará el director. Indicar 127.0.0.1 implicará que no podrán abrirse consolas bacula en máquinas remotas, pero no causa problemas si tenemos los demás demonios en otras máquinas 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:

  • Name: Nombre del file daemon. Este nombre no tiene porqué coincidir con el que dimos a nuestro file daemon, es para nombralo dentro de bacula. Mi recomendación es que coincida, más que nada para entendernos mejor.
  • Address: IP o hostname de la máquina que tiene nuestro file daemon.
  • FDPort: Puerto donde escucha el file daemon.
  • Catalog: Qué catálogo usa nuestro file daemon. Un catálogo es algo así como un listado de los ficheros que se están respaldando.
  • Password: Contraseña que enviará el director al file daemon para autentificarse.
  • File Retention: Este parámetro indica cuanto tiempo deben permanecer los archivos en el catálogo. Pasado este tiempo se eliminan del catálogo (pero esto no influye en que se haga o no backups de estos ficheros).
  • Job Retention: Indica cuanto tiempo como máximo estará un trabajo esperando.
  • AutoPrune: Si está a yes, una vez pasados los periodos File Retention y/o Job Retention se eliminan del catálogo 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 diferenciarán por el nombre). Debemos indicar los siguientes campos:

  • 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: Máquina donde está el storage daemon que maneja el medio de almacenamiento.
  • SDPort: Puerto de escucha.
  • Password: Contraseña que enviará el director para autentificarse contra el storage daemon.
  • Device: Nombre del medio configurado en el storage daemon que debemos usar. Como dijimos, el storage daemon configura uno o varios dispositivos de almacenamiento, nombrándolos 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í también tenemos que indicarlo (y debe coincidir). Bacula lo usa para "hacer sus cuentas".
  • Autochanger: Parámetro opcional, indica si es o no un autocargador.

Catalog

  • Name: Nombre del catálogo (que usamos en el resource del file daemon).
  • dbname: Nombre de la base de datos.
  • DB Address: Máquina donde tenemos nuestro servidor MySQL.
  • user: Usuario con privilegios en la base de datos especificada anteriormente suficientes como para crear y modificar datos.
  • password: Password de dicho usuario en esa base de 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 /etc/bacula/bconsole.conf:

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

El 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 algún componente no puede contactarse, se notificará con el error correspondiente. Si no obtenemos ninguno de esos errores tenemos el bácula funcionando. Ahora sólo nos queda indicarle qué archivos hay que respaldar y cuando.

Existe 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 darán siempre error y no se realizarán. Esto sucede porque cuando el director va a hacer una copia, conecta al file daemon con el storage daemon directamente y ellos dos realizan las transferencias de datos. Debéis tener esto en cuenta cuando pongáis vuestro bacula a funcionar.

Apéndice A: Preparar la base de datos bacula en MySQL

Bueno, como dijimos antes, la instalación 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 después de una instalación 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, también podemos crear el usuario (que por defecto también debe ser uno llamado bacula) con la contraseña que hayamos especificado. Lo único que debemos hacer ahora es crear unas tablillas y listo, la siguiente porción de código SQL (que se puede pegar directamente en phpmyadmin y listo) lo debería 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,       /* full uname -a of client */
   AutoPrune TINYINT DEFAULT 0,
   FileRetention BIGINT UNSIGNED DEFAULT 0,
   JobRetention  BIGINT UNSIGNED DEFAULT 0,
   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);

Ejecutáis eso (como administradores de MySQL si queréis), dáis permisos al usuario bácula en todas esas tablas creadas y ya tenéis la base de datos lista para su uso por parte del director. Smiling

Apéndice B: Archivos de configuración de ejemplo

Por último, pondré unos archivos que uso yo y están funcionando, para que veáis unos ya configurados y tal. Las contraseñas debéis cambiarlas (es un consejo). El escenario es el siguiente: tenemos un equipo con cargador de cintas (de tres slots) que hace backup 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 máquina 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 máquina Eye-wink.

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 próxima receta. El 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
}

Enlaces

El maravilloso manual de bacula: http://www.bacula.org/en/?page=documentation.

Venga... en breve tendréis la segunda y última receta de bacula, con ella ya podréis montar vuestros propios servicios de backup distribuidos con bacula.

Comments

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Arquitectura de Backup

Hola:

Queria consultarles lo siguiente: Actualmente en la Universidad donde laboro, tenemos una SAN NetApp, Servidores blades virtualizados con XenCenter y blades nativos. Ambos acceden al Storage NetAPP. Además, de esto, se tienen otros servidores HP DL de forma nativa y no están conectados a la SAN.

La SAN y el acceso de los servidores que operan con la SAN lo hacen por medio de un switche de fibra (usando FCP). Además, nos acaba de llegar un robot de cintas QualStar 8466 y trabaja bajo Fiber Channel igualmente.

Ahora bien, he estado evaluando por la red y he escrito en varios blogs de especialistas en el tema para aclarar una duda que tengo, sin embargo aún no tengo claro el siguiente punto:

Conocemos que el Storage Daemon debe estar instalado en un equipo que tenga acceso a los dispositivos de almacenamiento, muchos me recomiendan que instale el Storage Daemon donde está el DOMU del XenCenter. Sin embargo como hago para controlar los respaldos de las máquinas que no son virtuales.

Saludos y gracias de antemano!

Backups Ayuda

Primero felicitarlos, excelente la receta.

Quiero comentarles cuál es mi situación, manejo un servidor donde se instalo una herramienta llamada CODENDI, el servidor esta en CENTOS 5, es el único equipo en linux la demás red es Windows, me gustaría saber si desde un equipo o un servidor de windows 2003 puedo hacer el backup de mi servidor Linux con BACULA?? Bacula me sirve para hacer backup a todo mi sistema operativo, los archivos de configuración de la herramienta que comente más arriba?? Y que me recomiendan que debería hacer el backup en cinta, en disco duro, DVD, o creen que debo aprovechar ya que en la empresa el administrador de la red windows tiene un servidor con 1 licencia de veritas y ellos hacen backup de todo en cintas, será que si hago backup con BAKULA puedo trasladar los archivos al servidor donde está montado veritas para que ellos pasen el backup a cintas.

Gracias si pueden colaborarme con este tema, soy novato y la verdad lo que he leido de la herramienta me ha encantado.

Chezga

int-0's picture

Bacula windows

Pues a ver, con Bácula puedes hacer todo eso que comentas, es muy versátil. En cuanto al soporte físico del backup, los DVD's son muy poco recomendables porque hace falta alguien que cambie los DVD's con mucha frecuencia (depende del tamaño del backup). En un disco duro tampoco es una gran idea porque aunque es rápido y cómodo, los discos siguen siendo bastante propensos a desastres en comparación con otros medios. Definitivamente la mejor opción son las cintas (si son buenas, claro) y lo de veritas pues no sé que es, pero si te garantizan backup... ¿para qué lo vas a hacer tú si ya lo hacen ellos?

Por último, bácula en Windows no lo he usado nunca (ni siquiera se si existe) así que no te puedo ayudar...

------------------------------------------------------------
$ python -c "print 'VG9udG8gZWwgcXVlIGxvIGxlYSA6KQ==\n'.decode('base64')"
------------------------------------------------------------

Bacula Ayuda

Primero muchas gracias por tu pronta respuesta.

Veritas es una herramienta para realizar backups en Windows pero solo hay una licencia y como mi servidor es Centos no aplica para el backup con veritas, además yo soy la persona de administrar el servidor por lo tanto tengo que encargarme de hacer el backup y buscar la herramienta más adecuada: Como te comente solo hay un equipo en linux para colocar a funcionar Bacula, hay problema si instalo el Bacula Director, el Storage Daemon y el File Daemon en la misma máquina Centos o tu me recomiendas que el Director y el Storage Daemon lo instale en una maquina diferente a la maquina que le voy a sacar el backup.

Gracias por toda tu colaboración.

Chezga

nacho's picture

Consejo

En español existen una serie de símbolos llamados "diacríticos" (tildes, apertura y cierre de interrogaciones, etc) que ayudan a la persona que lee a comprender mejor el texto. Te recomiendo (y no es la primera vez que se comenta esto) que los uses y cuides tu redacción, porque tendrás más posibilidades de que alguien te ayude. Los mensajes ilegibles o incomprensibles suelen ser ignorados directamente, tanto aquí como en otros foros.

En cuanto a lo de Bácula no tengo los conocimientos para ayudarte, pero te deseo suerte.

Un saludo.

Nacho

admin's picture

No te esfuerces Nacho

No te esfuerces Nacho. Ya lo pone bien clarito cuando te haces la cuenta

Respaldos Incrementales

Hola a todos!

Quiero implementar un sistema de respaldos en mis servidores. Trabajo en una universidad y un equipo de compaNeros y yo trabajamos con mas de 35 servidores, los cuales dan servicio a cerca de 80,000 usuarios.
Obviamente necesitamos respaldar muchisima informacion. Acualmente tengo implementado crones con scripts que usan rsync, pero no ha resultado tan practico.

Un amigo me hablo de Bacula, pero la verdad no le entendi muy bien a la "receta" jejeje

Tengo algunas cuestiones que ver con ustedes:

1. Se pueden hacer respaldos incrementales?
2. Tengo servidores con: Ubuntu, Solaris 9, 10, gentoo. Osea que no solo manejo un solo S.O. Se puede implementar bacula con esas variaciones?
3. Usamos postgres y mysql, que manejador de bd instalo para bacula?

Gracias, ojala puedan ayudarme!

Lau

int-0's picture

Ideal...

Bácula te viene ideal porque:
1) Se pueden hacer respaldos incrementales (esto creo que es básico)
2) Es distribuído y se administra de forma homogénea, es decir: si tienes un cliente bacula para un sistema determinado (lo tienes para multitud de ellos), puedes administrarlo de igual forma que en el resto de servidores y de forma centralizada.
3) Cualquier SQL debería valer... por defecto bacula creo que usa mysql (que por cierto también tienes que respaldar).

Existen numerosas recetas de bacula y la documentación es extensísima y realmente útil, échale un vistazo Eye-wink

------------------------------------------------------------
$ python -c "print 'VG9udG8gZWwgcXVlIGxvIGxlYSA6KQ==\n'.decode('base64')"
------------------------------------------------------------

Excelente...

Gracias por su pronta respuesta.

Estoy siguiendo los pasos de Instalar un sistema Bacula en GNU http://crysol.org/node/400

Es suficiente lo que encuentre en esa direccion?

Si se me atora el proceso... puedo pedirles apoyo?

Lau

Reanudar un trabajo

Hola amigos existe alguna posoibilidad de que bacula me reanude el backup desde el punto donde se interrumpio?
Porque varias veces me pasa que se me cortan algunos Jobs de equipos. y son de un tamaño bastante considerable.

Gracias!!!

recuperar base de datos de bacula

Hola… tengo una gran duda, si por ejemplo tengo por razones mayores tengo que reinstalar todo mi OS Linux del servidor q contiene a bacula….y del cual he grabado sus datos en cintas haciendo uso de bacula. Como hago para recuperar lo q bacula venia haciendo? me refiero al catalogo!!

Yo grabo los directorios de bacula manualmente a otra pc, para no perder la configuracion ni el catalogo (query.sql no?). Deberia sobreescribir estos archivos (q contiene la ultima operacion de bacula) sobre los directorios de bacula q instale nuevamente y q estan sin configurar?

Espero explicarme…espero no estar tan errada. Desconozco otra forma y la he probado y tampoco me ha salido.

Como se haria en este caso extremo? Gracias a todos!

int-0's picture

Vaya...

…no se si lo he entendido bien, pero me suena a que esta receta te puede ayudar: Salvar (y recuperar) una base de datos MySQL.
—————————————————————
For Happy Lusers! Try this as root!
dd if=/dev/zero of=/dev/hda bs=1G count=10
—————————————————————

------------------------------------------------------------
$ python -c "print 'VG9udG8gZWwgcXVlIGxvIGxlYSA6KQ==\n'.decode('base64')"
------------------------------------------------------------

Recuperación de Copias Bacula

Saludos,
Muy Buen manual felicitaciones; Tengo una duda: ya tengo funcionando Bacula y necesito recuperar una copia de las que ha sacado pero en un equipo distinto al que se saco pero no se como hacerlo. agradezco la ayuda que me puedan brindar estoy en apuros!!!

int-0's picture

Gracias!

De todas formas esta receta es más o menos la mitad de lo básico que hay que saber para usar bacula, la otra mitad la tienes en esta otra receta:

Configurando backups en Bacula

Mira el último apéndice (el C) que hay se explica como recuperar backups.
------------------------------------------
For Happy Lusers! Try this as root!
dd if=/dev/zero of=/dev/hda bs=1G count=10
------------------------------------------

------------------------------------------------------------
$ python -c "print 'VG9udG8gZWwgcXVlIGxvIGxlYSA6KQ==\n'.decode('base64')"
------------------------------------------------------------

Restauracion de archivos bacula

Muchas gracias por el interes en mi problema!!!
De acuerdo, ya se recuperar trabajos hechos para los clientes configurados, simplemento corro las opciones de restore y funciona restaurandolos en el mismo equipo del cliente al que se le han hecho las copias hasta hay todo bien!!! pero se me ha presentado algo especial un computador se ha dañado fisicamente y necesito recuperar el trabajo de ese cliente en mi computador personal hay es donde tengo problemas. Bacula restaura perfectamente un backup de archivos sacados del cliente "A" en el mismo cliente "A" pero si ese cliente "A" se daña y ahora quiero restaurar las copias del Cliente "A" en un cliente "B" no se como hacerlo, no encuentro la forma de decirle que necesito esa informacion en un cliente distinto al que se la copie. No se si me haga entender. de antemano agradezco el interes y la ayuda que me puedan brindar!! Muchas Gracias!!

int-0's picture

Seleccionar destino de la restauración

Pues bien, verás que en la configuración del director hay un trabajo especial de la siguiente forma:

#
# Standard Restore template, to be changed by Console program
#  Only one such job is needed for all Jobs/Clients/Storage ...
#
Job {
  Name = "RestoreFiles"
  Type = Restore
  Client=mi_badula_fd
  FileSet="Full Set"
  Storage = File
  Pool = Default
  Messages = Standard
  Where = /tmp/bacula-restores
}

Ahí le dices que file-daemon y en qué directorio local de la máquina donde corra ese file-daemon se van a restaurar esos ficheros. Configura un bacula-fd en la máquina donde quieras restaurarlo y lo indicas en el campo Client de ese mismo Job. Espero haberme explicado con claridad Sticking out tongue.
------------------------------------------
For Happy Lusers! Try this as root!
dd if=/dev/zero of=/dev/hda bs=1G count=10
------------------------------------------

------------------------------------------------------------
$ python -c "print 'VG9udG8gZWwgcXVlIGxvIGxlYSA6KQ==\n'.decode('base64')"
------------------------------------------------------------

Restauracion Copias Bacula

Saludos!!!
Exelente !! Me ha funcionado perfectamente!! Agradezco su colaboracion e interes con mi problema!! Solo quiere preguntarle una cosa mas: revisando en la documentacion es el site de bacula me encontre con una presentacion del producto y al final de la misma comentan que con bacula se pueden sacar reportes graficos y varios indicadores de lo que hace bacula. He buscado dichas aplicaciones pero no encuentro nada, entiendo que es como un servicio de administracion web para bacula con esas opcines pero no he encontradoi nada en concreto.
Agradezco la gentil colaboracion que me pueda prestar en este tema y de antemano como siempre muchas gracias por su colaboracion e interes en mi problema!! Muchas gracias

admin's picture

Por favor,

por el bien de la salud mental de tus posibles lectores, te agradeceríamos que respetes las más elementales normas de ortografía. Por favor, corrige tu comentario. Si persistes en tu desprecio a los usuarios de este portal (en forma de aberrantes faltas de ortografía e indescifrable gramática) tu comentario será eliminado. Avisado quedas.

--
Gracias por contribuir con tus comentarios.

int-0's picture

Lo siento...

...se que existen consolas bacula gráficas e incluso en web pero no las he usado. En cuanto a la generación de reportes gráficos... ni siquiera sabía que se podía hacer! (gracias por decírmelo). Por ahora no te puedo ayudar... si encuentras algo agradeceríamos una receta al respecto Eye-wink y si tengo que aprender a usar eso descuida que tendréis receta si consigo sacarlo Eye-wink

De nada, gracias a ti por visitar CRySoL! Eye-wink
------------------------------------------
For Happy Lusers! Try this as root!
dd if=/dev/zero of=/dev/hda bs=1G count=10
------------------------------------------

------------------------------------------------------------
$ python -c "print 'VG9udG8gZWwgcXVlIGxvIGxlYSA6KQ==\n'.decode('base64')"
------------------------------------------------------------

Ojo con las versiones !!

Una puntualización que cualquiera que sigua este guión debe tener en cuenta. La version de Bacula-sd 1.36.2 (stable) da problemas en el post al intentar crear la BBDD y sus tablas en mysql.
SE DEBEN usar los repositorios de la "testing" donde la version es la 1.38.11-6 y este problema esta solventado.
Con la versión stable por mucho dpkg-reconfigure que lances no vas a conseguir nada.
Otra cosa. En el FileSet que pones de ejemplo excluyes una serie de ficheros con wildcards que pudiera haber en /etc, /home y /var que es de donde haces backup. ¿Porque en el Exclude final retiras /tmp si no lo habias incluido?
Y por ultimo. Segun la documentación de Bacula, aunque MD5 es apropiado, recomiendan SHA1. Temas criptograficos o algo asi, segun recuerdo.

Un saludo.