在Windows上构建Zabbix agent

概览

本节展示了如何从源代码构建带有或不带有TLS的Zabbix Windows agent二进制文件。

编译 OpenSSL

以下步骤将帮助您在 MS Windows 10(64 位)上从源代码编译 OpenSSL。

  1. 在继续之前,请检查 Windows 计算机是否具有:

  2. https://www.openssl.org/获取 OpenSSL 源代码。本示例使用 OpenSSL 1.1.1。

  3. 解压缩 OpenSSL 源代码,例如,到 E:\openssl-1.1.1。

  4. 打开命令行窗口,例如 VS 2017 RC 的 x64 Native Tools 命令提示符。

  5. 进入 OpenSSL 源代码目录(在本教程中为 E:\\openssl-1.1.1),并验证是否可以找到 NASM:

e:\openssl-1.1.1> nasm --version
               NASM version 2.13.01 compiled on May  1 2017
  1. 配置 OpenSSL,例如:
e:\openssl-1.1.1> perl E:\openssl-1.1.1\Configure VC-WIN64A no-shared no-capieng no-srp no-gost no-dgram no-dtls1-method no-dtls1_2-method  --api=1.1.0 --prefix=C:\OpenSSL-Win64-111-static --openssldir=C:\OpenSSL-Win64-111-static
  • 注意选项 'no-shared':如果使用 'no-shared',则 OpenSSL 静态库 libcrypto.lib 和 libssl.lib 将是“自给自足”的,结果 Zabbix 二进制文件将包含 OpenSSL 本身,无需外部 OpenSSL DLL。 优点:Zabbix 二进制文件可以复制到其他 Windows 计算机,而无需 OpenSSL 库。 缺点:当发布新的 OpenSSL 修复版本时,需要重新编译和重新安装 Zabbix agent。
  • 如果未使用 'no-shared',则静态库 libcrypto.lib 和 libssl.lib 将在运行时使用 OpenSSL DLL。 优点:当发布新的 OpenSSL 修复版本时,可能只需升级 OpenSSL DLL,而无需重新编译 Zabbix agent。 缺点:将 Zabbix agent 复制到另一台机器需要同时复制 OpenSSL DLL。
  1. 编译 OpenSSL,运行测试,安装:
e:\openssl-1.1.1> nmake
       e:\openssl-1.1.1> nmake test
       ...
       所有测试成功。
       文件=152,测试=1152,501 墙钟秒(0.67 usr + 0.61 sys = 1.28 CPU)
       结果:通过
       e:\openssl-1.1.1> nmake install_sw

install_sw仅安装软件组件(即库、头文件,但不包括文档)。 要安装所有内容,请使用 nmake install

编译 PCRE

  1. 下载 PCRE 或 PCRE2 库 (https://pcre.org/).

  2. 解压缩到目录 E:\pcre2-10.39.

  3. https://cmake.org/download/ 安装 CMake,在安装过程中选择:并确保 cmake\bin 在您的路径中(测试版本 3.9.4)。

  4. 创建一个新的、空的构建目录,最好是源目录的子目录。 例如,E:\pcre2-10.39\build

  5. 打开命令行窗口,例如 VS 2017 的 x64 本机工具命令提示符,从该 shell 环境运行 cmake-gui。 不要尝试从 Windows 开始菜单启动 Cmake,因为这可能会导致错误。

  6. 分别输入 E:\pcre2-10.39E:\pcre2-10.39\build 作为源目录和构建目录。

  7. 点击“配置”按钮。

  8. 在为该项目指定生成器时,选择“NMake Makefiles”。

  9. 创建一个新的、空的安装目录。例如,E:\pcre2-10.39-install

  10. GUI 将列出几个配置选项。确保选中以下选项:

    • PCRE_SUPPORT_UNICODE_PROPERTIES 开启
    • PCRE_SUPPORT_UTF 开启
    • CMAKE_INSTALL_PREFIX E:\pcre2-10.39-install
  11. 再次点击“配置”。旁边的“生成”按钮现在应该是活动的。

  12. 点击“生成”。

  13. 如果出现任何错误,建议在尝试重复 CMake 构建过程之前删除 CMake 缓存。 在 CMake GUI 中,可以通过选择“文件 > 删除缓存”来删除缓存。

  14. 构建目录现在应该包含一个可用的构建系统 - Makefile

  15. 打开命令行窗口,例如 VS 2017 的 x64 本机工具命令提示符,然后导航到上面提到的 Makefile

  16. 运行 NMake 命令:

E:\pcre2-10.39\build> nmake install

编译 Zabbix

以下步骤将帮助您在 MS Windows 10(64位)上从源代码编译 Zabbix。 编译 Zabbix 时,无论是否包含 TLS 支持,唯一的显著差异在于步骤 4。

  1. 在 Linux 机器上从 git 检出源代码:
git clone https://git.zabbix.com/scm/zbx/zabbix.git
       cd zabbix
       ./bootstrap.sh
       ./configure --enable-agent --enable-ipv6 --prefix=`pwd`
       make dbschema
       make dist
  1. 在 Windows 机器上复制并解压缩归档文件,例如 zabbix-7.0.0.tar.gz

  2. 假设源代码位于 E:\zabbix-7.0.0。打开命令行窗口,例如 VS 2017 RC 的 x64 Native Tools Command Prompt。进入:

E:\\zabbix-7.0.0\\build\\win32\\project
  1. 编译 zabbix_get, zabbix_sender 和 zabbix_agent。
    • 不包含 TLS:

      E:\zabbix-7.0.0\build\win32\project> nmake /K PCRE2INCDIR=E:\pcre2-10.39-install\include PCRE2LIBDIR=E:\pcre2-10.39-install\lib
    • 包含 TLS:

      E:\zabbix-7.0.0\build\win32\project> nmake /K -f Makefile_get TLS=openssl TLSINCDIR=C:\OpenSSL-Win64-111-static\include TLSLIBDIR=C:\OpenSSL-Win64-111-static\lib PCRE2INCDIR=E:\pcre2-10.39-install\include PCRE2LIBDIR=E:\pcre2-10.39-install\lib
             E:\zabbix-7.0.0\build\win32\project> nmake /K -f Makefile_sender TLS=openssl TLSINCDIR="C:\OpenSSL-Win64-111-static\include TLSLIBDIR="C:\OpenSSL-Win64-111-static\lib" PCRE2INCDIR=E:\pcre2-10.39-install\include PCRE2LIBDIR=E:\pcre2-10.39-install\lib
             E:\zabbix-7.0.0\build\win32\project> nmake /K -f Makefile_agent TLS=openssl TLSINCDIR=C:\OpenSSL-Win64-111-static\include TLSLIBDIR=C:\OpenSSL-Win64-111-static\lib PCRE2INCDIR=E:\pcre2-10.39-install\include PCRE2LIBDIR=E:\pcre2-10.39-install\lib
  2. 新的二进制文件位于 e:\zabbix-7.0.0\bin\win64。 由于 OpenSSL 是使用 'no-shared' 选项编译的,Zabbix 二进制文件内含 OpenSSL,可以将其复制到没有 OpenSSL 的其他机器上。

使用LibreSSL编译Zabbix

该过程与使用OpenSSL编译类似,但你需要对位于build\win32\project目录下的文件进行微小的修改:

  • 在Makefile_tls中:删除/DHAVE_OPENSSL_WITH_PSK

要做到这一点,找到:

CFLAGS = $(CFLAGS) /DHAVE_OPENSSL /DHAVE_OPENSSL_WITH_PSK

并将其替换为

CFLAGS = $(CFLAGS) /DHAVE_OPENSSL
  • 在Makefile_common.inc中:添加/NODEFAULTLIB:LIBCMT

要做到这一点,找到:

/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DYNAMICBASE:NO /PDB:$(TARGETDIR)\$(TARGETNAME).pdb

并将其替换为

/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DYNAMICBASE:NO /PDB:$(TARGETDIR)\$(TARGETNAME).pdb /NODEFAULTLIB:LIBCMT