Сегодня у нас важная и полезная миссия. Мы собираем VIB пакет для запуска ipmitool в ESXi 8. Нам предстоит решить две проблемы:
- В ESXi 8.0 и новее утилита ipmitool по умолчанию не работает
- Старые утилиты для сборки VIB пакетов не подходят для ESXi 8
Ipmitool — это утилита для управления и настройки устройств, поддерживающих стандарт IPMI (Intelligent Platform Management Interface).
Давно я не собирал VIB пакеты, в ESXi 8 теперь всё не так как раньше.
До vSphere 8.0 формат ESXi VIB практически не менялся с того момента, как у конечных пользователей появилась возможность создавать собственные VIB пакеты, начиная с выпуска vSphere 5.0. В vSphere 8.0 в спецификацию VIB было добавлено новое поле, требующее включения контрольной суммы SHA-256 в файл дескриптора VIB. После этого все утилиты для сборки VIB пакетов перестали работать. Вернее, такие VIB пакеты перестали быть совместимыми с ESXi 8.
Спойлер:
Готорый VIB пакет ipmitool с поддержкой lanplus доступен в Сборке для VMware. Можете качать и пользоваться на свой страх и риск.
Ни одна нейронка при сборке пакета не пострадала.

Компиляция ipmitool под ESXi 8
В ESXi 8.0 и новее утилита ipmitool по умолчанию не работает. Причин несколько:
- Все старые сборки ipmitool для ESXi 7 32-битные, а для ESXi 8 нужны 64-битные.
- VIB пакета ipmitool для ESXi 8 я не нашёл
- По умолчанию в ESXi 8.0 блокируется запуск любых непроверенных исполняемых файлов из командной строки
Первую проблему удалось решить ранее, скомпилировав совместимый 64-битный ipmitool под архитектуру ESXi 8.0:
Сам бинарник у нас теперь есть.
Сборка VIB пакета под ESXi 8
Решаем вторую проблему. Работать будем с ESXi 8.0.3.
VMware предоставляет своим партнёрам по экосистеме официальный способ сборки и упаковки VIB, интегрируемых с ESXi, через программу VMware I/O Vendor Partner (IOVP). Но у нас её нет, мы же community. Поэтому для расчёта контрольных сумм воспользуемся утилитой ar.
Рекомендуется использовать виртуальную машину Ubuntu, которая включает все необходимые утилиты, в том числе ar. Поднял Ubuntu 18 в WSL.
Весь процесс сборки завёрнут в bash скрипт:
#!/bin/bash
set -euo pipefail
CUSTOM_VIB_TEMP_DIR=/tmp/vib-temp-$$
CUSTOM_VIB_NAME=il-ipmitool
CUSTOM_VIB_VERSION="1.8.18-1"
CUSTOM_VIB_VENDOR="internet-lab.ru"
CUSTOM_VIB_VENDOR_URL="https://internet-lab.ru"
CUSTOM_VIB_SUMMARY="ipmitool 1.8.18"
CUSTOM_VIB_DESCRIPTION="ipmitool 1.8.18 with lanplus"
CUSTOM_VIB_BUILD_DATE=$(date '+%Y-%m-%dT%H:%I:%S')
# clean up any prior builds
CUSTOM_VIB_FILE_NAME=${CUSTOM_VIB_NAME}.vib
rm -f ${CUSTOM_VIB_FILE_NAME}
# Setting up VIB spec confs
VIB_DESC_FILE=${CUSTOM_VIB_TEMP_DIR}/descriptor.xml
VIB_PAYLOAD_DIR=${CUSTOM_VIB_TEMP_DIR}/payloads/payload1
# Create VIB temp & spec payload directory
mkdir -p ${CUSTOM_VIB_TEMP_DIR}
mkdir -p ${VIB_PAYLOAD_DIR}
# Create ESXi folder structure for file(s) placement
CUSTOM_VIB_BIN_DIR=${VIB_PAYLOAD_DIR}/bin
mkdir -p ${CUSTOM_VIB_BIN_DIR}
# Copy file(s) to destination folder
cp ipmitool ${CUSTOM_VIB_BIN_DIR}
# Create tgz with payload
tar czf ${CUSTOM_VIB_TEMP_DIR}/payload1 -C ${VIB_PAYLOAD_DIR} bin
# Calculate payload size/hash
PAYLOAD_FILES=$(tar tf ${CUSTOM_VIB_TEMP_DIR}/payload1 | grep -v -E '/$' | sed -e 's/^/ <file>/' -e 's/$/<\/file>/')
PAYLOAD_SIZE=$(stat -c %s ${CUSTOM_VIB_TEMP_DIR}/payload1)
PAYLOAD_SHA256=$(sha256sum ${CUSTOM_VIB_TEMP_DIR}/payload1 | awk '{print $1}')
PAYLOAD_SHA256_ZCAT=$(zcat ${CUSTOM_VIB_TEMP_DIR}/payload1 | sha256sum | awk '{print $1}')
PAYLOAD_SHA1_ZCAT=$(zcat ${CUSTOM_VIB_TEMP_DIR}/payload1 | sha1sum | awk '{print $1}')
# Create descriptor.xml
cat > ${VIB_DESC_FILE} << __VIB_DESC__
<vib version="5.0">
<type>bootbank</type>
<name>${CUSTOM_VIB_NAME}</name>
<version>${CUSTOM_VIB_VERSION}</version>
<vendor>${CUSTOM_VIB_VENDOR}</vendor>
<summary>${CUSTOM_VIB_SUMMARY}</summary>
<description>${CUSTOM_VIB_DESCRIPTION}</description>
<release-date>${CUSTOM_VIB_BUILD_DATE}</release-date>
<urls>
<url key="website">${CUSTOM_VIB_VENDOR_URL}</url>
</urls>
<relationships>
<depends>
</depends>
<conflicts/>
<replaces/>
<provides/>
<compatibleWith/>
</relationships>
<software-tags>
</software-tags>
<system-requires>
<maintenance-mode>false</maintenance-mode>
</system-requires>
<file-list>
${PAYLOAD_FILES}
</file-list>
<acceptance-level>community</acceptance-level>
<live-install-allowed>true</live-install-allowed>
<live-remove-allowed>true</live-remove-allowed>
<cimom-restart>false</cimom-restart>
<stateless-ready>true</stateless-ready>
<overlay>false</overlay>
<payloads>
<payload name="payload1" type="tgz" size="${PAYLOAD_SIZE}">
<checksum checksum-type="sha-256">${PAYLOAD_SHA256}</checksum>
<checksum checksum-type="sha-256" verify-process="gunzip">${PAYLOAD_SHA256_ZCAT}</checksum>
<checksum checksum-type="sha-1" verify-process="gunzip">${PAYLOAD_SHA1_ZCAT}</checksum>
</payload>
</payloads>
</vib>
__VIB_DESC__
# Create VIB using ar utility
touch ${CUSTOM_VIB_TEMP_DIR}/sig.pkcs7
ar r ${CUSTOM_VIB_FILE_NAME} ${VIB_DESC_FILE} ${CUSTOM_VIB_TEMP_DIR}/sig.pkcs7 ${CUSTOM_VIB_TEMP_DIR}/payloadСкрипт подготавливает структуру директорий и конфигурационный файлы, считает контрольные суммы и собирает VIB пакет.

Если кому-то интересна структура директорий, то вот она:
/tmp/vib-temp-77850
├── descriptor.xml
├── payload1
├── payloads
│ └── payload1
│ └── bin
│ └── ipmitool
└── sig.pkcs7
Осталось закинуть VIB пакет в ESXi 8, установить и проверить работу утилиты ipmitool.

Копируем il-ipmitool.vib в /tmp.
Включаем на хосте SSH, заходим под рутом. Проверяем что пакет загружен.
cd /tmp
ll | grep ipmi
Устанавливаем пакет.
esxcli software vib install -v /tmp/il-ipmitool.vib -fПроверяем что пакет установился.
esxcli software vib list | grep ipmi
which ipmitoolПробуем воспользоваться.
ipmitool sensor list
Всё работает. Напоминаю, что данный VIB пакет доступен в Сборке для VMware.
Увидимся завтра в новых приключениях.