На Photon OS 4 (Cloud Director Appliance ≥ 10.6, vCenter Server Appliance 8) ставим Zabbix Agent 2 (LTS 7.0, RPM под EL8) без установки чужих RPM в систему. Распаковываем три RPM (агент, openssl-libs 1.1, pcre2), кладём бинарь и конфиги штатно, недостающие .so складываем в /etc/zabbix/libs/ и подключаем к сервису через LD_LIBRARY_PATH в systemd-юните. На vCSA дополнительно извлекаем .hmac-файлы для FIPS. В финале — открытие порта 10050 и проверка с Zabbix-сервера через zabbix_get.

Шаги:

  1. Скачать RPM (агент + openssl-libs 1.1 + pcre2) на машине с интернетом.

  2. Распаковать, разложить файлы по нужным путям на appliance.

  3. Прописать LD_LIBRARY_PATH в unit-файле, запустить службу.

  4. Открыть порт 10050 и проверить доступность агента с сервера мониторинга.

Зачем это нужно

Photon OS — компактный базовый дистрибутив VMware для appliance-решений. Официально установка Zabbix Agent на Photon не поддерживается, а штатный пакетный менеджер tdnf не сможет закрыть зависимости агента: Photon OS 4 поставляется с OpenSSL 3 (libssl.so.3, libcrypto.so.3) и без PCRE2. Zabbix Agent 2, собранный для EL8, ждёт:

Доступ к репозиторию VMware с самого аплайнса часто закрыт сетевыми политиками, а ставить «чужие» RHEL-пакеты в систему рискованно — сломаются обновления самого аплайнса. Поэтому собираем «портативную» установку: библиотеки лежат отдельно и подгружаются только агенту.

Почему именно RPM под EL8, а не EL9

EL9 идёт уже на OpenSSL 3 — казалось бы, ближе к Photon 4. Но Zabbix Agent 2 для EL9 собран против более свежего glibc (2.34+), а в Photon OS 4 — glibc 2.32. Бинарь EL9 на Photon 4 просто не запустится из-за несовместимых символов glibc. Сборка EL8 (glibc 2.28) совместима, поэтому единственное, что приходится «донести» — это OpenSSL 1.1 и PCRE2.

О версиях пакетов

Конкретные версии RPM ниже актуальны на момент написания (апрель 2026). Перед развёртыванием возьмите свежие версии из тех же источников: Zabbix — repo.zabbix.com/zabbix/7.0/rhel/8/x86_64/, openssl-libs 1.1 и pcre2 — pkgs.org или зеркала Rocky/AlmaLinux 8. Цепочка зависимостей и пути сборки от версии к версии не меняются.

Часть 1. Подготовка

Подготовиться можно как на самом appliance (если у него есть интернет), так и на соседней Linux-машине. Все артефакты собираем в /root/zbx-portable.

1.1. Скачиваем RPM

Раскладываем в ./rpm/:

/root/zbx-portable/rpm/
  openssl-libs-1.1.1k-15.el8_6.x86_64.rpm
  pcre2-10.32-3.el8_6.x86_64.rpm
  zabbix-agent2-7.0.23-release1.el8.x86_64.rpm

1.2. Полностью распаковываем пакет с агентом

cd /root/zbx-portable
rpm2cpio ./rpm/zabbix-agent2-*.rpm | cpio -idmv

1.3. Извлекаем только нужные библиотеки

Из пакетов с библиотеками вытаскиваем только нужные .so и складываем в ./libs/. Для систем с включённым FIPS (vCSA) дополнительно извлекаем .hmac-файлы — без них OpenSSL в FIPS-режиме откажется грузиться:

mkdir -p /root/zbx-portable/libs && cd /root/zbx-portable/libs
 
rpm2cpio /root/zbx-portable/rpm/pcre2-10.32-3.el8_6.x86_64.rpm \
  | cpio -idmv './usr/lib64/libpcre2-8.so.0*'
 
rpm2cpio /root/zbx-portable/rpm/openssl-libs-1.1.1k-15.el8_6.x86_64.rpm \
  | cpio -idmv './usr/lib64/libssl.so.1.1*' './usr/lib64/libcrypto.so.1.1*'
 
# Только для vCSA / FIPS-режима:
rpm2cpio /root/zbx-portable/rpm/openssl-libs-1.1.1k-15.el8_6.x86_64.rpm | cpio -idmv \
  './usr/lib64/.libcrypto.so.1.1.1k.hmac' \
  './usr/lib64/.libcrypto.so.1.1.hmac' \
  './usr/lib64/.libssl.so.1.1.1k.hmac' \
  './usr/lib64/.libssl.so.1.1.hmac'

Обратите внимание на символьные ссылки в полученных файлах — cpio сохранит их, переносить файлы дальше нужно с флагами, сохраняющими симлинки (cp -a / rsync -a).

Часть 2. Установка на Photon OS 4

2.1. Системный пользователь и каталоги

Создаём пользователя и группу для агента:

groupadd --system zabbix
useradd --system -g zabbix -d /usr/lib/zabbix -s /sbin/nologin \
  -c "Zabbix Monitoring System" zabbix

Каталоги для логов и runtime:

mkdir /var/log/zabbix
chown -R zabbix:zabbix /var/log/zabbix
 
mkdir /run/zabbix
chown zabbix:zabbix /run/zabbix

2.2. Конфиги и бинарь агента

Копируем конфиги Zabbix:

cd /root/zbx-portable/
cp -r etc/zabbix/ /etc/zabbix/
chown -R root:zabbix /etc/zabbix
chmod 755 /etc/zabbix
chmod -R 755 /etc/zabbix/zabbix_agent2.d
chmod 640 /etc/zabbix/zabbix_agent2.conf

Теперь правим /etc/zabbix/zabbix_agent2.conf — Server, ServerActive, Hostname и т. д.

Согласуйте PidFile с RuntimeDirectory

В юните дальше указывается RuntimeDirectory=zabbix → systemd создаст /run/zabbix при старте. Параметр PidFile в zabbix_agent2.conf должен указывать туда же: PidFile=/run/zabbix/zabbix_agent2.pid. Иначе агент будет писать pid в путь по умолчанию, а systemd будет очищать другой каталог — рассинхрон при рестартах.

Копируем бинарник агента:

cp usr/sbin/zabbix_agent2 /usr/sbin/zabbix_agent2
chown root:root /usr/sbin/zabbix_agent2
chmod 755 /usr/sbin/zabbix_agent2

2.3. Библиотеки в отдельном каталоге

Копируем извлечённые .so с сохранением симлинков:

mkdir /etc/zabbix/libs
cp -a /root/zbx-portable/libs/. /etc/zabbix/libs/

На всех каталогах по пути нужен execute-bit (x), иначе линкер не сможет зайти в директорию:

chmod 755 /etc/zabbix
chmod 755 /etc/zabbix/libs
chmod 755 /etc/zabbix/libs/usr
chmod 755 /etc/zabbix/libs/usr/lib64
 
chmod 644 /etc/zabbix/libs/usr/lib64/libcrypto.so.1.1.* \
          /etc/zabbix/libs/usr/lib64/libssl.so.1.1.* \
          /etc/zabbix/libs/usr/lib64/libpcre2-8.so.0.*

2.4. systemd-юнит и LD_LIBRARY_PATH

Копируем unit-файл из распакованного RPM:

cp usr/lib/systemd/system/zabbix-agent2.service \
   /usr/lib/systemd/system/zabbix-agent2.service

Если запустить агента сейчас, получим ошибку:

/usr/sbin/zabbix_agent2: error while loading shared libraries:
  libpcre2-8.so.0: cannot open shared object file

Список недостающих библиотек удобно смотреть так:

ldd /usr/sbin/zabbix_agent2 | awk '/not found/{print $1}'

Решение — добавить в секцию [Service] переменную окружения, чтобы библиотеки видела только эта служба, а заодно зафиксировать каталог и режим для pid-файла:

vim /usr/lib/systemd/system/zabbix-agent2.service
 
[Service]
Environment="LD_LIBRARY_PATH=/etc/zabbix/libs/usr/lib64"
RuntimeDirectory=zabbix
RuntimeDirectoryMode=0755

Применяем:

systemctl daemon-reload
systemctl enable --now zabbix-agent2.service

Альтернатива: вшить путь в бинарь через patchelf

Если вы хотите, чтобы агент находил библиотеки независимо от того, как его запустили (не только через systemd, но и руками для отладки), можно вшить RUNPATH прямо в ELF:

tdnf install -y patchelf   # или принести patchelf тем же способом, что и агента
patchelf --set-rpath /etc/zabbix/libs/usr/lib64 /usr/sbin/zabbix_agent2

После этого LD_LIBRARY_PATH в юните не нужен. Минус — после обновления бинарника агента patchelf нужно применять заново.

Часть 3. Проверка работы

3.1. Зависимости закрыты

Первое, что хочется сделать после правки юнита — запустить ldd и убедиться, что библиотеки нашлись. Но есть нюанс: ldd использует переменные окружения текущего шелла, а LD_LIBRARY_PATH мы выставили только внутри unit-файла. Поэтому «голый» ldd будет продолжать показывать libssl.so.1.1, libcrypto.so.1.1 и libpcre2-8.so.0 как not found, даже если агент при этом прекрасно работает под systemd.

Правильная проверка — с тем же LD_LIBRARY_PATH, который видит служба:

LD_LIBRARY_PATH=/etc/zabbix/libs/usr/lib64 \
  ldd /usr/sbin/zabbix_agent2 | awk '/not found/{print $1}'

Должны получить пустой вывод.

3.2. Статус и логи службы

systemctl status zabbix-agent2 --no-pager
journalctl -u zabbix-agent2 -b -n 50 --no-pager

3.3. Проверка с Zabbix-сервера

Запуск процесса ещё не гарантирует, что агент реально отвечает. С хоста Zabbix-сервера или прокси проверяем end-to-end:

zabbix_get -s <appliance-ip> -p 10050 -k agent.ping
# должно вернуть: 1

zabbix_get -s <appliance-ip> -p 10050 -k agent.version
# должно вернуть номер версии агента

Если zabbix_get упирается в таймаут — проблема либо в firewall (см. Часть 4), либо в параметре Server= в конфиге агента: хост сервера должен быть в нём явно разрешён.

Часть 4. Открытие порта 10050

4.1. Cloud Director Appliance

В /etc/systemd/scripts/ip4save-vmw добавить правило рядом с однотипными записями:

-A INPUT -p tcp -m state --state NEW -m tcp --dport 10050 -j ACCEPT
 
# и перезапустить службу:
service iptables restart

4.2. vCenter Server Appliance

Временное правило (действует до перезагрузки):

iptables -I port_filter -p tcp --dport 10050 -j ACCEPT

Закрепить правило между перезагрузками — добавить блок в /etc/vmware/appliance/services.conf:

"zabbix-agent": {
    "firewall": {
        "enable": true,
        "rules": [
            {
                "direction":  "inbound",
                "protocol":   "tcp",
                "porttype":   "dst",
                "port":       "10050",
                "portoffset": 0
            }
        ]
    }
}

Часть 5. Сопровождение

5.1. Ротация логов

Из RPM мы скопировали только /etc/zabbix/, без /etc/logrotate.d/. Чтобы лог /var/log/zabbix/zabbix_agent2.log не рос бесконтрольно, добавьте конфиг ротации:

cat > /etc/logrotate.d/zabbix-agent2 <<'EOF'
/var/log/zabbix/zabbix_agent2.log {
    weekly
    rotate 12
    compress
    delaycompress
    missingok
    notifempty
    create 0640 zabbix zabbix
    postrotate
        /bin/kill -HUP `cat /run/zabbix/zabbix_agent2.pid 2>/dev/null` 2>/dev/null || true
    endscript
}
EOF

5.2. Что произойдёт при обновлении appliance

ldd /usr/sbin/zabbix_agent2 | awk '/not found/{print $1}'
systemctl status zabbix-agent2
zabbix_get -s 127.0.0.1 -k agent.ping

Если что-то отвалилось — пересоберите /etc/zabbix/libs/ из свежих RPM (см. Часть 1) и при необходимости поднимите версию самого агента.

systemctl disable --now zabbix-agent2.service
rm -f  /usr/lib/systemd/system/zabbix-agent2.service
rm -f  /usr/sbin/zabbix_agent2
rm -rf /etc/zabbix
rm -rf /var/log/zabbix
rm -rf /run/zabbix
userdel zabbix && groupdel zabbix 2>/dev/null
systemctl daemon-reload
# и убрать правило для порта 10050 из firewall (см. Часть 4)

5.4. AppArmor / SELinux

Photon OS 4 в стандартной поставке не имеет принудительного MAC-профиля для произвольных бинарей, но если вы вручную включали AppArmor или SELinux — убедитесь, что для /usr/sbin/zabbix_agent2 нет ограничений на чтение /etc/zabbix/libs/. Симптом — агент стартует, но ldd показывает «not found» под пользователем zabbix и не показывает под root.

Итог

Агент готов: можно подключать пользовательские проверки и плагины — например, для мониторинга PostgreSQL внутри аплайнса. Главное, что мы получили: рабочий Zabbix Agent 2 на Photon OS 4 без вмешательства в системные библиотеки и без установки чужих RPM, то есть без рисков для штатной поддержки appliance со стороны VMware/Broadcom.

Следите, что остаётесь с нами! Ваш Cloud4Y. Читайте нас здесь или в Telegram-канале!

Комментарии (2)


  1. Xelld
    30.04.2026 15:22

    Лезть внутрь appliance и надеяться, что вы не потеряете поддержку так - ну, странно.

    В vcenter же есть SNMP и API, они отдают данные по тому же месту, памяти и CPU. Зачем тащить внутрь zabbix agent?

    Кстати, на картинке у вас "Zibbacx".


    1. Cloud4Y Автор
      30.04.2026 15:22

      Спасибо! Заменили картинку.