====== Instalando e configurando Servidor Bacula com robô de backup(Tape Library TS3100) ====== Para a documentação proposta iremos utilizar o ambiente abaixo. {{ :infra-estrutura:linux:bacula:bacularobo.png?direct&600 |}} =====Instalando a placa HBA===== Faremos uso da seguinte placa HBA. {{ :infra-estrutura:linux:bacula:whatsapp_image_2019-02-21_at_13.42.16.jpeg?direct&400 |}} {{ :infra-estrutura:linux:bacula:whatsapp_image_2019-02-21_at_13.41.38.jpeg?direct&400 |}} Após instalar a placa no Linux Ubuntu 18.04 LTS verificamos se a mesma foi reconhecida. lspci -nn |egrep -i "fibre|hba" {{ :infra-estrutura:linux:bacula:lspciplacahba.png?direct&600 |}} Visualizando detalhes da placa e driver. {{ :infra-estrutura:linux:bacula:lspciplacahba01.png?direct&600 |}} Verifique o modulo do kernel {{ :infra-estrutura:linux:bacula:lspciplacahba02.png?direct&400 |}} Verificar o fabricante {{ :infra-estrutura:linux:bacula:lspciplacahba03.png?direct&400 |}} Verificar a descrição {{ :infra-estrutura:linux:bacula:lspciplacahba04.png?direct&400 |}} Verificar o nome do módulo do kernel {{ :infra-estrutura:linux:bacula:lspciplacahba05.png?direct&400 |}} Verificar a licença do módulo {{ :infra-estrutura:linux:bacula:lspciplacahba06.png?direct&400 |}} Verifica a versão do módulo {{ :infra-estrutura:linux:bacula:lspciplacahba07.png?direct&400 |}} Verificar as portas sfp da placa HBA. {{ :infra-estrutura:linux:bacula:lspciplacahba08.png?direct&600 |}} Verificar o status da porta {{ :infra-estrutura:linux:bacula:lspciplacahba09.png?direct&400 |}} Verificar o número WWN {{ :infra-estrutura:linux:bacula:lspciplacahba10.png?direct&400 |}} Verificar nomes WWN {{ :infra-estrutura:linux:bacula:lspciplacahba11.png?direct&600 |}} Verificar status porta. {{ :infra-estrutura:linux:bacula:lspciplacahba12.png?direct&400 |}} Verificar mais detalhes {{ :infra-estrutura:linux:bacula:lspciplacahba13.png?direct&400 |}} Verificando modelo da placa {{ :infra-estrutura:linux:bacula:lspciplacahba14.png?direct&400 |}} Verificando descrição da placa {{ :infra-estrutura:linux:bacula:lspciplacahba15.png?direct&400 |}} Verificar revisão, versão do firmware, versão da rom {{ :infra-estrutura:linux:bacula:lspciplacahba16.png?direct&600 |}} Verificar tudo :P {{ :infra-estrutura:linux:bacula:lspciplacahba17.png?direct&400 |}} =====Identificar os dispositivos criados no /dev para a HBA===== Para descobrir quais os dispositivos foram criado no /dev utilizando o comando dmesg. {{ :infra-estrutura:linux:bacula:lspciplacahba18.png?direct&400 |}} Para o nosso exemplo temos três dispositivos. * sg0 - Disco rigido / WDC WD800JD-75MS * sg1 - CDROM / HL-DT-ST DVD+-RW GH50N * sg2 - Emulex LPe12000 PCIe Fibre Channel Adapter * sg3 - Magazine(seria a "caixa" que guarda as fitas de backup) Porém não temos a unidade de fita, para isso vamos verificar via comando **lsscsi**. {{ :infra-estrutura:linux:bacula:lspciplacahba19.png?direct&400 |}} Neste comando verificamos o disco e a unidade de CD. Porém verificamos o driver(ou leitor) das fitas que esta como /dev/st0. Como mencionado anteriormente o robô de backup ou tape library consiste de um hardware que possue um braço mecânico que pega as fitas e coloca em um drive de fita(ou leitor de fita). O dispositivo /dev/st0 e o leitor de fita e o "braço" seria o /dev/sg3. Vamos verificar se os mesmos estão funcionando. Verificando o magazine, visualizando os 24 slots. {{ :infra-estrutura:linux:bacula:lspciplacahba20.png?direct&400 |}} verificando a unidade de fita. {{ :infra-estrutura:linux:bacula:lspciplacahba21.png?direct&400 |}} Para o comando **mtx status** funcionar ele usa o dispositivo /dev/changer. Geralmente ele não existe ele é um link simbólico para o dispositivo da magazine. Sendo assim vamos criar este link simbólico. {{ :infra-estrutura:linux:bacula:lspciplacahba22.png?direct&400 |}} =====As fitas de backup e como gerar as etiquetas barcode===== Iremos utilizar as fitas de backup do tipo LTO-5, o robô que possuímos suporta vários tipos de fita para realizar o backup. {{ :infra-estrutura:linux:bacula:whatsapp_image_2019-02-21_at_19.52.18.jpeg?direct&400 |}} Cada fita irá ser identificada por um código de barras(barcode), podemos gerar esses códigos de barras de várias formas. Eu utilizo o seguinte site. [[https://php.kelvin.nu/software/barcode/]] Acessando o site teremos a seguinte tela. {{ :infra-estrutura:linux:bacula:barcodegeneratorbacula.png?direct&400 |}} No exemplo temos o tipo de fita(Tape Type) no caso esta selecionado LTO-3 selecione conforme sua necessidade no meu caso é LTO-5. O **L3** é uma abreviação para LTO-3. O campo prefixo fica a seu critério também geralmente utiliza-se 2 caracter o recomendado apesar de permitir 6 caracter. O **starting number** o númeo de cada fita começando no caso em 0001. Abaixo tempos um exemplo de barcodes gerado. {{ :infra-estrutura:linux:bacula:barcodegeneratorbacula01.png?direct&600 |}} Para colar os barcode tem que ser igual ao formato da imagem. A fita tem que ser colocada na mesa com a engrenagem para baixo e as letras para baixo. {{ :infra-estrutura:linux:bacula:whatsapp_image_2019-02-21_at_13.09.32.jpeg?direct&400 |}} ** Para não deixar dúvida a imagem abaixo esta incorreto.** {{ :infra-estrutura:linux:bacula:whatsapp_image_2019-02-21_at_13.12.42.jpeg?direct&400 |}} Logo depois de colar os barcode em todas as fitas e necessário somente colocar as fitas no magazine(que é um slot para colocar as fitas e o braço do robô pegar fita na hora do backup). Tome cuidado na hora de colar os barcodes para ele não desprender e travar o leitor de fita, sempre abra o magazine e verifique se as etiquetas estão bem fixas. Eu utilizei a seguinte cola. {{ :infra-estrutura:linux:bacula:9884142_1gg.jpg?direct&400 |}} =====Trabalhando com as fitas e o magazine de fitas===== Vamos trabalhar um pouco com o magazine e entender como o Bacula irá funcionar. Primeiro vamos visualizar o magazine. {{ :infra-estrutura:linux:bacula:baculamagazine01.png?direct&400 |}} Veja que temos 3 fitas no magazine repare que as mesmas ja são reconhecidas pelo robô pelo código de barras. São eles: * VolumeTag=BL0001L5 * VolumeTag=BL0002L5 * VolumeTag=BL0001L5 Vamos verificar o driver(leitor de fita). {{ :infra-estrutura:linux:bacula:baculamagazine02.png?direct&400 |}} Vamos colocar no drive(leitor de fita) a fita VolumeTag=BL0002L5 que esta no slot 16 conforme imagem o drive(leitor de fita) esta no índice 0. {{ :infra-estrutura:linux:bacula:baculamagazine03.png?direct&400 |}} Vamos visualizar o se a fita foi para o drive. {{ :infra-estrutura:linux:bacula:baculamagazine04.png?direct&400 |}} Com a fita no drive podemos realizar as operações básicas, tais como rebobinar, apagar, etc. Vamos verificar se a fita esta no drive realmente(obs: lembre-se que anteriormente constatamos que o dispositivo do leitor é o /dev/st0). {{ :infra-estrutura:linux:bacula:baculamagazine05.png?direct&400 |}} Repare que na imagem anterior o status estava **OPEN** agora esta **ONLINE**. Vamos agora por segurança rebobinar a fita e apagar(formatar) a mesma {{ :infra-estrutura:linux:bacula:baculamagazine06.png?direct&600 |}} Agora vamos realizar um backup na fita do meu diretório pessoal **/home/ricardobarbosa**. Repare que informamos o drive da fita(/dev/st0) e não o drive do robô(/dev/sg3). {{ :infra-estrutura:linux:bacula:baculamagazine07.png?direct&600 |}} Agora vamos visualizar os arquivos que estão na fita. {{ :infra-estrutura:linux:bacula:baculamagazine08.png?direct&600 |}} Agora para deixarmos nosso teste completo vamos restaurar em outra pasta. Primeiro visualizamos o diretório corrente, depois criamos um diretório para restauração chamado **restauracao** dentro do /home/ricardobarbosa e depois por segurança rebobinamos a fita e entramos no diretório restauracao realizamos a restauração dos arquivos e visualizamos os arquivos restaurados. {{ :infra-estrutura:linux:bacula:baculamagazine09.png?direct&600 |}} Alguns comando úteis. Para retornar a fita do drive para o magazine no slot número 4 que esta vago: {{ :infra-estrutura:linux:bacula:baculamagazine10.png?direct&600 |}} Repare que na imagem anterior o slot 4 estava como "vago(Empty)" depois do comando ficou com o status "(Storage Element 4:Full :VolumeTag=BL0002L5)" {{ :infra-estrutura:linux:bacula:baculamagazine11.png?direct&600 |}} Você também pode transferir a fita de um lugar do magazine para outro. Exemplo: Transferir do slot 4 para o 8: {{ :infra-estrutura:linux:bacula:baculamagazine12.png?direct&600 |}} ===== Configurando o bacula ===== Antes de configurar o bacula propriamente dito preciso reconhecer e criar os volumes vamos as configurações do bacula. **bacula-dir.conf** Autochanger { Name = ibm-tape-library # nome do robô o parâmetro "Autochanger" significa o robô Address = 192.168.0.11 # endereço ip do servidor bacula onde está instalada a HBA SDPort = 9103 # porta de conexão Password = "XXXXXXX" # senha Device = Autochanger # Nome do robô definido no arquivo bacula-sd.conf(tem que ser igual) Media Type = LTO-5 # Nome do leitor da fita que esta definido no arquivo bacula-sd.conf tem que ser igual. Maximum Concurrent Jobs = 10 Auto Changer = yes } Além das configurações padrões precisamos definir o robô dentro do bacula-sd.conf **bacula-sd.conf** Autochanger { Name = Autochanger # nome do robô Device = TS3100Driver # nome da fita ou driver de fita(e o nome que esta no bacula-sd.conf no parametro Device) Changer Command = "/etc/bacula/scripts/mtx-changer %c %o %S %a %d" Changer Device = /dev/sg3 } # unidade de fita(driver - leitor da fita) Device { Name = TS3100Driver # UTL3580-HH5 - Nome do dispositivo que será utilizado na definição do robô autochanger. Drive Index = 0 Media Type = LTO-5 # nome que será utilizado no bacula-dir.conf Archive Device = /dev/st0 AutomaticMount = yes; AlwaysOpen = yes; RemovableMedia = yes; RandomAccess = no; AutoChanger = yes } Configurado o bacula vamos criar um job para backup. Criaremos um job para realizar o backup do nosso servidor zabbix. Job { Name = "armazenar-zabbix-completo" Type = Backup Level = Full Client = zabbix-fd FileSet = "zabbix-fileset" Storage = ibm-tape-library Messages = Standard Pool = zabbix-pool Write Bootstrap = "/var/lib/bacula/zabbix.bsr" } FileSet { Name = "zabbix-fileset" Include { Options { signature=MD5 compression=GZIP } File = /etc/network/interfaces File = /etc/bacula/bacula-fd.conf File = /etc/zabbix/zabbix_server.conf File = /etc/zabbix/zabbix_agentd.conf File = /etc/apache2/conf-available/zabbix.conf File = /usr/share/zabbix } Exclude { } } Client { Name = zabbix-fd Address = 192.168.0.22 Catalog = MyCatalog Password = "XXXXXXXXXX" File Retention = 60d Job Retention = 60d AutoPrune = yes } Pool { Name = zabbix-pool Pool Type = Backup Recycle = yes Purge Oldest Volume = Yes Maximum Volume Bytes = 5G } Somente coloquei as informações que considero importante para realizar um exemplo de backup do arquivo bacula-dir.conf. Com isso precisamos criar os volumes no bacula. Realizamos isso com o comando **update** dentro da console de comandos do bacula(comando bconsole). {{ :infra-estrutura:linux:bacula:baculamagazine13.png?direct&600 |}} Repare que pela imagem ele encontrou os volumes no robô(os códigos de barra) porém não encontrou no catalogo do bacula. Para isso precisamos criar os volumes(comando label na console do bacula) e vincular ao pool do zabbix(zabbix-pool). {{ :infra-estrutura:linux:bacula:baculamagazine14.png?direct&600 |}} Repare que obtemos uma mensagem de erro 3929 Unable to open device ""TS3100Driver" (/dev/st0)": ERR=tape_dev.c:170 Unable to open device "TS3100Driver" (/dev/st0): ERR=No medium found Diz que não encontrou a mídia(fita) no driver(leitor da fita). Ainda ele dá uma dica para não esquecer de montar o drive. Do not forget to mount the drive!!! Aqui para colocar a fita podemos utilizar o comando mtx como já fizemos até aqui ou podemos utilizar um script criado pela equipe de desenvolvedores do Bacula. Qual a vantagem? ao meu ver é que com o mtx o link simbólico do dispositivo /dev/changer deve estar criado e vinculado ao dispositivo correto do robô, porém o script do Bacula você necessita informar o dispositivo evitando assim algum erro. Este script geralmente fica dentro do diretório de configuração do Bacula, o nome é mtx-changer. Formato de execução mtx-changer Exemplo do comando root@tesla:~# /etc/bacula/scripts/mtx-changer /dev/sg3 load 1 /dev/st0 0 * Dispositivo robô: /dev/sg3, caso você possua o link simbólico poderia ser utilizar /dev/changer. * Comando: load carregar a fita no driver * Slot da fita: Qual slot se encontra a fita no caso no slot 1 * Dispositivo da fita: O dispositivo vinculado ao leitor de fita /dev/st0 * Índice da fita: Seria o índice na fita no magazine, no caso sempre é 0. Vamos utilizar o mtx-changer. Vamos visualizar como esta disposto o magazine. {{ :infra-estrutura:linux:bacula:baculamagazine15.png?direct&600 |}} Vamos jogar a fita do slot 1 para o driver 0(repare que o slot 0 Element 0 está vazio Empty). O comando foi executado com sucesso. {{ :infra-estrutura:linux:bacula:baculamagazine16.png?direct&600 |}} Vamos visualizar se a fita VolumeTag=BL0001L5 está no slot 0. {{ :infra-estrutura:linux:bacula:baculamagazine17.png?direct&600 |}} Ótimo tudo certo. Agora vamos criar os volumes na console do Bacula através do comando **Label**. {{ :infra-estrutura:linux:bacula:baculamagazine18.png?direct&600 |}} Ótimo o volume foi criado dentro da fita. Vamos visulizar o volume através do comando **list volume**. {{ :infra-estrutura:linux:bacula:baculamagazine19.png?direct&600 |}} Tudo beleza. Agora vamos rodar o backup manual na console do Bacula. Antes vamos verificar se o agente do Bacula está sendo executado no servidor zabbix. {{ :infra-estrutura:linux:bacula:baculamagazine20.png?direct&600 |}} Tudo certo vamos ao backup. {{ :infra-estrutura:linux:bacula:baculamagazine21.png?direct&600 |}} Vamos verificar as mensagens da console. {{ :infra-estrutura:linux:bacula:baculamagazine22.png?direct&600 |}} Veja que o backup esta rodando {{ :infra-estrutura:linux:bacula:baculamagazine23.png?direct&600 |}} Veja que o backup foi completado {{ :infra-estrutura:linux:bacula:baculamagazine24.png?direct&600 |}} Veja que verificando o backup está ok. {{ :infra-estrutura:linux:bacula:baculamagazine25.png?direct&600 |}} Agora vamos restaurar. Utilizaremos o seguinte job Job { Name = "restaurar-zabbix" Type = Restore Client = zabbix-fd FileSet = "zabbix-fileset" Where = "/restore/zabbix" Storage = ibm-tape-library Messages = Standard Pool = zabbix-pool Bootstrap = "/var/lib/bacula/zabbix.bsr" } Vamos acessar o servidor zabbix e verificar o diretório de restauração. {{ :infra-estrutura:linux:bacula:baculamagazine26.png?direct&600 |}} Vamos a restauração {{ :infra-estrutura:linux:bacula:baculamagazine27.png?direct&600 |}} {{ :infra-estrutura:linux:bacula:baculamagazine287.png?direct&600 |}} Vamos verificar as mensagens do prompt do bacula. {{ :infra-estrutura:linux:bacula:baculamagazine29.png?direct&600 |}} Tudo ok, vamos ao servidor zabbix verificar se o backup foi restaurado no diretório /restore {{ :infra-estrutura:linux:bacula:baculamagazine30.png?direct&600 |}} Bom agora para e necessário criar os agendamentos, etc e automatizar o backup. Esta implentação foi realizado no Laboratório de inteligência artificial da UFMS BATLAB. Quero agradecer ao Paulo Silvano por me ajudar a instalação da placa HBA e entender o conceito do robô e ao Luís Ferrari por me ajudar na montagem etiquetação das fitas e tudo mais. Obrigado pessoal :) Qualquer dúvida ricardobarbosams@yahoo.com.br