Progetto

Generale

Profilo

Actions

BaculaBackup » Cronologia » Versione 30

« Precedente | Versione 30/35 (diff) | Successivo »
Simone Piccardi, 22-12-2010 15:01


Backup con Bacula

Bacula è un potente sistema che consente la centralizzazione dei backup di varie macchine all'interno di una rete, e la gestione automatica degli stessi.

L'architettura di bacula è composta da tre componenti principali:

  • il File Daemon, che va installato sulle macchine di cui si vuole effettuare il backup ed ha il compito di gestire i file di cui deve essere eseguito il backup.
  • lo Storage Daemon che va installato sulla macchina su cui è presente il dispositivo di registrazione dei dati (nastro, disco o quant'altro).
  • il Director che va installato su una macchina qualsiasi (ma in genere si usa quella dove sta il dispositivo di backup) e che è il servizio che controlla tutti gli altri e gestisce i backup.

Ciascuno di questi tre servizi ha un suo script di avvio ed un suo file di configurazione, come illustrato nella seguente tabella:

Servizio File di configurazione Script di avvio
File Daemon bacula-fd.conf bacula-fd
Storage Daemon bacula-sd.conf bacula-sd
Director bacula-dir.conf bacula-director

a questi si aggiuinge poi la console di comando, bconsole.

Installazione e configurazione

Tratteremo dell'installazione e della configurazione di base con Debian Lenny. Una delle caratteristiche di Bacula è quella di salvare su un database il suo stato, mantenendo quello che viene chiamato dal programma stesso il catalogo. Il programma supporta tre tipi di database, MySQL, PostgreSQL e SQLite. Dato che la versione ufficiale di Debian Lenny non aveva abilitato (per questioni di licenza con OpenSSL) il supporto per le connessioni cifrate, useremo la versione ottenuta da backports (la 5.0.2 al momento della ultima revisione di queste note) che usa GnuTLS.

<pre>
deb http://www.backports.org/debian lenny-backports main contrib
</pre>
e poi installare la versione per il database scelto con:
<pre>
apt-get install bacula-director-sqlite3 bacula-sd bacula-fd
</pre>

h2. Configurazione con SSL

<pre>

<pre>

<pre>
Director {                            # define myself
  Name = backup1-dir
  DIRport = 9101                # where we listen for UA connections
  [[QueryFile]] = "/etc/bacula/scripts/query.sql" 
  [[WorkingDirectory]] = "/var/lib/bacula" 
  [[PidDirectory]] = "/var/run/bacula" 
  Maximum Concurrent Jobs = 1
  Password = "xxx"         # Console password (lunga e complicata)
  Messages = Daemon
  TLS Enable = yes
  TLS Require = yes
  TLS CA Certificate File = /etc/ssl/certs/Truelite-cacert.pem
  TLS Certificate = /etc/ssl/certs/bacula.fi.trl-cert.pem
  TLS Key = /etc/ssl/private/bacula.fi.trl-key.pem
  TLS Verify Peer = yes
  TLS DH File = /etc/bacula/dh1024.pem
}
</pre>

in questo caso le varie direttive servono a dichiarare chiave e certificato SSL usato dal _Director_, ed indicare la CA con cui vengono verificati le connessioni dai client verso il _Director_. Devono poi essere configurate le modalità di accesso SSL client del  _Director_ verso gli altri servizi indicando con quali certificato e chiave ci si vuole collegare ad essi (nel caso useremo sempre gli stessi). In particolare per le varie voci rispetto alla configurazione installata di default si dovranno inserire delle configurazioni del tipo:

<pre>
Client {
...
  TLS Enable = yes
  TLS Require = yes
  TLS CA Certificate File = /etc/ssl/certs/Truelite-cacert.pem
  TLS Certificate = /etc/ssl/certs/bacula.fi.trl-cert.pem
  TLS Key = /etc/ssl/private/bacula.fi.trl-key.pem
}
...
...
Storage {
...
  TLS Enable = yes
  TLS Require = yes
  TLS CA Certificate File = /etc/ssl/certs/Truelite-cacert.pem
  TLS Certificate = /etc/ssl/certs/bacula.fi.trl-cert.pem
  TLS Key = /etc/ssl/private/bacula.fi.trl-key.pem
}
</pre>
<pre>

<pre>
<pre>
Storage {
...
  TLS Enable = yes
  TLS Require = yes
  TLS CA Certificate File = /etc/ssl/certs/Truelite-cacert.pem
  TLS Certificate = /etc/ssl/certs/bacula.fi.trl-cert.pem
  TLS Key = /etc/ssl/private/bacula.fi.trl-key.pem
}
</pre>
per definire il certificato usato per le connessioni allo _Storage Daemon_, mentre per le connessioni effettuate verso l'esterno (in questo caso solo il _Director_ per rispondere ad interrogazioni dalla console) si dovrà mettere qualcosa del tipo:
<pre>
Director {
...
  TLS Enable = yes
  TLS Require = yes
  TLS CA Certificate File = /etc/ssl/certs/Truelite-cacert.pem
  TLS Certificate = /etc/ssl/certs/bacula.fi.trl-cert.pem
  TLS Key = /etc/ssl/private/bacula.fi.trl-key.pem
  TLS Verify Peer = yes
  TLS Allowed CN = "bacula.fi.trl" 
}
</pre>
<pre>

h2. Uso dell'autochanger

<pre>

<pre>

<pre>
<pre>
Device {
  Name = DDS-4                        #
  Media Type = DDS-4
  Archive Device = /dev/nst0
  [[AutomaticMount]] = yes;               # when device opened, read it
  [[AlwaysOpen]] = yes;
  [[RemovableMedia]] = yes;
  [[RandomAccess]] = no;
  Changer Command = "/etc/bacula/scripts/mtx-changer %c %o %S %a %d" 
  Changer Device = /dev/sg1
  [[AutoChanger]] = yes
  Alert Command = "sh -c 'tapeinfo -f %c |grep [[TapeAlert]]|cat'" 
}
</pre>
<pre>
<pre>
Storage {
  Name = File
  Address = bacula.truelite.it   # N.B. Use a fully qualified name here
  SDPort = 9103
  Password = "xxxxxxx" 
  Device = DDS-4
  Media Type = DDS-4
  Autochanger = yes
}
</pre>

<pre>
<pre>
*label slot=5
Using default Catalog name=MyCatalog DB=bacula
Automatically selected Storage: File
Enter new Volume name: Volume005
Automatically selected Pool: Default
Connecting to Storage daemon File at bacula.truelite.it:9103 ...
Sending label command for Volume "Volume005" Slot 5 ...
3301 Issuing autochanger "loaded drive 0" command.
3302 Autochanger "loaded drive 0", result is Slot 4.
3303 Issuing autochanger "unload slot 4, drive 0" command.
3304 Issuing autochanger "load slot 5, drive 0" command.
3305 Autochanger "load slot 5, drive 0", status is OK.
block.c:264 Volume data error at 0:0! Wanted ID: "BB02", got "". Buffer discarded.
3000 OK label. Volume=Volume005 Device=/dev/nst0
Catalog record for Volume "Volume005", Slot 5  successfully created.
Requesting to mount DDS-4 ...
3001 Device /dev/nst0 is mounted with Volume "Volume005" 
</pre>
da ripetere per tutti i nastri disponibili. 

Una volta inizializzati i vari nastri si può rendere noto al _Director_ la presenza dei vari nastri con il comando:
<pre>
update slots scan
</pre>

h2. Come gestire manualmente i nastri

Per la rimozione dei dati presenti sui nastri si devono seguire i seguenti passi:

<pre>
* inserire il nastro nel dispositivo, se si dispone dell'autochanger si può fare con:
<pre>
/etc/bacula/scripts/mtx-changer /dev/sg1 load N
</pre>
   dove N è il numero dello slot.
<pre>
<pre>

Se invece si è configurato correttamente il periodo di ritenzione dei dati, sarà _Bacula_ che provvederà a cercare il primo nastro libero, posto che il periodo non sia eccessivo e lo spazio disponibile esaurito, 

Nel qual caso si potrà ridurre il periodo di ritenzione con il comando:
<pre>
update volume=VolumeXXX [[VolRetention]]=ddd
</pre>
<pre>

h2. Cosa fare quando si esaurisce lo spazio disponibile

La maggiore forza di "Bacula":http://www.bacula.org/ è quella, una volta configurato correttamente, di essere in grado di gestire tutta la procedura di backup in maniera automatica. In genere questo funziona correttamente senza nessun intervento manuale. L'incidente più comune che può capitare è che si esaurisca lo spazio (disco o nastro) disponibile per i backup, nel qual caso il comportamento di "Bacula":http://www.bacula.org/ è quello di bloccare i backup rispettando i termini del periodo di ritenzione dei dati impostato. 

<pre>
<pre>
*list volumes
Using default Catalog name=MyCatalog DB=bacula
Pool: Default
+---------+------------+-----------+-------------+----------+--------------+---------+------+-----------+-----------+---------------------+
| [[MediaId]] | [[VolumeName]] | [[VolStatus]] | [[VolBytes]]    | [[VolFiles]] | [[VolRetention]] | Recycle | Slot | [[InChanger]] | [[MediaType]] | [[LastWritten]]         |
+---------+------------+-----------+-------------+----------+--------------+---------+------+-----------+-----------+---------------------+
| 1       | Volume0013 | Full      | 13156318147 | 0        | 1814400      | 1       | 0    | 0         | File      | 2006-08-06 02:53:16 |
| 2       | Volume0014 | Full      | 15260956061 | 0        | 1814400      | 1       | 0    | 0         | File      | 2006-08-15 01:12:48 |
| 3       | Volume0015 | Full      | 10288088510 | 0        | 1814400      | 1       | 0    | 0         | File      | 2006-07-30 02:03:26 |
| 4       | Volume0016 | Full      | 28805889791 | 0        | 1814400      | 1       | 0    | 0         | File      | 2006-08-06 01:26:31 |
| 5       | Volume0017 | Full      | 14412428094 | 0        | 1814400      | 1       | 0    | 0         | File      | 2006-07-29 01:27:50 |
+---------+------------+-----------+-------------+----------+--------------+---------+------+-----------+-----------+---------------------+
</pre>
dopo di che, considerato che i dati più vecchi si trovano sul Volume0017, se potrà cancellare il contenuto con:
<pre>
* purge volume=Volume0017

This command is can be DANGEROUS!!!

It purges (deletes) all Files from a Job,
[[JobId]], Client or Volume; or it purges (deletes)
all Jobs from a Client or Volume without regard
for retention periods. Normally you should use the
PRUNE command, which respects retention periods.

</pre>
(il comando impiegherà un certo tempo per eseguire l'operazione), a questo punto si potrà verificare che il volume è diventato disponibile con:
<pre>
*list volumes
Using default Catalog name=MyCatalog DB=bacula
Pool: Default

+---------+------------+-----------+-------------+----------+--------------+---------+------+-----------+-----------+---------------------+
| [[MediaId]] | [[VolumeName]] | [[VolStatus]] | [[VolBytes]]    | [[VolFiles]] | [[VolRetention]] | Recycle | Slot | [[InChanger]] | [[MediaType]] | [[LastWritten]]         |
+---------+------------+-----------+-------------+----------+--------------+---------+------+-----------+-----------+---------------------+
| 1       | Volume0013 | Full      | 13156318147 | 0        | 1814400      | 1       | 0    | 0         | File      | 2006-08-06 02:53:16 |
| 2       | Volume0014 | Full      | 15260956061 | 0        | 1814400      | 1       | 0    | 0         | File      | 2006-08-15 01:12:48 |
| 3       | Volume0015 | Full      | 10288088510 | 0        | 1814400      | 1       | 0    | 0         | File      | 2006-07-30 02:03:26 |
| 4       | Volume0016 | Full      | 28805889791 | 0        | 1814400      | 1       | 0    | 0         | File      | 2006-08-06 01:26:31 |
| 5       | Volume0017 | Purged    | 968063348   | 0        | 1814400      | 1       | 0    | 0         | File      | 2006-08-21 11:59:28 |
+---------+------------+-----------+-------------+----------+--------------+---------+------+-----------+-----------+---------------------+
</pre>

h2. Configurazione Webacula

"Webacula":http://webacula.sourceforge.net/ è una interfaccia di gestione via Web di Bacula, basata su PHP e Zendframework, pertanto per installarla si sono preventivamente installati i seguenti pacchetti con:
<pre>
apt-get install zendframework php5-gd
</pre>

<pre>

<pre>
<pre>
[general]
db.adapter = PDO_SQLITE 
db.config.dbname = /var/lib/bacula/bacula.db

def.timezone = "Europe/Rome" 
bacula.sudo = "" 
bacula.bconsole = "/usr/bin/bconsole" 

[webacula]
db.adapter = PDO_SQLITE
db.config.dbname = /var/www/webacula/webacula.db
</pre>

<pre>
chown www-data /var/www/webacula/webacula.db
usermod -aG bacula www-data
usermod -aG ssl-cert www-data
</pre>

<pre>
<pre>
a2enmod rewrite
</pre>
<pre>
<pre>
# [[RewriteLog]] "/var/log/httpd/rewrite.log" 
# [[RewriteLogLevel]] 3
# [[SetEnv]] APPLICATION_ENV development
[[SetEnv]] APPLICATION_ENV production

Alias /webacula  /var/www/webacula/html
<Directory /var/www/webacula/html>
   [[RewriteEngine]] On

   [[RewriteBase]]   /webacula
   [[RewriteCond]] %{REQUEST_FILENAME} -s [OR]
   [[RewriteCond]] %{REQUEST_FILENAME} -l [OR]
   [[RewriteCond]] %{REQUEST_FILENAME} -d
   [[RewriteRule]] ^.*$ - [NC,L]
   [[RewriteRule]] ^.*$ index.php [NC,L]

   php_flag magic_quotes_gpc off
   php_flag register_globals off

   Options Indexes [[FollowSymLinks]]
   [[AllowOverride]] All
   Order deny,allow

#   [[AuthType]] Basic
#   [[AuthName]] "Webacula" 
#   [[AuthUserFile]]       /etc/httpd/conf/webacula.users
#   Require valid-user
</Directory>

</pre>

Aggiornato da Simone Piccardi quasi 14 anni fa · 30 revisions