Google+

miércoles, 22 de julio de 2009

Bacula en Debian


A veces es muy bonito ponerse a crear servidores y eso, pero todo el mundo sabe que en algún momento pueden fallar y necesitaremos tener algo que nos respalde, para ello utilizaremos bacula, que me parece una herramienta bastante avanzada para gestionar nuestros backup's.
 
Si andáis un poco perdidos sobre bacula, son necesario 2 servidores y el agente

  • bacula-director: este contiene los trabajos de backup, los clientes y el servidor de almacenamiento

  • bacula-storage: este contiene los discos duros o cintas donde volcaremos los backups

  • bacula-fd: este es el cliente del backup

En mi caso particular los tres los tengo en el mismo servidor, (hace backup de si mismo también, aun que no lo pondré para no agrandarlo más) y después tengo los bacula-fd donde quiero realizar más backups. Utilizaré mysql para que bacula-director almacene los datos, y dispongo de un RAID 5. Configuraremos dos clientes de prueba, un Linux y un Windows.

Empezamos con el Debian actualizado:


#apt-get update

Instalamos la mysql

#apt-get install mysql-server

Ahora el turno a bacula, si os fijáis bien pongo los 3 servidores que mencione antes:

#apt-get install bacula-client bacula-console bacula-director-mysql bacula-sd

Ahora podréis comprobar que tenemos 3 servicios más en el init.d: bacula-dir, bacula-sd y bacula-fd. No los arranquéis todavía por que no funcionarán. Los ficheros de configuración son un tanto sensibles así que solo funcionará si están perfectamente configurados.

Entramos en la mysql y creamos la base de datos, primero la arrancamos si la tenemos parada:
#/etc/init.d/mysql start

Entramos y creamos la base de datos:
#mysql -u root -p

mysql>create database bacula;

mysql>exit

Ya nos olvidamos de mysql, ahora solo nos queda bacula. Los archivos de configuración como siempre los encontraremos en /etc y este caso concreto en /etc/bacula. Empezaremos configurando el bacula-dir, que es el directorio.
Director {
Name = directorio #Nombre que querais
DIRport = 9101
QueryFile = "/etc/bacula/scripts/query.sql"
WorkingDirectory = "/var/lib/bacula"
PidDirectory = "/var/run/bacula"
Maximum Concurrent Jobs = 1
Password = "123456" #Pongo esto de passwd por que es más sencillo para mi
Messages = Daemon
}

#Estos son los clientes de bacula, donde se hará el backup
Client {
Name = correo
Address = 10.100.0.59
FDPort = 9102
Catalog = MyCatalog
Password = "123456"
File Retention = 30 days
Job Retention = 6 months
AutoPrune = yes
}

Client {
Name = windows
Password = 123456
Address = 10.100.0.58
FDPort = 9102
Catalog = MyCatalog
File Retention = 30 days
Job Retention = 6 months
}

#Unidades de almacenamiento

Storage {
Name = File
Address = 10.100.0.57 #Esto es la ip del servidor donde almacenaremos los datos, en mi caso es la ip local de mi servidor
SDPort = 9103
Password = "123456"
Device = FileStorage
Media Type = File
}

#Datos de la base de datos

Catalog {
Name = MyCatalog
dbname = bacula; DB Address = "localhost" ; user = root; password = "lo_que_quieras"
}

#Sistema de logs

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 =admin@linuxadmin.es = all, !skipped #Deberéis configurar el exim4 para que os envié el log a una cuenta externa de correo
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 = tu-mail@tu-dominio.es = 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
}

#Consola

Console {
Name = directorio #igual que el nombre de la segunda linea: "Name = ..."
Password = "123456"
CommandACL = status, .status
}

#Esta tarea, hace backup del /var menos de /var/no_lo_quiero

FileSet {
Name = "correos"
Include {
File = /var
Options {
signature = MD5
}
}
Exclude {
File = /var/no_lo_quiero
}
}

#Esto es para al backup de windows, del disco d
FileSet {
Name = "disco d"
Include {
Options {
signature = MD5
}
File = d:/
}
}

#Esta es la parte donde decimos el ciclo

Schedule {
Name = "CicloSemanal"
Run = Incremental mon-sat at 01:00 #De lunes a sabado backup a la 1 de la madrugada
Run = Full sun at 01:00 #Domingo backup entero a la 1 de la madrugada
}
Schedule {
Name = "Diario"
Run = Full sun-sat at 23:10
}

#Este es el primer trabajo,

JobDefs {
Name = "copia de etc del servidor de correo"
Enabled = yes
Type = Backup
Level = Incremental
Client = correo
FileSet = "correos" #Nombre de la tarea, lo tenemos arriba
Schedule = "CicloSemanal"
Storage = File
Messages = Standard
Pool = Default
Priority = 10
}

Job {
Name = "Correos"
JobDefs = "copia de etc del servidor de correo"
Write Bootstrap = "/var/lib/bacula/correos.bsr"
}

JobDefs {
Name = "portatil windows"
Enabled = yes
Type = Backup
Level = Incremental
Client = windows
FileSet = "disco d"
Schedule = "CicloSemanal"
Storage = File
Messages = Standard
Pool = Default
Priority = 10
}

Job {
Name = "backup portatil disco d"
JobDefs = "portatil windows"
Write Bootstrap = "/var/lib/bacula/backup_portatil.bsr"
}

#Es necesario meter estas lineas para la restauración

#Restaura el disdo D de la maquina windows

Job {
Name = "Restauracion de disco D"
Type = Restore
client = windows
FileSet = "disco d"
Storage = File
Pool = Default
Messages = Standard
Where = d:/restaurado #Restaura en la misma maquina cliente
}

#Restaura /var de la maquina Linux

Job {
Name = "Restauracion de var"
Type = Restore
client = windows
FileSet = "correos"
Storage = File
Pool = Default
Messages = Standard
Where = /var/restore #Restaura en la misma maquina cliente
}

Ahora el bacula-sd.conf, este arvhivo debe de estar en el servidor de almacenamiento. Los backuups se depositan en /media/datos
Storage {
Name = respaldadora-sd
SDPort = 9103
WorkingDirectory = "/var/lib/bacula"
Pid Directory = "/var/run/bacula"
Maximum Concurrent Jobs = 20
}

Director {
Name = respaldadora-dir
Password = "Satur012"
}

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

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

Ahora el fichero de configuración de la consola de bacula, bconsole.conf:
Director {
Name = localhost
DIRport = 9101
address = 127.0.0.1
Password = "123456"
}

Con estos tres archivos ya tendriamos la parte dificil. Ahora los arrancamos:
#/etc/init.d/bacula-dir start

#/etc/init.d/bacula-sd start

Y si todo ha ido bien debería de arrancar sin problemas. Lo ideal es empezar a configurar los clientes. El cliente de windows lo podréis bajar aquí buscais Win32/64. Importante. Bajad la versión del cliente igual que la del servidor, esto os evitará quebraderos de cabeza.

Ahora entraremos en la consola de bacula:
# bconsole
Connecting to Director localhost:9101
1000 OK: directorio Version: 2.4.4 (28 December 2008)
Enter a period to cancel a command.
*

Una vez en este promp podreis configurar todo lo relacionado con el backup. Lo ideal es que ejecutéis un "status" antes de empezamos a configurar la unidad de almacenamiento. Si todo esta ok menos los clientes no pasaría nada y podríamos continuar.
*label
Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"
Automatically selected Storage: File
Enter new Volume name: datos
Automatically selected Pool: Default
Connecting to Storage daemon File at 10.100.0.57:9103 ...
Sending label command for Volume "datos" Slot 0 ...
3000 OK label. VolBytes=198 DVD=0 Volume="datos" Device="FileStorage" (/media/datos)
Catalog record for Volume "datos", Slot 0 successfully created.
Requesting to mount FileStorage ...
3906 File device "FileStorage" (/media/datos) is always mounted.
You have messages.
*

Lo ideal seria dar permisos solo al usuario bacula en el directorio /media/datos

#chown -R bacula:bacula /media/datos

En cuanto a la parte cliente es lo más sencillo de configurar, el archivo de bacula-fd.conf:
Director {
Name = directorio
Password = 123456
Address = 10.100.0.57 #IP del bacula-dir
}

FileDaemon {
Name = correo
FDport = 9102
WorkingDirectory = /var/lib/bacula/working
Pid Directory = /var/run/
Maximum Concurrent Jobs = 20
}

Messages {
Name = Standard
director = directorio = all, !skipped, !restored
}

No explico la instalación del cliente bacula en windows por que es siguiente, siguiente, siguinte. Cuando este instalado nos dirigiremos a Inicio > Programas > Bacula > Configuration > Edit Client Configuration y metemos las lineas de abajo:
Director {
Name = directorio
Password = 123456
Address = 10.100.0.57 #IP del bacula-dir
}

FileDaemon {
Name = windows
FDport = 9102
WorkingDirectory = "C\\Documents and Settings\\All Users\\Datos de programa\\Bacula\\Work"
Pid Directory = "C\\Documents and Settings\\All Users\\Datos de programa\\Bacula\\Work"
Maximum Concurrent Jobs = 20
}

Messages {
Name = Standard
director = directorio = all, !skipped, !restored
}

Guardamos y reiniciamos el servicio de bacula, como nota, si el servicio de bacula no inicia, es que el archivo esta mal. En linux seri:
#/etc/init.d/bacula-fd start

Reiniciad todas las maquinas y comprobad que todo se inicia en el arranque y solo quedaria ejecutar bconsole y movernos por las diferentes opciones que tenemos.
#bconsole
*status all #comprueba que todo este correcto
*run #ejecuta una tarea
*restore #restaura archivos, los seleccionamos con el comando mark y con done ejecutamos
*help #indespansable

Como detalle seria ideal conigurar exim4 para poder enviar correos a una cuenta externa de correo. Solo queda disfrutar que funcione y ojala que no lo tengáis que usar.