Buildroot:使用 zabbix-server 创建跨平台固件

Buildroot:使用 zabbix-server 创建跨平台固件

问题历史

小型公司一方面需要对其基础设施进行高质量的监控(特别是考虑到广泛的虚拟化),另一方面,他们在经济上很难购买新设备。 服务器/硬件问题也很常见:用户工作站旁边或小壁龛/壁橱中通常有 1-3 台塔式服务器。

使用现成的组件(分发)更容易,您只需上传到 microSD 卡并插入常见的单板计算机(beaglebone、raspberry pi 和 Orange pi 系列、asus Tinker board)即可。 此外,此类设备价格低廉,可以安装在任何地方。

制定问题

在许多方面,该项目发展成为一种实验室工作,具有应用结果的可能性。

选择 Zabbix 作为监控系统是因为它是一个功能强大、免费且文档齐全的系统。

硬件平台的问题变得尖锐起来,单独一台机器进行监控也不是一个很好的解决方案——要么购买新设备成本高昂,要么寻找旧设备+小公司服务器/服务器经常出现问题硬件。

使用 buildroot 构建系统可以让您创建专门的解决方案,可由对 Linux 操作系统了解最少的人员操作。 该系统对初学者很友好,但同时为经验丰富的开发人员提供了充足的定制机会。 它非常适合解决 IT 基础设施的廉价但功能齐全的监控问题,并且对操作人员的培训要求极低。

解决步骤

我们决定最初为 x86_64 创建固件以在 qemu 中运行,因为这是一种方便快捷的调试解决方案。 然后将其移植到arm单板计算机(我喜欢华硕tinker board)。

buildroot 被选为构建系统。 最初,它缺少zabbix包,所以必须移植,俄语语言环境存在问题,通过应用适当的补丁解决了这个问题(注意:在较新版本的buildroot中,不再需要这些补丁)。

移植zabbix包本身将在另一篇文章中描述。

由于一切都应该作为固件工作(不可更改的系统映像+可恢复的配置/数据库文件),因此有必要编写自己的 systemd 目标、服务和计时器(目标、服务、计时器)。

决定将媒体分为 2 个部分 - 一个包含系统文件的部分和一个包含可更改配置和 zabbix 数据库文件的部分。

解决与数据库相关的问题变得有点困难。 我不想把它直接放在媒体上。 同时,数据库的大小可能达到超过可能的 ramdisk 的大小。 因此,选择了一个折衷的解决方案:数据库位于 SD 卡的第二个分区(现代 SLC 卡的写入周期高达 30 次),但有一个设置允许使用外部介质(例如 USB-硬盘)。

温度监测是通过RODOS-5设备实现的。 当然,您可以直接使用Dallas 1820,但插入USB更快、更容易。

grub86 被选为 x64_2 的引导加载程序。 有必要编写一个最小的配置来启动它。

在qemu上调试后,移植到asustinkerboard上。 我的覆盖层结构最初旨在跨平台 - 分配特定于每个板的配置(板 defconfig、引导加载程序、使用系统分区生成映像)以及自定义文件系统/使用数据创建映像的最大一致性。 由于有这样的准备,移植进展得很快。

强烈建议阅读介绍性文章:
https://habr.com/ru/post/448638/
https://habr.com/ru/post/449348/

如何组装

项目存放在github上
克隆存储库后,获得以下文件结构:

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

buildroot-2019.05.tar.gz - 清理 buildroot 存档
覆盖是我的外部树目录。 这是使用 buildroot 构建固件所需的所有内容的存储位置。
README.md - 项目描述和英文手册。
run_me.sh 是一个准备构建系统的脚本。 从存档中扩展 buildroot,将覆盖层附加到其上(通过外部树机制),并允许您选择要组装的目标板

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

之后,只需进入 buildroot-2019.05 目录并运行 make 命令即可。
构建完成后,所有构建结果将位于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

所需文件:

  • sdcard.img - 用于在 SD 卡上记录的媒体映像(通过 wibdows 下的 dd 或 rufus)。
  • qemu.qcow2 - 在 qemu 中运行的媒体映像。
  • external.qcow2 - 数据库的外部媒体图像
  • Monitor-0.9-beta.tar.gz - 用于通过 Web 界面更新的存档

指南的生成

多次编写相同的指令是不值得的。 最合乎逻辑的做法是在 Markdown 中编写一次,然后将其转换为 PDF 以供下载,并转换为 html 以供 Web 界面使用。 这要归功于 pandoc 包。

同时,所有这些文件都需要在系统映像组装之前生成;那些构建后脚本已经毫无用处。 因此,生成是以手册包的形式完成的。 您可以查看覆盖/包装/手册。

Manuals.mk 文件(完成所有工作)

################################################################################
#
# 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

Linux 世界正在积极转向 systemd,我也必须这样做。
令人愉快的创新之一是计时器的存在。 一般来说,正在写一篇关于它们的单独文章(而且不仅仅是关于它们),但我会简要地告诉你。

有些操作必须定期执行。 我需要运行 logrotate 来清除 lighttpd 和 php-fpm 日志。 通常的做法是在 cron 中编写命令,但我决定使用 systemd 单调计时器。 因此 logrotate 以严格的时间间隔运行。

当然,可以创建在特定日期触发的计时器,但我不需要这个。
定时器示例:

  • 定时器文件
    
    [Unit]
    Description=RODOS temp daemon timer

[计时器] OnBootSec=1 分钟
OnUnitActiveSec=1 分钟

[安装] WantedBy=timers.target

- Файл сервиса, вызываемого таймером:
```bash
[Unit]
Description=RODOS temp daemon

[Service]
ExecStart=/usr/bin/rodos.sh

支持的板卡

华硕 Tinker Board 是一切都应该工作的主板。 被选为价格低廉且功能非常强大。

Beaglebone black 是第一个进行操作测试的板(在选择更强大的板期间)。

Qemu x86_64 - 用于调试开发。

它是如何工作

启动时,会进行两阶段设置恢复:

  • 运行 settings_restore 脚本(通过服务)。 它恢复基本的系统设置 - 时区、区域设置、网络设置等。
  • 运行准备脚本(通过服务) - 这里zabbix和数据库都已准备好,IP将输出到控制台。

第一次启动时,SD卡第二个分区的大小就确定了。 如果仍有未分配的空间,则介质将重新分区,数据部分将占用所有可用空间。 这样做是为了减小安装映像 (sdcard.img) 的大小。 此外,此时会创建 postgresql 工作目录。 这就是为什么新运营商的首次发射将比后续发射时间更长。

连接外部驱动器时,在启动时它会搜索空闲驱动器并将其格式化为带有外部标签的 ext4。

注意力! 连接外部驱动器(以及断开或更换)时,您需要进行备份并恢复设置!

RODOS 5 设备用于温度监控。制造商提供了与该设备配合使用的实用程序的源代码。 当系统打开时,rodos 计时器启动,每分钟运行一次该实用程序。 当前温度写入到文件/tmp/rodos_current_temp中,之后zabbix可以作为传感器来监控这个文件。

配置存储介质挂载在/data目录下。

启动系统并准备运行时,控制台中会显示以下消息:

System starting, please wait

准备工作完成后,将改为显示IP地址:

current ip 192.168.1.32
Ready to work

设置zabbix进行温度监控

要监控温度,只需执行 2 个步骤:

  • 将 RODOS 设备连接到 USB 端口
  • 在zabbix中创建数据项

打开zabbix网页界面:

  • 打开配置 → 主机部分
  • 单击我们的 zabbix 服务器行中的 Items
  • 单击创建项目

Buildroot:使用 zabbix-server 创建跨平台固件

输入以下数据:

  • name - 由您自行决定(例如 serverRoomTemp )
  • 类型-zabbix代理
  • 钥匙 - 罗多斯
  • 类型-数字
  • 单位-C
  • 历史存储周期——历史存储周期。 还剩10天
  • 趋势存储期——变化动态的存储期。 还剩下30天
  • 新应用程序 - 服务器室温

然后按添加按钮。
Buildroot:使用 zabbix-server 创建跨平台固件

通过网络界面管理设置

Web 界面是用 PHP 编写的。 主要有以下功能:

  • 查看设备状态
  • 更改网络设置
    Buildroot:使用 zabbix-server 创建跨平台固件
  • 更改用户密码
  • 时区选择
  • 备份/恢复/恢复出厂设置
  • 连接外部驱动器的能力
  • 系统更新
    Buildroot:使用 zabbix-server 创建跨平台固件

登录 Web 界面受密码保护。 起始页 - 手册。

Zabbix接口地址:${ip/dns}/zabbix
管理接口地址:${ip/dns}/manage
Buildroot:使用 zabbix-server 创建跨平台固件

在 qemu 中运行

qemu-system-x86_64 -smp 4 -m 4026M -enable-kvm -machine q35,accel=kvm -device intel-iommu -cpu host -net nic -netbridge,br=bridge0 -device virtio-scsi-pci,id= scsi0 -驱动文件=输出/图像/qemu.qcow2,格式=qcow2,aio=线程 -设备virtio-scsi-pci,id=scsi0 -驱动文件=输出/图像/external.qcow2,格式=qcow2,aio=线程

该命令将启动一个具有 4 核、2048 RAM、启用 KVM、bridge0 上的网卡和两个磁盘的系统:一个用于系统,一个外部用于 postgresql。

图像可以在 Virtualbox 中转换和运行:

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

然后将它们导入virtualbox并通过SATA连接。

结论

在这个过程中,我开始对制作一款即用型产品感兴趣——界面不是很漂亮(我不喜欢编写它们),但可以工作并且易于配置。

上次尝试在KVM中安装zabbix-appliance表明这一步是正确的(安装完成后系统无法启动)。 也许我做错了什么😉

物料

https://buildroot.org/

来源: habr.com

添加评论