Recuperação de desastres utilizando bls, bextract e arquivos bootstrap

Um dos erros mais comuns que ocorrem quando se está iniciando com o Bacula, é usar os arquivos padrões sem nenhuma modificação e colocar em produção, sem analisar ao menos os tempos de retenção, que são essenciais para o correto funcionamento do Bacula. O período de retenção dos arquivos e jobs (File Retention e Job Retention) servem para manter os dados no catálogo pelo máximo tempo possível. Por padrão, essas retenções tem um período de duração relativamente baixo.

Existe ainda a retenção dos volumes (Volume Retention), que neste caso é a retenção do volume físico, quanto tempo manter a informação no disco.

Então o ideal é configurar a retenção de arquivos e jobs com um tempo de retenção igual da Pool com maior tempo de retenção ou um valor bem alto, exemplo 365 dias. Quando algum volume for reciclado, automaticamente será apagado o dado físico, bem como as informações dos arquivos e jobs do catálogo.

Muitas vezes ocorre que o tempo de retenção estava errado e na hora de restaurar não é possível selecionar os arquivos, apenas restaurar o job inteiro, conforme abaixo:

*restore jobid=3439
You have selected the following JobId: 3439

Building directory tree for JobId(s) 3439 ...

For one or more of the JobIds selected, no files were found,
so file selection is not possible.
Most likely your retention policy pruned the files.

Do you want to restore all the files? (yes|no): yes

Bootstrap records written to /etc/bacula/working/bacula-dir.restore.1.bsr
Bootstrap records written to /etc/bacula/working/bacula-dir.restore.1.bsr

The Job will require the following (*=>InChanger):
 Volume(s) Storage(s) SD Device(s)
===========================================================================
 Volume-Diario-0020 StorageLocal1 DiscoLocal1

Nestes casos é interessante utilizar os arquivos Bootstrap que são criados automaticamente em cada restore.

Note que o Bacula criou um arquivo Booststrap em “/etc/bacula/working/bacula-dir.restore.1.bsr”. Este arquivo basicamente é um arquivo texto que contém informações dos jobs nos volumes, e com ele é possível listar os arquivos contidos no volumes para uma possível seleção de arquivos.

Conteúdo de um arquivo bootstrap

Storage="StorageLocal1"
Volume="Volume-Diario-0020"
MediaType="File"
Device="DiscoLocal1"
VolSessionId=3
VolSessionTime=1456008329
VolAddr=206-9999561
FileIndex=1-2126
Count=2126
Storage="StorageLocal1"

Então após tentar restaurar e não conseguir selecionar os arquivos, anote o nome e localização do arquivo bootstrap e cancele a restauração do mesmo. Saia do bconsole e vamos utilizar o utilitário bls para listar os arquivos do job.

Sintaxe básica do comando bls:

bls -c /caminho/para/bacula-sd.conf -b /caminho/para/arquivo/bootstrap.bsr Nome_do_Device_ou_Caminho_do_Device

Executando o bls:

bls -c /etc/bacula/bacula-sd.conf -b /etc/bacula/working/bacula-dir.restore.1.bsr /mnt/disco01

bls: butil.c:293-0 Using device: "/mnt/disco01" for reading.
20-Feb 21:09 bls JobId 0: Ready to read from volume "Volume-Diario-0020" on file device "DiscoLocal1" (/mnt/disco01).
20-Feb 21:09 bls JobId 0: Forward spacing Volume "Volume-Diario-0020" to file:block 0:206.
bls JobId 0: drwxr-xr-x 2 root root 4096 2016-02-10 10:53:37 /etc/vim/
bls JobId 0: -rw-r--r-- 1 root root 258 2016-02-10 11:16:21 /etc/hosts
bls JobId 0: -rw-r--r-- 1 root root 1208 2016-02-07 20:17:08 /etc/w3m/config
bls JobId 0: -rw-r--r-- 1 root root 44 2016-02-07 20:17:08 /etc/w3m/mailcap
bls JobId 0: drwxr-xr-x 2 root root 4096 2016-02-07 20:17:08 /etc/w3m/
bls JobId 0: -rw-r--r-- 1 root root 144 2016-02-07 20:20:05 /etc/kernel-img.conf
bls JobId 0: drwxr-xr-x 2 root root 4096 2016-02-07 19:53:40 /etc/rsyslog.d/
bls JobId 0: -rw-r--r-- 1 root root 177 2016-02-07 20:16:57 /etc/gss/mech.d/README
bls JobId 0: drwxr-xr-x 2 root root 4096 2016-02-07 20:16:57 /etc/gss/mech.d/
bls JobId 0: drwxr-xr-x 3 root root 4096 2016-02-07 20:15:26 /etc/gss/
bls JobId 0: drwxr-xr-x 6 root root 4096 2016-02-20 14:05:25 /usr/src/
20-Feb 21:09 bls JobId 0: End of Volume at file 0 on device "DiscoLocal1" (/mnt/disco01), Volume "Volume-Diario-0020"
20-Feb 21:09 bls JobId 0: End of all volumes.

O comando vai listar todos os arquivos/diretórios contidos no backup escolhido, sendo possível desta maneira, saber quais são os arquivos que podemos restaurar.

Ainda é possível usar o redirecionador “>” para direcionar a saída do comando para um arquivo texto e facilitar a seleção dos arquivos. Se a quantidade de arquivos é grande, sugiro usar esta opção.

bls -c /etc/bacula/bacula-sd.conf -b /etc/bacula/working/bacula-dir.restore.1.bsr /mnt/disco01 > /tmp/bls.txt

Após analisar o arquivo texto “/tmp/bls.txt” e verificar a relação de arquivos/diretórios, podemos criar um novo arquivo texto em “/tmp/arquivos.txt”, e incluir nele os arquivos/diretórios que gostaríamos de restaurar, lembrando que deve ser um por linha. Ainda é possível utilizar expressões regulares para filtrar os arquivos.

Exemplo de arquivo texto “/tmp/arquivos.txt”:

/etc/bacula/working/bacula.sql
/etc/bacula/*.conf
/etc/hosts
/etc/apache2/sites-available

Executamos agora o bls com a opção -i, passando o caminho do arquivo criado “/tmp/arquivos.txt”. Você vai notar que o bls vai listar apenas os arquivos/diretórios que você escolheu.

bls -c /etc/bacula/bacula-sd.conf -b /etc/bacula/working/bacula-dir.restore.1.bsr -i /tmp/arquivos.txt /mnt/disco01
bls: butil.c:293-0 Using device: "/mnt/disco01" for reading.
20-Feb 21:37 bls JobId 0: Ready to read from volume "Volume-Diario-0020" on file device "DiscoLocal1" (/mnt/disco01).
20-Feb 21:37 bls JobId 0: Forward spacing Volume "Volume-Diario-0020" to file:block 0:206.
bls JobId 0: -rw-r--r--   1 root     root             258 2016-02-10 11:16:21  /etc/hosts
bls JobId 0: -rw-r--r--   1 root     root            3492 2016-02-20 14:05:03  /etc/bacula/pools.conf
bls JobId 0: -rw-r--r--   1 root     root            1839 2016-02-10 11:17:48  /etc/bacula/schedules.conf
bls JobId 0: -rw-r--r--   1 root     root            1086 2016-02-10 11:17:48  /etc/bacula/filesets.conf
bls JobId 0: -rw-r--r--   1 root     root            2945 2016-02-20 14:01:42  /etc/bacula/clients-and-jobs/srv_bacula-fd.conf
bls JobId 0: -rw-r--r--   1 root     root            1348 2016-02-10 11:23:45  /etc/bacula/clients-and-jobs/srv_firewall-fd.conf
bls JobId 0: -rw-r-----   1 root     root             266 2016-02-10 11:32:24  /etc/bacula/bconsole.conf
bls JobId 0: -rw-r--r--   1 root     root            2118 2016-02-18 16:42:37  /etc/bacula/clients-and-jobs.conf
bls JobId 0: -rw-r-----   1 root     root            3699 2016-02-20 20:44:36  /etc/bacula/bacula-sd.conf
bls JobId 0: -rw-r--r--   1 root     root            1347 2016-02-10 11:27:36  /etc/bacula/messages.conf
bls JobId 0: -rwxr-x---   1 root     root            2323 2016-02-10 11:09:30  /etc/bacula/scripts/mtx-changer.conf
bls JobId 0: -rw-r-----   1 root     root            1575 2016-02-10 11:17:47  /etc/bacula/bacula-dir.conf
bls JobId 0: -rw-r--r--   1 root     root            1389 2016-02-10 11:17:48  /etc/bacula/counters.conf
bls JobId 0: -rw-r--r--   1 root     root             898 2016-02-20 20:47:14  /etc/bacula/storages.conf
bls JobId 0: -rw-r-----   1 root     root            1001 2016-02-10 11:17:47  /etc/bacula/bacula-fd.conf
bls JobId 0: -rw-r--r--   1 root     root            1328 2016-02-14 02:12:07  /etc/apache2/sites-available/000-default.conf
bls JobId 0: -rw-r--r--   1 root     root            6437 2016-02-07 20:16:59  /etc/apache2/sites-available/default-ssl.conf
bls JobId 0: drwxr-xr-x   2 root     root            4096 2016-02-14 02:12:07  /etc/apache2/sites-available/
20-Feb 21:37 bls JobId 0: End of Volume at file 0 on device "DiscoLocal1" (/mnt/disco01), Volume "Volume-Diario-0020"
20-Feb 21:37 bls JobId 0: End of all volumes.
18 files found.

Como o comando bls apenas lista os arquivos/diretórios, é preciso utilizar o comando bextract para restaurar os dados do backup.

Sintaxe básica do comando bextract:

bextract -c /caminho/para/bacula-sd.conf -b /caminho/para/arquivo/bootstrap.bsr  Nome_do_Device_ou_Caminho_do_Device   Caminho_Para_Restaurar_Arquivo

O diretório onde os dados serão restaurados, precisa existir, caso contrário ocorrerá um um erro.

bextract -c /etc/bacula/bacula-sd.conf -b  /etc/bacula/working/bacula-dir.restore.1.bsr -i /tmp/arquivos.txt /mnt/disco01 /tmp/bacula_restore
bextract: butil.c:293-0 Using device: "/mnt/disco01" for reading.
20-Feb 21:58 bextract JobId 0: Ready to read from volume "Volume-Diario-0020" on file device "DiscoLocal1" (/mnt/disco01).
20-Feb 21:58 bextract JobId 0: Forward spacing Volume "Volume-Diario-0020" to file:block 0:206.
bextract JobId 0: -rw-r--r--   1 root     root             258 2016-02-10 11:16:21  /tmp/bacula_restore/etc/hosts
bextract JobId 0: -rw-r--r--   1 root     root            3492 2016-02-20 14:05:03  /tmp/bacula_restore/etc/bacula/pools.conf
bextract JobId 0: -rw-r--r--   1 root     root            1839 2016-02-10 11:17:48  /tmp/bacula_restore/etc/bacula/schedules.conf
bextract JobId 0: -rw-r--r--   1 root     root            1086 2016-02-10 11:17:48  /tmp/bacula_restore/etc/bacula/filesets.conf
bextract JobId 0: -rw-r--r--   1 root     root            2945 2016-02-20 14:01:42  /tmp/bacula_restore/etc/bacula/clients-and-jobs/srv_bacula-fd.conf
bextract JobId 0: -rw-r--r--   1 root     root            1348 2016-02-10 11:23:45  /tmp/bacula_restore/etc/bacula/clients-and-jobs/srv_firewall-fd.conf
bextract JobId 0: -rw-r--r--   1 root     root             278 2016-02-10 11:17:48  /tmp/bacula_restore/etc/bacula/bconsole-wanderlei.conf
bextract JobId 0: -rw-r-----   1 root     root             266 2016-02-10 11:32:24  /tmp/bacula_restore/etc/bacula/bconsole.conf
bextract JobId 0: -rw-r--r--   1 root     root            2118 2016-02-18 16:42:37  /tmp/bacula_restore/etc/bacula/clients-and-jobs.conf
bextract JobId 0: -rw-r-----   1 root     root            3699 2016-02-20 20:44:36  /tmp/bacula_restore/etc/bacula/bacula-sd.conf
bextract JobId 0: -rw-r--r--   1 root     root            1347 2016-02-10 11:27:36  /tmp/bacula_restore/etc/bacula/messages.conf
bextract JobId 0: -rwxr-x---   1 root     root            2323 2016-02-10 11:09:30  /tmp/bacula_restore/etc/bacula/scripts/mtx-changer.conf
bextract JobId 0: -rw-r-----   1 root     root            1575 2016-02-10 11:17:47  /tmp/bacula_restore/etc/bacula/bacula-dir.conf
bextract JobId 0: -rw-r--r--   1 root     root            1389 2016-02-10 11:17:48  /tmp/bacula_restore/etc/bacula/counters.conf
bextract JobId 0: -rw-r--r--   1 root     root             898 2016-02-20 20:47:14  /tmp/bacula_restore/etc/bacula/storages.conf
bextract JobId 0: -rw-r-----   1 root     root            1001 2016-02-10 11:17:47  /tmp/bacula_restore/etc/bacula/bacula-fd.conf
bextract JobId 0: -rw-r--r--   1 root     root            1328 2016-02-14 02:12:07  /tmp/bacula_restore/etc/apache2/sites-available/000-default.conf
bextract JobId 0: -rw-r--r--   1 root     root            6437 2016-02-07 20:16:59  /tmp/bacula_restore/etc/apache2/sites-available/default-ssl.conf
bextract JobId 0: drwxr-xr-x   2 root     root            4096 2016-02-14 02:12:07  *none*
20-Feb 21:58 bextract JobId 0: End of Volume at file 0 on device "DiscoLocal1" (/mnt/disco01), Volume "Volume-Diario-0020"
20-Feb 21:58 bextract JobId 0: End of all volumes.
18 files restored.

Se tudo ocorreu bem, seus arquivos foram restaurados com sucesso!

FacebooktwitterlinkedinFacebooktwitterlinkedinby feather

3 comentários sobre “Recuperação de desastres utilizando bls, bextract e arquivos bootstrap

  1. Rodrigo Araujo disse:

    Boa tarde,

    Em um cenário de desastre, aonde meu bacula queimou porém tenho os volumes backapeados em um hd externo por exemplo, como consigo extrair os dados do volume nesse caso ?

    • Webmaster disse:

      Olá Rodrigo

      Basta instalar o Bacula em uma nova máquina para que você tenha acesso aos utilitários BLS e BEXTRACT e executar os comandos:
      bls /backup/disco01/Volume-Diario-0001
      bextract /backup/disco01/Volume-Diario-0001 /tmp

Os comentários estão fechados.