Instalação do Bacula Com Multiplos Discos em Mesmo Pool

Olá a todos, mais uma vez eu postando um tutorial por aqui, desculpem desde já se ele não ficar em um nível tão bom quanto esperam, mais espero que ajude, pois não existe nenhuma documentação em português de como implementar isso, então vamos para onde interessa.

Ambiente

* Servidor com 3 discos (em Raid 1) para armazenamento dos Backups

  •  /dev/md6 – 900GB
  • = /dev/md7 – 1TB
  • = /dev/md8 – 3TB

 Lógica do Bacula

O Bacula é estruturado da seguinte forma:

  •  Device (disco ou partição do sistema), pode ser dividido em 1 ou mais Storages;
  • Storage  (local de armazenamento de arquivos backupeados) e os arquivos backupeados em si ficam em arquivos chamados Pools;
  • Pools são a aglomeração de Volumes (arquivos de um mesmo tamanho para que são usados para armazenamento dos Backups)
  • Volume é apenas 1 dos arquivos do Pool que são usados para facilitar a pesquisa e indexação dos dados, além de facilitar o armazenamento dos mesmos em medias como CDs, DVDs, Fitas, etc;

Problema encontrado na configuração Básica do Bacula

O Bacula trabalha da seguinte forma, cada agendamento de backup, deve ser feito em um determinado Storage e cada Storage fica limitado a apenas um Device, ou seja, como nosso ambiente é muito grande, montariamos uma partição LVM unindo os 3 Volumes RAID em epenas 1 disco virtual ou então teriamos que dar um jeito do Bacula utilizar multiplos Devices (Discos) como se fosse um único Storage e para isso é necessário fazer uso do Pool Scratch e de links simbólicos.

Instalação do Bacula

Instale o Bacula da forma que achar melhor, seja compilando os pacotes manualmente ou com eu fiz, instalando a partir dos repositórios:

# apt-get install mysql-serve mysql-client bacula-director-mysql bacula-sd-mysql bacula-fd bacula-console bacula-common-mysql

Após instalar, coloque uma senha de root no mysql e quando for requisitada a senha durante a instalação do bacula, digite-a para que o bacula crie um usuário com o nome bacula e a senha que você definir no passo seguinte.

Configuração

Inicialmente é necessário que os discos que se deseja utilizar para backup sejam montados durante o boot no servidor, para que os demais passos para a configuração do backup em múltiplos discos funcionem normalmente.

Após verificar que os discos estão montando corretamente, você deverá definir qual o tamanho que deseja que seus volumes possuam (esse valor pode variar dependendo do que deseja fazer com ele, por exemplo 4GB se desejar armazenar uma cópia em DVD, no meu caso coloquei de 10GB). Após definir esse valor, vá no seu servidor onde o Bacula está instalado e dê o comando df -h, para definir quantos Volumes você poderá manter em cada disco, no meu exemplo:

[email protected]:/home/tacio# df -h
Sist. Arq.      Tam     Usad     Dispon.   Uso%    Montado em
/dev/md6      824G    25G       758G        4%      /DISCK900GB
/dev/md7      917G    200M     871G        1%      /DISCK1TB
/dev/md8      2,7T     203M       2,6T        1%     /DISCK3TB

ou seja no meu caso no DISK900GB poderei ter até 82 Volumes de 10GB, pois 10GB * 82GB = 820GB. No DISK1TB teremos 87 Volumes e no DISK3TB teremos 260 Volumes.

Após definir a quantidade de Volumes que cada disco possui, devemos criar com o comando touch em cada disco (inicialmente vazio) essa mesma quantidade de arquivos.

Para criação deste arquivo pode-se usar um shell script mais ou menos como o seguinte:

#!/bin/bash
for i in {1..82}
do
touch /DISK900GB/bacula0$i
done
for i in {1..87}
do
touch /DISK1TB/bacula1$i
done
for i in {1..260}
do
touch /DISK3TB/bacula3$i
done

Após criar a quantidade de volumes para cada disco, você deverá criar um diretório, /bacula (ou outro de sua preferência), e criar links simbólicos para cada um dos arquivos para o diretório /bacula.

#!/bin/bash
cd /DISCK900GB
for i in `ls b*`
do
ln -s $i /bacula/$i
done
cd /DISCK1TB
for i in `ls b*`
do
ln -s $i /bacula/$i
done
cd /DISCK3TB
for i in `ls b*`
do
ln -s $i /bacula/$i
done
chown bacula.bacula -R /DISCK900GB
chown bacula.bacula -R /DISCK1TB
chown bacula.bacula -R /DISCK3TB
chmod -R 777 /DISCK900GB
chmod -R 777 /DISCK1TB
chmod -R 777 /DISCK3TB

Após criar todos os arquivos simbólicos corretamente, você terá um resultado parecido com o seguinte:
[email protected]:/home/tacio# ls -l /bacula/
total 0
lrwxrwxr-x 1 bacula bacula 23 Out 21 13:55 bacula00001 -> /DISCK900GB/bacula00001
lrwxrwxr-x 1 bacula bacula 23 Out 21 15:19 bacula00002 -> /DISCK900GB/bacula00002
lrwxrwxr-x 1 bacula bacula 23 Out 21 15:19 bacula00003 -> /DISCK900GB/bacula00003
lrwxrwxr-x 1 bacula bacula 23 Out 21 15:19 bacula00004 -> /DISCK900GB/bacula00004

Após os links serem criados, vamos agora para os arquivos de configuração. Primeiramente abra o arquivo /etc/bacula/bacula-sd.conf

Procure a sessão FileStorage e altere para ficar desta forma:

Device {
Name = FileStorage
Media Type = File
Archive Device = /bacula # Diretório onde você colocou os links simbólicos
LabelMedia = no; # Não criar o volume automaticamente
Random Access = Yes;
AutomaticMount = yes; # when device opened, read it
RemovableMedia = no;
AlwaysOpen = no;
Maximum Changer Wait = 1800;
}

Salve o arquivo e abra o /etc/bacula/bacula-dir.conf
No Director comente a linha DirAddress como abaixo caso queira acessar o console de recuperação ou outra ferramenta como o Bacula Administrator Tools, de outra maquina da rede:

Director { # Definição do diretor, nome que fica em TODOS os clientes
Name = bacula-dir
DIRport = 9101 # Porta padrão do diretor
QueryFile = “/etc/bacula/scripts/query.sql”
WorkingDirectory = “/var/lib/bacula”
PidDirectory = “/var/run/bacula”
Maximum Concurrent Jobs = 1
Password = “SENHA” # Senha alterada por segurança
Messages = Daemon
# DirAddress = 127.0.0.1
}

Na parte do Storage, altere para ficar mais ou menos desta forma:

Storage {
Name = File
Address = IP ou DNS do Servidor Bacula
SDPort = 9103
Password = “SENHA DO bacula-sd.conf”
Device = FileStorage # O Device onde estão os links simbolicos
Media Type = File
}

Pool {
Name = Default
Pool Type = Backup
Recycle = yes # Após acabar todos os Volumes ele apaga os antigos
AutoPrune = yes # Prune expired volumes
Volume Retention = 1 months # Tempo que os backups devem ser mantidos
Maximum Volume Bytes = 10GB # Tamanho de cada volume definido anteriormente
Maximum Volumes = 500 # Quantidade máxima de Volumes
Recycle Pool = Scratch # De quem ele irá pegar os Volumes (depois explico)
}
Pool {
Name = Scratch
Pool Type = Backup
Recycle = yes
Recycle Pool = Scratch
ActionOnPurge = Truncate
Maximum Volume Bytes = 10GB # Recomendo que coloque a mesma quantidade do Default
Maximum Volumes = 500 # Recomendo que coloque a mesma quantidade do Default
}

Agora vou explicar o porque de 2 Pools distintos. No caso o Pool Scratch do Bacula é um pool especial, ele foi criado para que outros Pools possam pegar arquivos emprestados sempre que necessários. Agora após fazermos a configuração, vamos adicionar os Volumes criados no pool Scratch com outro script:

#!/bin/bash
cd /bacula
for i in `ls b*`
do
echo label volume=$i pool=Scratch storage=File | bconsole
done
echo “list volumes pool=Scratch” | bconsole

Após rodar o script acima algo como isso aparecerá na tela:

Connecting to Director localhost:9101
1000 OK: bacula-dir Version: VERSAO
Enter a period to cancel a command.
list volumes pool=Scratch
Automatically selected Catalog: MyCatalog
Using Catalog “MyCatalog”
+———+————-+———–+———+———-+———-+————–+———+——+———–+———–+———————+
| MediaId | VolumeName | VolStatus | Enabled | VolBytes | VolFiles | VolRetention | Recycle | Slot | InChanger | MediaType | LastWritten |
+———+————-+———–+———+———-+———-+————–+———+——+———–+———–+———————+
| 1 | bacula00001 | Append | 1 | 198 | 0 | 31,536,000 | 1 | 0 | 0 | File | 0000-00-00 00:00:00 |
| 2 | bacula00002 | Append | 1 | 198 | 0 | 31,536,000 | 1 | 0 | 0 | File | 0000-00-00 00:00:00 |
| 3 | bacula00003 | Append | 1 | 198 | 0 | 31,536,000 | 1 | 0 | 0 | File | 0000-00-00 00:00:00 |

Caso apareça isso, está pronta a configuração, em TODOS os jobs que for agendar no Bacula, você deverá selecionar o Pool padrão como Default e Storage como File.

Job {
Name = BackupServidorX
Type = Backup
Level = Incremental
Client = xserver-fd
FileSet = BackupServidorX
Schedule = WeeklyCycle
Storage = File
Pool = Default
Messages = Standard
}

Agora é só adicionar os clientes, agendamentos, etc e pronto.