OpenEuler 20.03构建zabbix7.0 rpm包

一、说明

本文首发博客园。

为什么要自己构建?

由于centos从7版本之后改为stream,工作环境由centos转向OpenEuler。zabbix官网上有各大主流操作系统预编译的rpm包,但是Openeuler相对小众,自然没有制作好的包。即使是centos系统,7版本也过于陈旧了,从zabbix 6.0开始,centos 7已经不提供server的rpm包了,只剩下proxy和agent,到了7.0版本,连proxy都没有了。学会自己创建rpm包,以备操作系统环境发生改变是非常有必要的。

为什么不直接源代码编译

  1. 由于采用的是sever-proxy-agent的多层架构,server只有一台,但是proxy有几十台,agent更是上千,每一台都用源代码编译工作量大大增加。
  2. 源代码编译的软件,在一些例如配置文件、启停命令上与rpm版本有差异,如果混布增加了运维复杂度。

有没有预编译好的rpm包

在OpenEuler的官方社区的软件中心,有社区成员自行构建的rpm包,可以尝试找找有无符合自己要求的版本。

二、准备工作

2.1 添加repo源

如果OpenEuler缺少默认的repo源,需要自己添加

在/etc/yum.repos.d/openEuler_x86_64.repo中添加如下内容:

复制代码
[OS]
name=openEuler-$releasever - OS
baseurl=https://repo.openeuler.openatom.cn/openEuler-20.03-LTS-SP4/OS/$basearch/
enabled=1
gpgcheck=1
gpgkey=https://repo.openeuler.openatom.cn/openEuler-20.03-LTS-SP4/OS/$basearch/RPM-GPG-KEY-openEuler

另外再添加everything的源,可以提供更多的包。

复制代码
dnf config-manager --add-repo https://repo.openeuler.org/openEuler-20.03-LTS/everything/x86_64

使用dnf clean all && dnf makecache命令更新。

2.2 准备构建rpm包环境

之前的文章里已经介绍了构建rpm包的基本方法,这里不再赘述。root用户下运行命令如下:

复制代码
dnf install -y rpm-build
dnf install -y rpmdevtools
rpmdev-setuptree

下载srpm包( http://repo.zabbix.com/zabbix/7.0/rhel/8/SRPMS/zabbix-7.0.23-release1.el8.src.rpm ) ,这里以rhel8版本的srpm文件为例:

复制代码
rpm -ivh zabbix-7.0.23-release1.el8.src.rpm

此时,在/root/rpmbuild目录下的SOURCES目录下会产生源代码压缩包、补丁和配置文件,SPECS目录会产生spec文件。但是此spec文件是Centos8版本的,与OpenEuler不完全契合,需要修改一下。

三、安装依赖包

3.1 BuildRequires要求的依赖包

依赖包 要求的版本 dnf安装的版本
make
mariadb-connector-c-devel
postgresql-devel >= 12.0 10.5
sqlite-devel
net-snmp-devel
openldap-devel
unixODBC-devel
curl-devel >= 7.13.1 7.66.0
OpenIPMI-devel >= 2 2.0.29
libssh-devel >= 0.9.0 0.9.4
java-devel(java-1.8.0-openjdk-devel) >= 1.6.0 1.8.0.392.b08
libxml2-devel
libevent-devel
pcre2-devel
openssl-devel >= 1.0.1 1.1.1f
systemd
policycoreutils-devel
selinux-policy-devel
c-ares-devel >= 1.19.0 1.16.1
安装全部依赖:
复制代码
dnf install -y make mariadb-connector-c-devel postgresql-devel sqlite-devel net-snmp-devel openldap-devel unixODBC-devel curl-devel OpenIPMI-devel libssh-devel java-1.8.0-openjdk-devel libxml2-devel libevent-devel pcre2-devel openssl-devel systemd policycoreutils-devel selinux-policy-devel c-ares-devel

3.2 golang配置

版本更新

zabbix agent2和web_service是使用GO语言编写的,并且使用的语法对版本还有要求,OpenEuler 20.03默认repo源的版本为1.15,需要安装一个较新版本的。

首先下载golang的压缩包并解压

复制代码
tar -C /usr/local -xzf go1.24.8.linux-amd64.tar.gz

配置PATH变量并生效

复制代码
tee /etc/profile.d/go.sh <<EOL
export GO_HOME=/usr/local/go
export PATH=\$PATH:\$GO_HOME/bin
EOL
source /etc/profile

使用go version命令查看更新是否生效

配置代理

在构建中,会自动下载go的工具链(toolchain),但是由于网络缘故,无法访问默认的代理地址(proxy.golang.org),导致构建失败

使用命令go env -w GOPROXY=https://goproxy.cn,direct,改用七牛云的goproxy

使用命令go env GOPROXY测试是否生效。

四、修改spec文件

修改好的spec文件已随文章上传。

4.1 删除%{rhel}和%{?amzn}宏

%{rhel}和%{?amzn}两个宏分别标识了redhat和amazon系linux的大版本号,用于构建时一些配置方式的选择。由于这两个宏在OpenEuler中为空,在spec文件中会被全局定义为0,直接使用会影响构建,需要全部进行处理。

与OpenEuler相对接近的是Centos8,把%{?rhel}当做"8"处理,%{?amzn}直接删除。

示例1

复制代码
%if ( 0%{?rhel} >= 7 && 0%{?amzn} == 0 ) || 0%{?amzn} >= 2023
%{!?build_agent2: %global build_agent2 1}
%endif

由于08 >= 7,修改为

复制代码
%{!?build_agent2: %global build_agent2 1}

示例2

复制代码
%if 0%{rhel} >= 9 || 0%{?amzn} >= 2023
BuildRequires: selinux-policy-devel
BuildRequires: c-ares-devel >= 1.19.0
%endif

由于不满足 08 >= 9 ,直接删除

4.2 修改BuildRequires版本要求

官网repo源的postgresql-devel版本不达标,直接进行构建会报错。

postgresql官网没有OpenEuler的预编译rpm包,想要满足要求必须自行从源代码进行编译。

本文仅为演示,将postgresql-devel >= 12.0修改为postgresql-devel

五、构建

使用rpmbuild -bb zabbix.spec命令进行构建,需要比较长的时间。

完成后在/root/rpmbuild/RPMS目录下就会生成编译好的rpm包。

相关推荐
落羽的落羽2 小时前
【Linux系统】磁盘ext文件系统与软硬链接
linux·运维·服务器·数据库·c++·人工智能·机器学习
Codefengfeng2 小时前
Kali-linux中安装与使用Stegsolve
linux·运维·服务器
何中应4 小时前
如何在 Linux 系统中设置系统时间
linux·运维·服务器
予枫的编程笔记4 小时前
【Docker高级篇】吃透Linux底层:Namespace做隔离,Cgroups控资源,UnionFS搭存储
linux·人工智能·namespace·cgroups·unionfs·linux底层原理·容器核心技术
济6174 小时前
ARM Linux 驱动开发篇---Linux 设备树简介-- Ubuntu20.04
linux·arm开发·嵌入式linux驱动开发
leblancAndSherry5 小时前
阿里云轻量/ECS 实战:K3s + Helm + cert-manager + 云效 Codeup 全链路 CI/CD 落地(记录自用)
linux·运维·阿里云·ci/cd·kubernetes·云计算
czxyvX5 小时前
008-Linux命令行参数和环境变量
linux
何中应5 小时前
虚拟机内的系统无法解析外网域名
linux·运维·后端
红叶尽染寂绀蓝5 小时前
已解决:同一ip下,Mac和Windows同时用vscode连接某个Linux远程服务器后,Mac再次连接时无法正确打开远程文件夹,由于转发设置导致
linux·服务器·windows·vscode·tcp/ip·macos