Buildroot: Criando firmware de plataforma cruzada com o zabbix-server


Histórico de tarefas


As pequenas empresas, por um lado, precisam de um monitoramento de alta qualidade de sua infraestrutura (especialmente à luz da virtualização generalizada); por outro, é financeiramente difícil para elas adquirir novos equipamentos. Além disso, geralmente há problemas com o servidor / hardware: geralmente existem 1-3 servidores em torre próximos às estações de trabalho dos usuários ou em um pequeno nicho / armário.


É mais fácil usar uma montagem pronta (distribuição), que é suficiente para carregar em um cartão microSD e inseri-la em um computador de placa única comum (famílias de beaglebone, raspberry pi e orange pi, asus tinker). Além disso, esse equipamento é barato e pode ser instalado em qualquer lugar.


Declaração do problema


De várias maneiras, o projeto se desenvolveu como uma espécie de trabalho de laboratório, com a possibilidade de aplicar os resultados.


O Zabbix foi escolhido como o sistema de monitoramento, pois é um sistema poderoso, gratuito e bem documentado.


A questão surgiu com a plataforma de hardware: colocar uma máquina separada sob monitoramento também não é uma boa solução - ou é caro comprar novos equipamentos ou procurar um antigo + nas pequenas empresas, há problemas frequentes com o servidor / hardware.


O uso do sistema buildroot build permite criar soluções especializadas que podem ser operadas pela equipe com conhecimento mínimo da família de sistemas operacionais Linux. Esse sistema é amigável para iniciantes, mas, ao mesmo tempo, oferece amplas oportunidades de personalização nas mãos de um desenvolvedor experiente. É perfeito para resolver a tarefa de um monitoramento não-caro, mas completo, da infraestrutura de TI, que é minimamente exigente no treinamento de seu pessoal operacional.


Etapas da solução


Decidiu-se criar inicialmente o firmware para o x86_64 ser executado no qemu, pois essa é uma solução rápida e conveniente para a depuração. Em seguida, mova para um braço de computador de placa única (gostei da placa de asus tinker).


A buildroot foi escolhida como o sistema de construção. Inicialmente, faltava o pacote zabbix, então tive que portá-lo.Existem problemas com a localidade russa que foram resolvidos aplicando os patches apropriados (nota: nas versões mais recentes do buildroot, esses patches não são mais necessários).


A portabilidade do próprio pacote zabbix será descrita em um artigo separado.


Como tudo deve funcionar como firmware (imagem do sistema inalterada + arquivos de configuração / banco de dados recuperáveis), foi necessário gravar os alvos, serviços e timers do systemd (target, service, timer).


Decidiu-se dividir a mídia em duas seções - uma seção com arquivos do sistema e uma seção com configurações mutáveis ​​e arquivos de banco de dados zabbix.


Acabou sendo um pouco mais difícil resolver problemas associados ao banco de dados. Eu não queria colocá-lo diretamente na mídia. Ao mesmo tempo, o tamanho da base pode atingir um tamanho que excede o tamanho de um possível disco ram. Portanto, foi escolhida uma solução de compromisso: o banco de dados está localizado na segunda seção do cartão sd (os cartões SLC modernos têm até 30.000 ciclos de gravação), mas há uma configuração que permite o uso de mídia externa (por exemplo, usb-hdd).


O monitoramento da temperatura foi implementado através do dispositivo RODOS-5. Obviamente, você pode usar o dallas 1820 diretamente, mas foi mais rápido e fácil conectar um USB.


O Grub2 foi escolhido como o carregador de inicialização do x86_64. Levei para escrever uma configuração mínima para executar.


Após a depuração no qemu, foi realizada a portabilidade para a placa de asus tinker. Na estrutura da minha sobreposição, foi inicialmente apresentada a plataforma cruzada - a seleção de configurações específicas para cada placa (placas defconfig, carregador de inicialização, geração de imagens com uma partição do sistema) e a uniformidade máxima no ajuste do sistema de arquivos / criação de uma imagem com dados. Devido a essa preparação, a portabilidade foi rápida.


É altamente recomendável que você leia os artigos introdutórios:
https://habr.com/en/post/448638/
https://habr.com/en/post/449348/


Como montar


O projeto é armazenado no github
Após a clonagem do repositório, a seguinte estrutura de arquivo é obtida:


[alexey@comp monitor]$ ls -1 buildroot-2019.05.tar.gz overlay README.md run_me.sh 

buildroot-2019.05.tar.gz - arquivo de buildroot limpo
overlay é meu diretório com árvore externa. Ele contém tudo o que você precisa para construir o firmware usando o buildroot
README.md - descrição e orientação do projeto em inglês.
run_me.sh é um script que prepara o sistema de construção. Expande a buildroot do arquivo morto, anexa sobreposição a ele (através do mecanismo de árvore externa) e permite selecionar a placa de destino para montagem


 [0] my_asus_tinker_defconfig [1] my_beaglebone_defconfig [2] x86_64_defconfig Select defconfig, press A for abort. Default [0] 

Depois disso, basta ir para o diretório buildroot-2019.05 e executar o comando make.
Após a montagem, todos os resultados da montagem estarão no diretório output / images:


 [alexey@comp buildroot-2019.05]$ ls -1 output/images/ boot.img boot.vfat bzImage data data.img external.img external.qcow2 grub-eltorito.img grub.img intel-ucode monitor-0.9-beta.tar.gz qemu.qcow2 rootfs.cpio sdcard.img sys update 

Arquivos necessários:


  • sdcard.img - a imagem da mídia para gravar no cartão sd (via dd ou rufus sob wibdows).
  • qemu.qcow2 - imagem de mídia a ser executada no qemu.
  • external.qcow2 - imagem de mídia externa para o banco de dados
  • monitor-0.9-beta.tar.gz - arquivo para atualização via interface da web

Geração manual


Não vale a pena escrever as mesmas instruções várias vezes. E é mais lógico escrever uma vez na remarcação e depois convertê-lo em PDF para download e html para a interface da web. Isso é possível graças ao pacote pandoc.


Ao mesmo tempo, você precisa gerar todos esses arquivos antes da montagem da imagem do sistema; esses scripts pós-compilação já são inúteis. Portanto, a geração é feita na forma de pacote de manuais. Você pode vê-lo em sobreposição / pacote / manuais.


O arquivo manuals.mk (que faz todo o trabalho)


 ################################################################################ # # manuals # ################################################################################ MANUALS_VERSION:= 1.0.0 MANUALS_SITE:= ${BR2_EXTERNAL_monitorOverlay_PATH}/package/manuals MANUALS_SITE_METHOD:=local define MANUALS_BUILD_CMDS pandoc -s -o ${TARGET_DIR}/var/www/manual_en.pdf ${BR2_EXTERNAL_monitorOverlay_PATH}/../README.md pandoc -f markdown -t html -o ${TARGET_DIR}/var/www/manual_en.html ${BR2_EXTERNAL_monitorOverlay_PATH}/../README.md endef $(eval $(generic-package)) 

systemd


O mundo do Linux está mudando ativamente para o systemd, e eu também precisei fazê-lo.
Das boas inovações - a presença de temporizadores. Em geral, um artigo separado é escrito sobre eles (e não apenas sobre eles), mas vou lhe dizer brevemente.


Existem ações que devem ser executadas periodicamente. Eu precisava executar o logrotate para limpar os logs lighttpd e php-fpm. Seria mais comum escrever comandos no cron, mas decidi usar o temporizador monótono do systemd. Assim, o logrotate inicia em um intervalo de tempo estrito.


Claro, existe a possibilidade de criar temporizadores que funcionam em determinadas datas, mas eu não precisava disso.
Exemplo de temporizador:


  • Arquivo de temporizador
     [Unit] Description=RODOS temp daemon timer 

[Temporizador]
OnBootSec = 1min
OnUnitActiveSec = 1min


[Instalar]
WantedBy = timers.target


 -  ,  : ```bash [Unit] Description=RODOS temp daemon [Service] ExecStart=/usr/bin/rodos.sh 

Placas Suportadas


Asus tinker board - a placa principal em que tudo deve funcionar. Selecionado como barato e muito poderoso.


O Beaglebone black é o primeiro painel em que o trabalho foi testado (durante a seleção de um painel mais poderoso).


Qemu x86_64 - usado para desenvolver depuração.


Como isso funciona


Na inicialização, ocorre uma recuperação de duas etapas das configurações:


  • executando o script settings_restore (por meio do serviço). Restaura as configurações básicas do sistema - fuso horário, localidade, configurações de rede etc.
  • executando o script de preparação (através do serviço) - aqui o zabbix é preparado, o banco de dados, o IP é exibido no console.

Na primeira partida, é determinado o tamanho da segunda seção do cartão SD. Se ainda houver espaço não alocado - a mídia é reparticionada, a seção de dados ocupa todo o espaço livre. Isso é feito para reduzir o tamanho da imagem de instalação (sdcard.img). Além disso, o diretório de trabalho postgresql é criado neste momento. É por isso que o primeiro lançamento com um novo meio será mais longo que os seguintes.


Quando você conecta uma unidade externa, no momento da inicialização, ela procura uma unidade gratuita e a formata em ext4 com a etiqueta externa.


Atenção! Ao conectar uma unidade externa (além de desconectá-la ou substituí-la), é necessário fazer backup e restaurar as configurações!


Para monitorar a temperatura, é utilizado o dispositivo RODOS 5. O fabricante fornece as fontes de sua utilidade para trabalhar com o dispositivo. Quando o sistema é ligado, o rodos timer inicia, que inicia esse utilitário uma vez por minuto. A temperatura atual é gravada no arquivo / tmp / rodos_current_temp, após o qual o zabbix pode monitorar esse arquivo como um sensor.


A mídia de armazenamento para a configuração é montada no diretório / data.


Quando você inicia o sistema e o prepara para o trabalho, uma mensagem aparece no console:


 System starting, please wait 

Após a conclusão do trabalho preparatório, ele será alterado para exibir o endereço IP:


 current ip 192.168.1.32 Ready to work 

Configurando o zabbix para monitoramento de temperatura


Para monitorar a temperatura, basta seguir 2 etapas:


  • conecte o dispositivo RODOS à porta usb
  • criar item de dados no zabbix

Abra a interface da web do zabbix:


  • Abra a seção Configuração → Hosts
  • Clique em Itens na linha do nosso servidor zabbix
  • Clique em Criar item


Digite os seguintes dados:


  • nome - a seu critério (por exemplo, serverRoomTemp)
  • Tipo - agente zabbix
  • Key - rodos
  • Tipo - numérico
  • Unidades - C
  • Período de armazenamento do histórico - o termo do histórico. deixou 10 dias
  • Período de armazenamento de tendências - período de armazenamento da dinâmica de alterações. Deixou 30 dias
  • Nova aplicação - temperatura da sala do servidor

E pressione o botão ADICIONAR.


Gerenciamento via Web


A interface da web é escrita em php. Existem funções principais:


  • ver status do dispositivo
  • alterar configurações de rede
  • alterar senha do usuário
  • seleção de fuso horário
  • backup / restauração / redefinição das configurações de fábrica
  • a capacidade de conectar uma unidade externa
  • Atualização do sistema

O login na interface da web é protegido por senha. Página inicial - manual.


Endereço da interface do Zabbix: \ $ {ip / dns} / zabbix
Endereço da interface de gerenciamento: \ $ {ip / dns} / manage


Executar no qemu


qemu-system-x86_64 -smp 4 -m 4026M -enable-kvm -machine q35, accel = serviço-kvm intel-iommu -cpu host -net nic -net bridge, br = bridge0 -device virtio-scsi-pci, id = scsi0 -drive arquivo = saída / imagens / qemu.qcow2, formato = qcow2, aio = threads - dispositivo virtio-scsi-pci, id = scsi0 -drive arquivo = saída / imagens / external.qcow2, formato = qcow2, aio = threads


Este comando iniciará um sistema com 4 núcleos, 2048 de RAM ativado pelo KVM, uma placa de rede no bridge0 e dois discos: para o sistema e externo para o postgresql.


As imagens podem ser convertidas e executadas no Virtualbox:


 qemu-img convert -f qcow2 qemu.qcow2 -O vdi qcow2.vdi qemu-img convert -f qcow2 external.qcow2 -O vdi external.vdi 

Em seguida, importe-os para o virtualbox e conecte-se via sata.


Conclusão


No processo, fiquei interessado em preparar um produto para o trabalho - com uma interface não muito agradável (não gosto de escrevê-los), mas funcionando e fácil de configurar.


A última tentativa de instalar o zabbix-appliance no KVM mostrou a correção dessa etapa (o sistema não inicia após a conclusão da instalação). Talvez eu esteja fazendo algo errado;)




Materiais


https://buildroot.org/

Source: https://habr.com/ru/post/pt477008/


All Articles