02.25.06
Bacula, el dràcula dels backups :-[

Primer de tot, no podia deixar d’incloure aquesta frase (”eslógan” oficial de bacula):
It comes by night and sucks the vital essence from your computers.
Després d’aquest incís, anem a veure com fer còpies de seguretat dels nostres sistemes amb aquest software de backups tant complet (feu un cop d’ull a la gran quantitat de documentació i els dispositius soportats).
Bacula té una estructura modular, en poques paraules hi ha tres daemons:
- Storage Daemon: S’encarrega de gestionar les particularitats del(s) dispositi(s) físics
- File Daemon: Té accés als conjunts de fitxers dels quals hem de fer els backups
- Director: Gestiona tots els recursos de forma centralitzada: Amb quina periodicitat s’han de fer backups, sobre quins dispositius, etc…
Per els impacients, hi ha un petit tutorial que explica molt ràpidament com muntar bacula. Com que la documentació de bacula és força bona i molt extensa, comentaré una mica com m’ho he muntat jo…
Mentre aneu definint les polítiques del vostre sistema de backups, veureu que els fitxers de configuració es fan força llargs/repetitius, per tant us recomano que feu servir intensivament els “includes” que ofereix bacula per separar les features, més endavant ho comento.
# ls /etc/bacula/ bacula-dir.conf bacula-fd.conf bacula-sd.conf bconsole.conf
Mirem primer el bacula-dir.conf per parts:
Director { # define myself
Name = nopcode-dir
DIRport = 9101 # where we listen for UA connections
QueryFile = "/usr/libexec/bacula/query.sql"
WorkingDirectory = "/var/lib/bacula"
PidDirectory = "/var/run"
Maximum Concurrent Jobs = 1
Password = "<un hash ben llarg>" # Console password
Messages = Daemon
}
@/etc/bacula/conf/jobs.conf
@/etc/bacula/conf/filesets.conf
@/etc/bacula/conf/schedules.conf
@/etc/bacula/conf/clients.conf
@/etc/bacula/conf/storage.conf
(...)
@/etc/bacula/conf/pools.conf
Aquí podeu veure que bacula usa un port registrat per l’IANA, que usa CRAM-MD5 per autenticar entre components (també podeu usar TLS) i per últim els includes que he comentat abans començant per “@”. Per fer-vos una idea general de com estan interrelacionats aquests fitxers de configuració i les funcionalitats de bacula, us comento una mica la funció de cada fitxer.
bacula-dir.conf i @’s
Un job és una tasca (backup, verificació o restore) que s’executa sobre un conjunt de fitxers fileset (/home, p.ex) amb una periodicitat definida per un schedule (cada setmana incremental i a principis de mes full, p.ex) sobre un dispositiu d’emmagatzemament storage (partició, cinta …).
Al fitxer jobs.conf defineixo una plantilla que ens servirà per definir jobs similars i no estar repetint la mateixa informació per cadascun d’ells, podent redefinir els paràmetres per cada job concret:
# jobs.conf
JobDefs {
Name = "DefaultJobTemplate"
Type = Backup
Level = Incremental
Client = nopcode-fd
FileSet = "sistema-fset"
Schedule = "WeeklyCycle"
Storage = File
Messages = Standard
Pool = Default
Write Bootstrap = "/backup/bacula/nopcode.bsr"
Priority = 10
}
# sistema
# Aquí podriem redefinir variables del DefaultJobTemplate
Job {
Name = "sistema-job"
JobDefs = "DefaultJobTemplate"
Pool = "sistema"
}
El fileset són els fitxers que volem incloure/excloure en el nostre backup amb opcions addicionals de compressió i/o de generació de hashos MD5 o SHA1 (realment molt útil per fer auditories de seguretat automatitzades a la tripwire):
# filesets.conf
FileSet {
Name = "sistema-fset"
Include {
Options {
signature = MD5
compression = GZIP
}
File = </etc/bacula/conf/filesets/sistema-incl
}
Exclude {
File = </etc/bacula/conf/filesets/sistema-excl
}
Fixeu-vos en el modificador “<” darrere del paràmetre File. Indica que la llista de paths per fer backup està en aquest fitxer (una ruta per línea). Un altre modificador interessant és “\<”, que permet indicar a bacula que la llista de paths està en el client. Això ens permet que un usuari defineixi les rutes de les quals vol fer backup sense intervenció de l’administrador. Aquesta feature pot ser un inconvenient si l’usuari decideix fer backup de tota la seva col·lecció d’mp3’s… si es dóna el cas, aneu preparant cintes/hdd’s addicionals :-/.
L’schedule especifica quan executem els jobs amb una sintaxi força intuïtiva/stándar:
# schedules.conf
Schedule {
Name = "WeeklyCycle"
Run = Full 1st sun at 1:05
Run = Differential 2nd-5th sun at 1:05
Run = Incremental mon-sat at 1:05
}
Les pools són simplement conjunts de volums. Habitualment els volums d’una pool són d’un mateix “tipus”: sistema, mail, web … Però també podem definir altres estratègies de backup com per exemple fer una pool per dia (tot el backup d’un dia estarà en una pool). A la documentació de bacula hi ha una comparativa entre polítiques. Una pool d’exemple podria ser:
#pools.conf
Pool {
Name = mail
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 90 days # ~3 months
Accept Any Volume = yes
Label Format = "mail-"
Maximum Volume Bytes = 100m
}
Aquesta especificació generarà al disc USB extern que tinc com a unitat de backups, fitxers (volums) de l’estil mail-0001 de 100MB cada un. Si no s’especifica el paràmetre “Maximum Volume Bytes” generarà fitxers tant grans com el backup que realitzem (comprimit si és el cas).
bacula-sd.conf
L’única secció on heu de tenir especial atenció és la de Device, que defineix com és el vostre dispositiu de backups (en el meu cas un disc dur extern USB de 250GB):
Device {
Name = USB_HDD
Media Type = File
Archive Device = /backup/volumes
Label Media = yes # lets Bacula label unlabeled media
Random Access = Yes
AlwaysOpen = no
Automatic Mount = yes
Removable Media = no
}
Compte amb el paràmetre “Automatic Mount”, si no el poseu a “yes”, preguntarà cada vegada que munteu un nou volum (us enviarà un mail), haureu de loguejar a la bconsole (bacula console) i dir-li mount… poc automatitzat/pràctic, no creieu ?
bacula-fd.conf
Aquest fitxer el podeu conservar tal com ve de série, modificant el camp Password si cal. És el que instal·lareu als vostres clients i que es comunicarà amb el director.
Director {
Name = nopcode-dir
Password = "< hash llarg >"
}
FileDaemon { # this is me
Name = nopcode-fd
FDport = 9102 # where we listen for the director
WorkingDirectory = /var/lib/bacula
Pid Directory = /var/run
Maximum Concurrent Jobs = 20
}
S’accepten crítiques/preguntes/idees ! ![]()
alexm said,
February 26, 2006 at 3:15 am
Certament aquesta eina té molt bona pinta i el teu article està molt bé.
Com encaixa aquesta eina amb el sistema de backups distribuït del que hem parlat sovint: còpies creuades entre diversos col·legues, amb les dades xifrades i replicades en cadascún dels nodes que formen part del sistema.
Tenint en compte com està dissenyat, com creus que es podria muntar? Se m’acud que hi hauria un director i un fd al node local i un sd per a cada node remot on hi hauria una rèplica, però el rendiment dels nodes disminueix ràpidament a mida que agumenta el número de nodes.
Per cert, quins algorismes de xifrat es poden utilitzar per a les dades que s’emmagatzemem a l’sd?
brainstorm said,
February 26, 2006 at 1:24 pm
Bones Alex, gràcies pel comentari…
Si no recordo malament, la idea inicial era fer cross-backups 1 a 1, però veig que l’has extés en plan P2P… sincerament, tot i que els meus backups estiguessin xifrats, no m’atreu massa la idea de tenir les dades escampades per tot arreu, amb un colega ja hi ha prou (crec jo) ;-P
En el cas que ho volguessis muntar de forma distribuïda de n a n, seria ideal que tots tinguessin els tres daemons corrent: sd, fd & director, d’aquesta forma faria backups d’ell mateix i oferiria serveis a tercers nodes.
En el cas que algú no disposés d’espai i volgués fer còpies de les seves dades emmagatzemades a tercers, podria prescindir doncs de director & sd (només seria un client, per tant només correria fd).
En tot cas, la teva solució és bona si el node local no vol fer backups de sí mateix. Com pots veure el sistema és prou flexible per fer les configuracions que vulguis.
D’altra banda, és cert que el rendiment baixaria, però tenint en compte que son backups, la velocitat no és un factor crític… a priori. A mesura que s’afegissin nodes, segurament apareixeria un problema greu d’schedules, s’haurien de quadrar tots perquè es poguessin fer backups bé… gens trivial crec jo.
Per últim el tema xifrat al guardar les dades (recordem que el tema transmissió ja el tenim solucionat amb TLS), es podria fer a nivell de partició amb http://luks.endorphin.org/about. Però aqui, ja perdem el factor “backups desatesos” perquè hauriem d’estar pendents d’introduïr passwords per cada job que s’executés (en el cas que fessim backups montant/desmontant la partició/dispositiu de backups) :_(
Hope it helps
brainstorm said,
December 29, 2006 at 10:34 am
Sembla que ja existeix aquesta opció desde fa un temps i no ens haviem adonat: http://en.wikipedia.org/wiki/Distributed_internet_backup_system