在Windows上构建Zabbix agent
概述
本节将演示如何从有或没有TLS的源构建 Zabbix Windows agent二进制文件。
编译OpenSSL
接下来的步骤将助你在MS Windows 10(64位)的源中编译OpenSSL。
- 编译OpenSSL你需要在Windows机器上安装:
- C compiler (e.g. VS 2017 RC),
- NASM (https://www.nasm.us/),
- Perl (e.g. Strawberry Perl from http://strawberryperl.com/),
- Perl module Text::Template (cpan Text::Template).
- 获取 OpenSSL 源代码 https://www.openssl.org/。这里用OpenSSL 1.1.1 版本。
- 解压 OpenSSL 源,例如,解压在 E:\openssl-1.1.1。
- 打开命令行窗口。例如,VS 2017 RC的 x64 原生工具命令提示符。
- 至 OpenSSL 源目录, 例如,E:\openssl-1.1.1。
- 验证 NASM 能被找到:
e:\openssl-1.1.1> nasm --version NASM version 2.13.01 compiled on May 1 2017
- 验证 NASM 能被找到:
- 配置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 DLLs。 优点: Zabbix二进制文件可以复制到其他没有OpenSSL库的Windows机器上。 缺点:当新的OpenSSL bugfix 版本发布时,需要重新编译并安装Zabbix agent。
- 如果不使用’no-shared’,那么静态库 libcrypto.lib和 libssl.lib 会在运行时使用OpenSSL DLLs 。
- 优点:当新的OpenSSL bugfix版本发布时,你可能只需要升级OpenSSL DLLs不用重新编译Zabbix agent。
- 缺点:复制Zabbix agent到另一个机器时,需要同时复制OpenSSL DLLs。
- 编译OpenSSL,运行测试,安装:
e:\openssl-1.1.1> nmake e:\openssl-1.1.1> nmake test ... All tests successful. Files=152, Tests=1152, 501 wallclock secs ( 0.67 usr + 0.61 sys = 1.28 CPU) Result: PASS e:\openssl-1.1.1> nmake install_sw
‘install_sw’ 仅安装软件组件(例如 库,头文件,但不安装文档)。如果你希望安装所有的文件,请用 “nmake install”。
编译PCRE
- 从 pcre.org (https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.39/pcre2-10.39.zip) 存储库中下载PCRE 或 PCRE2 (Zabbix 6.0以上支持) 库:
- 提取到目录E:\pcre2-10.39
- 从https://cmake.org/download/ 安装CMake,安装过程中选择: 确保 cmake\bin 在你的路径的 (测试版本3.9.4).
- 创建一个新的空的构建目录,最好是源目录的子目录。例如E:\pcre2-10.39\build.
- 打开命令行窗口,例如 VS 2017上的x64原生工具命令提示符 ,并且从该外部环境运行cmake-gui。不要试图从窗口开始菜单启动Cmake,因为这可能会导致错误。
- 分别为源目录和构建目录输入 E:\pcre2-10.39 和E:\pcre2-10.39\build 。
- 点击 “Configure” 按钮。
- 为此项目指定生成器时,请选择 “NMake Makefiles”。
- 创建一个新的空的安装目录。例如,E:\pcre2-10.39-install。
- GUI 将列出几个配置选项。确保选择了以下几个选项:
- PCRE_SUPPORT_UNICODE_PROPERTIES ON
- PCRE_SUPPORT_UTF ON
- CMAKE_INSTALL_PREFIX E:\pcre2-10.39-install
- 再次点击 “Configure” 。相邻的”Generate”按钮需要启用。
- 点击 “Generate”.
- 如果出现错误,建议在尝试重复构建CMake的过程中删除CMake缓存。 在CMake GUI中,缓存可以通过选择 “File > Delete Cache”来删除。
- 构建目录现在应该包含了一个可用的构建系统 - Makefile.
- 打开命令行窗口,例如 VS 2017上的x64原生工具命令提示符 ,导航到上面提到的 Makefile 。
- 运行 NMake 命令:
E:\pcre2-10.39\build> nmake install
编译 Zabbix
以下步骤将助你从MS Windows 10 (64位)上的源码中编译Zabbix。在编译有或没有TLS支持的Zabbix时,唯一显著的区别在步骤4。
- 在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
- 在Windows机器上复制和解压归档文件,例如 zabbix-4.4.0.tar.gz。
- 我们假设源代码在 e:\zabbix-4.4.0中。打开命令行窗口,例如 VS 2017 RC中的 x64原生工具命令提示符。转至 E:\zabbix-4.4.0\build\win32\project。
- 编译 zabbix_get, zabbix_sender 和 zabbix_agent。
- 无TLS:
E:\zabbix-4.4.0\build\win32\project> nmake /K PCREINCDIR=E:\pcre2-10.39-install\include PCRELIBDIR=E:\pcre2-10.39-install\lib
- 有TLS:
E:\zabbix-4.4.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 PCREINCDIR=E:\pcre2-10.39-install\include PCRELIBDIR=E:\pcre2-10.39-install\lib E:\zabbix-4.4.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" PCREINCDIR=E:\pcre2-10.39-install\include PCRELIBDIR=E:\pcre2-10.39-install\lib E:\zabbix-4.4.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 PCREINCDIR=E:\pcre2-10.39-install\include PCRELIBDIR=E:\pcre2-10.39-install\lib
- 无TLS:
- 新的二进制文件位于 e:\zabbix-4.4.0\bin\win64。由于 OpenSSL 是用 ‘no-shared’ 选项编译的,Zabbix二进制文件本身包含OpenSSL,可以复制到其他没有OpenSSL的机器中。
用LibreSSL编译Zabbix
该过程类似于使用OpenSSL编译,但是你需要对位于build\win32\project
目录中的文件进行一些小的改变:
* In ''Makefile_tls'' delete ''/DHAVE_OPENSSL_WITH_PSK''. i.e. find <code>
CFLAGS = $(CFLAGS) /DHAVE_OPENSSL /DHAVE_OPENSSL_WITH_PSK</code>然后用CFLAGS = $(CFLAGS) /DHAVE_OPENSSL
进行替换
* In ''Makefile_common.inc'' add ''/NODEFAULTLIB:LIBCMT'' i.e. find <code>
/MANIFESTUAC:”level=’asInvoker’ uiAccess=’false’” /DYNAMICBASE:NO /PDB:$(TARGETDIR)\$(TARGETNAME).pdb</code>然后用 /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DYNAMICBASE:NO /PDB:$(TARGETDIR)\$(TARGETNAME).pdb /NODEFAULTLIB:LIBCMT
进行替换