说实话,我一开始接到这个任务的时候是有点懵的。一台刚拿到手的银河麒麟V10服务器,业务部门要求尽快接入Zabbix监控,结果环境是纯内网,别说yum源了,连个外网IP都不给。刚开始想着装个agent能有多难,无非就是rpm包丢进去、依赖装一下、配置文件改一改,结果真上手才发现,离线环境下的依赖链能让人怀疑人生。最后老老实实走了一遍“有网机器下载源码包、U盘拷进内网、离线源码编译安装zabbix-agent”的流程,折腾了一天多才把问题彻底跑通。
这篇文章我把整个过程和踩过的坑完整写下来,适合遇到类似场景的人直接照做:麒麟Linux(尤其是银河麒麟V10)、完全离线的内网环境、需要手动编译安装zabbix-agent。不管是用传统zabbix_agentd还是新版的zabbix_agent2,思路和流程都通用。
1. 为什么离线源码编译是麒麟系统上的“必修课”
1.1 三种安装方式对比:rpm、内网Yum源、源码编译
在麒麟Linux上装zabbix-agent,理论上不止源码编译这一条路,但结合“离线”这个硬约束,可选方案其实非常有限。
| 安装方式 | 优点 | 离线环境下的痛点 | 结论 |
|---|---|---|---|
| rpm包直接安装 | 命令简单、安装快 | 依赖关系复杂,pcre、openssl、libstdc++等依赖版本稍有不对就装不上 | 不推荐 |
| 搭建内网Yum源 | 安装方便,依赖自动解析 | 需要一台内网仓库服务器,还要把麒麟对应的软件仓库完整同步下来,准备工作量大 | 可行但过重 |
| 离线源码编译 | 依赖可控、组件可裁剪、编译产物可复用 | 对操作者要求高,需要熟悉configure参数和编译流程 | 最推荐 |
你可能会说,rpm包加上依赖一个个找不就行了?理论上可以,实际操作下来非常痛苦。麒麟系统的rpm包来源分散,有些是系统光盘自带的,有些是Kylin Soft仓库里的,离线情况下很难精确匹配版本。有时候为了装一个agent,要手动装五六个依赖,每个依赖又有自己的依赖,依赖套娃直接劝退。
还有一条路是找一台能联网的同版本麒麟机器,用yumdownloader把agent和依赖全部下载成rpm,再拷进内网安装。这个方法在“能联网的机器和离线机器系统版本完全一致”时很好用,但如果版本稍微有点差异,依然会踩依赖坑。
源码编译在这种场景下反而是最省心的:只要基础编译工具链(gcc、make)可用,再把zabbix编译所需要的依赖库准备好,就能编出完全匹配当前系统环境的agent。编译过程还会自动检测依赖,缺什么会明确告诉你,不会像rpm那样装到一半才报错。
1.2 动手前先摸清三个底:系统版本、CPU架构、编译工具链
第一次接触麒麟系统的人,最容易犯的错就是“拿到机器就开干”,结果连系统是x86架构还是ARM架构都没搞清楚,下载的依赖包全是错的。我建议编译前先把下面三件事摸清楚。
第一,系统版本。执行cat /etc/os-release,看NAME和VERSION字段。目前常见的麒麟系统有“银河麒麟服务器操作系统V10”和“中标麒麟”等,不同版本的操作习惯可能有差别。这里有一个很现实的点:银河麒麟V10是基于开源Linux生态做的国产化系统,软件包管理用的是yum/dnf,但部分软件仓库源需要授权或内网环境才能用,离线场景下基本等于没有源。
第二,CPU架构。执行uname -m,输出x86_64就按Intel/AMD 64位架构处理,输出aarch64就要按下载ARM64架构的依赖包。这个直接决定后续下载的rpm包或者编译参数,千万别拿错。
第三,编译工具链。执行gcc --version和make --version,确认系统里有没有编译器。很多最小化安装的麒麟服务器默认不带gcc,如果连编译器都没有,后面所有步骤都白搭。
cat /etc/os-release uname -m gcc --version make --version我这次碰到的机器就是典型情况:银河麒麟V10 SP1,x86_64架构,gcc和make都没有。只能先从系统安装光盘里把对应的gcc、make等rpm包找出来,拷进内网装上。所以环境检查这一步千万别跳过,宁可多花十分钟确认,也别编到一半才发现工具链缺失。
2. 离线资源准备:一次搞定源码包与依赖库
2.1 源码包的选择与校验
zabbix-agent的编译,前提是拿到zabbix的源代码。这里需要注意,zabbix官网提供的是完整源码包,里面包含了server、proxy、agent、web等所有组件的源代码,编译时只需要按需裁剪即可。
版本选择上,我建议直接用LTS版本,比如6.0系列。LTS版本维护周期长,bug修复及时,内网环境图的就是稳定,没必要追新版本。在能联网的机器上打开zabbix官网,找到对应版本的源代码下载链接,用wget拉下来就行。
wget https://cdn.zabbix.com/zabbix/sources/stable/6.0/zabbix-6.0.28.tar.gz sha256sum zabbix-6.0.28.tar.gz下载完之后一定要做校验。离线环境里拷来拷去,文件损坏的概率比想象中高。把官方页面上的SHA256哈希值和你算出来的对比一下,不一致就重新下载,不要抱侥幸心理。
zabbix源码包体积不大,大概三四十兆,U盘、内网共享、堡垒机文件传输都能带进去,不存在“文件太大传不了”的问题。
2.2 依赖库的准备:pcre系列和基础开发库
zabbix-agent编译过程中,最核心的外部依赖是pcre库(正则表达式库)。不同版本的zabbix对pcre的依赖不太一样,有的用传统的libpcre,有的用新版libpcre2。在configure阶段如果找不到对应的库,会直接报错退出。
我这次使用的是zabbix 6.0系列,编译时检测的是libpcre2。依赖库的准备有两条路,我强烈建议第一条:
第一条路,在有网机器上用yumdownloader把pcre2和pcre2-devel的rpm包下载下来,然后拷进内网用rpm -ivh安装。注意-devel包必须装,光有运行库没有头文件,源码编译照样找不到。
# 在有网的、同版本麒麟机器上执行 yum install -y yum-utils yumdownloader pcre2 pcre2-devel # 生成两个rpm文件,一起拷进内网 rpm -ivh pcre2-*.rpm pcre2-devel-*.rpm第二条路,下载pcre2源码包,也在内网编译安装。这条路比较麻烦,因为pcre2本身编译也需要工具链,相当于多了一次源码编译,能不用就不用。
除了pcre系列,如果configure时要启用TLS加密传输,还需要openssl-devel。为了减少依赖,我在这次编译里直接禁用了TLS,后面会讲具体参数。如果你后续有配置zabbix加密传输的需求,建议先把openssl-devel准备好,否则老老实实禁用TLS,安全需求不是特别高的话影响不大。
2.3 拷贝进内网与目录规划
所有源码包和rpm依赖包准备好之后,要有一个统一的目录规划。我习惯在内网机器上建一个/opt/offline_pkgs目录,专门放离线安装用的所有文件,避免东西拷进去之后散落得到处都是。
mkdir -p /opt/offline_pkgs # 把以下文件放进来 # /opt/offline_pkgs/zabbix-6.0.28.tar.gz # /opt/offline_pkgs/pcre2-*.rpm # /opt/offline_pkgs/pcre2-devel-*.rpm # /opt/offline_pkgs/gcc-*.rpm(如果系统没有gcc) # /opt/offline_pkgs/make-*.rpm(如果系统没有make)拷贝方式根据实际条件来,U盘是最直接的,内网共享和堡垒机批量下发也可以。拷完文件之后建议再跑一遍md5sum或者sha256sum,确认和源文件一致。这一步很多人会忽略,但真的出过“编译半天发现是源码包损坏”的悲催案例。
3. 麒麟linux源码编译安装zabbix-agent全流程
3.1 准备编译用户、解压源码
编译安装这种事,虽然是运维人员的日常工作,但还是建议养成好习惯:服务跑在独立用户下,不要用root直接跑。zabbix源码包里也自带了创建用户的提示,一般生产环境都是创建zabbix用户来运行agent进程。
groupadd --system zabbix useradd --system -g zabbix -s /sbin/nologin zabbix cd /usr/local/src tar -zxf /opt/offline_pkgs/zabbix-6.0.28.tar.gz cd zabbix-6.0.28这里我把源码解压到/usr/local/src,这是Linux下源码包的标准位置。zabbix用户用/sbin/nologin作为登录shell,表示这个用户不能交互登录,只是用来跑服务,安全上更稳。
3.2 configure配置参数详解:组件裁剪与依赖控制
zabbix源码目录下的configure脚本是整个编译过程的“总指挥”。它的作用是根据你给出的参数,检查系统环境、检测依赖库、生成Makefile文件。离线环境下configure参数怎么给,直接决定了编译会不会半路卡死。
我这次用的configure命令如下:
./configure \ --prefix=/usr/local/zabbix \ --enable-agent \ --disable-server \ --disable-proxy \ --disable-java \ --without-libpcre2 \ --with-libpcre注意:不同版本的zabbix对pcre库的默认偏好不同,我这里写的是我实际使用的组合。具体以你当前版本的configure --help | grep pcre输出为准。如果系统里只有pcre2-devel,那就用--with-libpcre2并去掉--without-libpcre2。
各个参数的意义,我拆开讲一下:
| 参数 | 作用 |
|---|---|
| --prefix=/usr/local/zabbix | 指定安装目录,编译产物统一放到这个目录下,方便管理 |
| --enable-agent | 编译传统zabbix_agentd客户端 |
| --disable-server | 不编译zabbix server服务端 |
| --disable-proxy | 不编译zabbix proxy代理端 |
| --disable-java | 不编译Java网关相关组件 |
| --without-libpcre2 | 明确不使用pcre2库,改走libpcre这条依赖线 |
这里最核心的思路就是“裁剪”:zabbix源码包是全家桶,server、proxy、agent都在里面,但我们只需要agent,就把不需要的组件全部disable掉。这样有两个好处,一是编译时间大大缩短,二是依赖库也变少,离线环境下依赖越少,越不容易出错。
configure执行成功之后,屏幕末尾会显示configuration summary,列出编译哪些组件、使用哪些库。确认一下agent那栏是yes,其他不需要的组件是no,然后就可以进入下一步了。
3.3 make编译、make install安装与产物校验
configure通过后,当前目录下已经生成了Makefile,接下来就是真正的编译环节。
make -j4-j4表示用4个线程并行编译。具体开几个线程,看机器的CPU核数和内存大小。如果机器只有2核2G内存,老老实实make -j2或者直接make,开太多线程反而会因为内存不足导致编译进程被杀。编译过程中屏幕上会有大量输出,看着像是乱码,其实是gcc在逐个编译源文件,不用管它,只要没有出现error并退出就行。
编译完成后执行安装:
make install安装过程很快,就是把编译好的二进制文件、头文件、配置文件模板复制到指定目录。安装完成后,检查一下关键文件:
ls -l /usr/local/zabbix/sbin/ /usr/local/zabbix/sbin/zabbix_agentd --version看到zabbix_agentd的版本号输出,说明编译安装已经成功了。如果这里提示找不到共享库,一般是pcre相关的库路径问题,稍后在第4章的排错部分细说。
3.4 配置文件zabbix_agentd.conf修改
安装完成后,zabbix_agentd还不会自动跑,因为还没配置它该往哪个server上报数据。先把配置目录和日志目录创建出来,这些目录默认不会自动生成。
mkdir -p /etc/zabbix /var/log/zabbix cp /usr/local/zabbix/etc/zabbix_agentd.conf /etc/zabbix/ chown -R zabbix:zabbix /var/log/zabbix /etc/zabbix接着修改zabbix_agentd.conf,重点就是以下几项:
Server=192.168.1.10 ServerActive=192.168.1.10 Hostname=Kylin-Agent-01 LogFile=/var/log/zabbix/zabbix_agentd.log LogFileSize=10 EnableRemoteCommands=0 UnsafeUserParameters=0| 配置项 | 说明 |
|---|---|
| Server | Zabbix Server的IP,表示允许谁来采集本机数据 |
| ServerActive | Zabbix Server的IP,主动上报模式时连接的目标地址 |
| Hostname | 本机在Zabbix里的主机名,建议和系统hostname保持一致 |
| LogFile | 日志文件路径 |
| EnableRemoteCommands | 是否允许远程命令执行,生产环境必须设为0 |
| UnsafeUserParameters | 是否允许不安全的用户参数,保持0即可 |
这里特别提醒一下Hostname这个字段。Zabbix Server上添加主机时填的主机名,必须和agent配置里的Hostname一致,不然Server端会一直显示“已连接”或“不可用”。我见过很多人服务器上agent起来了,10050端口也监听了,但Server就是看不到数据,最后排查半天才发现是Hostname写得不一致。
3.5 注册systemd服务、启动与验证
为了能让agent开机自启,并支持systemctl管理,需要给它写一个systemd服务单元文件。/etc/systemd/system/zabbix-agent.service内容如下:
[Unit] Description=Zabbix Agent After=network.target [Service] User=zabbix Group=zabbix ExecStart=/usr/local/zabbix/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf Restart=on-failure KillMode=process [Install] WantedBy=multi-user.target写完后执行:
systemctl daemon-reload systemctl enable zabbix-agent systemctl start zabbix-agent systemctl status zabbix-agent看到active (running)状态就说明服务启动成功了。再用ss命令确认一下监听端口:
ss -lntup | grep 10050zabbix-agent默认监听10050端口,看到LISTEN状态就说明一切正常。
3.6 防火墙放行
麒麟服务器版默认开启firewalld防火墙,如果不放行10050端口,Zabbix Server根本连不过来。执行下面两条命令:
firewall-cmd --permanent --add-port=10050/tcp firewall-cmd --reload如果内网环境对来源IP有严格控制,可以只放行Zabbix Server的IP:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.10" port port="10050" protocol="tcp" accept' firewall-cmd --reload到此,离线的zabbix-agent就装完跑起来了。整个流程走通之后,你会发现:离线环境下的源码编译,麻烦的不是编译本身,而是准备工作做没做扎实。
4. 常见问题与排错实录
4.1 configure报错:找不到gcc或make
如果你在configure阶段看到类似这样的错误:
configure: error: C compiler cannot create executables或者干脆提示gcc、make命令不存在,说明系统里没有安装编译工具链。麒麟服务器最小化安装时,gcc默认是不装的。
解决办法是先把工具链补齐。离线环境下,优先从系统安装光盘里找rpm包,挂载光盘后进入Packages目录,安装gcc、make、gcc-c++这几个包。如果你在一台能联网的麒麟机器上,也可以用yum install --downloadonly把相关rpm下载下来再拷进内网。
# 挂载麒麟系统安装光盘 mount /dev/cdrom /mnt cd /mnt/Packages rpm -ivh gcc-*.rpm make-*.rpm gcc-c++-*.rpm这里有个经验:光盘里rpm包版本可能偏旧,但只要能用就行,编译zabbix-agent对gcc版本要求不算苛刻。
4.2 configure报错:libpcre/pcre2库未找到
configure: error: Unable to use libpcre2这个错误非常典型,就是缺pcre2开发包。前面第2章已经提过,直接在有网机器上用yumdownloader下载pcre2和pcre2-devel,拷进内网rpm安装即可。
如果你下载的是pcre2源码想自己编译,也可以,但没必要。rpm包安装简单,而且版本匹配度更高。装上之后重新执行configure,一般就能通过。
4.3 make编译时内存不足或编译进程被杀
编译过程中如果看到类似:
gcc: fatal error: Killed signal terminated program cc1大概率是内存不够,gcc进程被系统OOM杀掉了。特别是小内存虚拟机开-j4甚至-j8的时候,很容易出现。
解决办法有两个。一是降低并行度,改成make -j1,让编译进程一个个来,慢但是稳。二是临时增加swap空间,给系统加2G临时swap:
dd if=/dev/zero of=/swapfile bs=1G count=2 mkswap /swapfile swapon /swapfile编译完成之后,可以视情况决定是否保留这个swap文件。如果机器内存本来就小,留着也无妨,能提升系统稳定性。
4.4 服务启动失败:日志目录或权限问题
systemd启动zabbix-agent后,通过systemctl status看到状态是failed,或者进程一直重启,最常见的两个原因:
第一,日志目录不存在。/var/log/zabbix这个目录是agent自己创建的,但是zabbix用户没有权限创建它,所以必须先手动创建并授权。报错日志里会明确写“cannot create zabbix_agentd.log: No such file or directory”。
第二,配置文件权限不对。zabbix_agentd.conf配置文件里通常会有一些敏感信息,如果权限是644、属主是root,zabbix用户读不了,启动一样会失败。创建配置文件之后记得chown一下。
chown -R zabbix:zabbix /etc/zabbix /var/log/zabbix4.5 Server端一直显示“已断开”或看不到数据
agent本地启动了、端口也监听了,但Zabbix Server前台就是看不到主机数据,这种情况按顺序排查以下几步:
第一步,网络连通性。在Server端执行telnet agent的IP加10050端口:
telnet 192.168.1.20 10050如果端口不通,检查防火墙和安全组策略。第二步,配置文件里的Server字段是否写对了,是不是填了Zabbix Server的IP。第三步,Hostname是否匹配,Server端添加主机时写的主机名和agent配置文件里的Hostname要完全一致。第四步,SELinux是否拦截。麒麟系统默认SELinux可能是enforcing状态,执行getenforce确认,如果临时测试可以setenforce 0,但生产环境建议针对zabbix进程放行,而不是全局关闭。
5. 更进一步:agent2、批量部署与离线资源库
5.1 用zabbix_agent2还是传统zabbix_agentd
zabbix 6.0版本开始,官方主推zabbix_agent2,也就是新一代agent。它和传统agentd的区别在于,agent2基于Go语言框架,支持插件化扩展,动态加载各类采集模块,内存管理更稳健,在高并发采集场景下表现更好。
编译agent2的configure参数和agentd类似,只需要把--enable-agent换成--enable-agent2:
./configure \ --prefix=/usr/local/zabbix \ --enable-agent2 \ --disable-server \ --disable-proxy \ --disable-javaagent2的配置文件名是zabbix_agent2.conf,二进制是zabbix_agent2,其他流程基本一致。如果是从零开始新建监控体系,我建议直接用agent2;如果是维护存量环境,就沿用已有的agentd,避免混用增加维护成本。
5.2 把编译好的agent打包,实现批量部署
如果你有几十台同系统版本、同架构的麒麟服务器都要装agent,逐台编译显然不现实。好在源码编译的产物是可复制的,只要目标机器的系统版本、架构和依赖库版本一致,编译好的二进制可以整包拷过去直接用。
cd /usr/local tar -czf zabbix-agent-6.0.28-kylin-x86_64.tar.gz zabbix/把生成的tar包,连同systemd服务文件、zabbix_agentd.conf模板,一起打包分发到其他机器上,解压后改一下Hostname,启动服务就行。这里有个非常关键的坑:跨机器复用时,目标机器的glibc版本不能低于编译机器的glibc版本,否则运行时会报“version GLIBC_2.xx not found”之类的错误。
要彻底避开这个坑,可以在编译时加上静态编译参数,把依赖库静态链进二进制里。不过静态编译有一定复杂度,也可能导致部分功能异常,建议先在同一系统版本范围内打包复用,等比测试通过后再推广。
5.3 把离线资源沉淀成内部资产
一次离线编译的成功,不等于以后每次都能顺顺利利。我建议把这次用到的所有资源整理归档,形成内部离线安装包:
- zabbix源码包及SHA256校验文件
- pcre2、pcre2-devel的rpm包
- gcc、make等基础工具链的rpm包
- 配置好的zabbix_agentd.conf模板
- systemd服务单元文件
- 安装部署文档和一键安装脚本
把这些存放在一个固定的内网位置,以后再有机器要装agent,半小时内就能搞定,而不是重新踩一遍“缺这个缺那个”的坑。
我在实际操作中的体会是:离线源码编译这件事,考验的不是你会不会敲命令,而是你愿不愿意在动手之前把环境摸排清楚、把依赖准备完整。准备工作做到位,编译安装本身其实花不了多少时间。这也算是我踩了这么多次坑之后,最想分享给大家的一点心得。希望这篇文章能帮你在麒麟Linux上顺利装好zabbix-agent。