获取验证码
本站提供VMware ESXi 8.0 Update3、ESXi 9.0/9.1专用AMD Zen4/Zen5平台IPMI温控驱动原厂安装包下载,文件全称VMware-amd-zen-ipmi_thermal_910.1.0.0005-5vmw.803.0.0.24022510.zip,为标准离线压缩格式,集成硬件专属驱动模块。可完美适配铭凡MS-A2等Zen4、Zen5架构迷你主机,部署后可通过ESXCLI命令读取CPU温度及IPMI传感器原始数据,解决消费级主机ESXi环境无法测温、硬件监控缺失等问题,附带详细安装、卸载及跨平台适配教程,适配虚拟化家庭实验室及企业轻量服务器部署使用。
几周前,文超(ESXi Fling 瑞昱网卡驱动开发者)联系到 William Lam,分享了他一直在研发的一项重磅成果。
传统企业级硬件一般都搭载智能平台管理接口(IPMI),可读取各类硬件运行状态数据;但主流消费级主机(如热门的铭凡 MS-A2)出厂默认并不具备该功能。
文超为 AMD Zen4、Zen5 平台开发了一款伪 IPMI 散热驱动 ,能够读取 CPU 温度信息,William Lam也很高兴宣布这款驱动即将作为全新 ESXi Fling 项目正式发布!

除了可以在 vSphere 管理界面直接查看温度数据外,用户还能通过 ESXCLI 命令调取原始传感器指标:
esxcli hardware ipmi sdr list

ESX 9.1
ESX 9.0.x
ESX 8.0 Update 3
第一步:使用 Broadcom 账号登录 Broadcom 支持门户(BSP),账号可免费注册。
第二步:进入免费下载专区(https://support.broadcom.com/group/ecx/free-downloads),选择 Flings 分类页面(https://support.broadcom.com/group/ecx/productdownloads?subfamily=Flings&freeDownloads=true)。
不好下载的,也可以到本站下载,支持下本站。
第一步:将 AMD Zen4/Zen5 IPMI 散热驱动离线安装包(压缩包)上传至你的 ESXi 主机。
第二步:执行以下命令,指定离线压缩包完整路径:
esxcli software component apply -d /VMware-amd-zen-ipmi_thermal_910.1.0.0005-5vmw.803.0.0.24022510.zip
第三步:重启 ESXi 主机,使驱动生效。
第一步:执行以下卸载命令:
esxcli software component remove -n smntemp
第二步:重启 ESXi 主机,完成卸载生效。
该 AMD Zen4/Zen5 IPMI 散热驱动已由多名内部测试人员在多款搭载 Zen4/Zen5 处理器的铭凡 MS-A2 设备上完成验证。如果你在其他平台部署成功,欢迎在评论区留言分享;如有其他使用反馈,也可在下方评论交流。
该驱动目前依赖两项硬件标识信息:AMD 系统管理端口的 PCI 设备 ID(通常设备地址为 0000:00:18.3)、用于识别 CPU 家族及型号的 CPU ID。受限于硬件测试设备数量,当前驱动仅硬编码适配部分已知兼容机型。
你可以手动扩展适配其他 AMD 平台,安装驱动后执行以下全套命令即可:
lspci -v | grep -A2 '0000:00:18.3' | grep '1022' | awk '/Class/{gsub(":","",$3);print "regtype=native,bus=pci,id="$3"..............,driver=smntemp"}' | tee /etc/vmware/default.map.d/smntemp_extra.map
kill -SIGHUP $(pidof vmkdevmgr)
esxcli hardware ipmi sdr list以下为驱动已兼容的 Zen4/Zen5 设备型号,若你有本文未列出的适配机型,可留言告知;收集完整机型列表后,后续会更新驱动默认纳入适配支持:
PCI/CPU ID,架构,CPU 家族型号 1022:14e3,Zen 4,Raphael(拉斐尔) 1022:14e3,Zen 4,Granite Ridge(花岗岩岭) 1022:14f3,Zen 4,Phoenix(凤凰) 1022:16fb,Zen 5,Strix Point(猛禽点) 1022:124b,Zen 5,Krackan 1022:12bb,Zen 5,Strix Halo(猛禽光环)
也可通过 vSphere API 编写程序批量获取硬件健康传感器数据。
方式一:PowerCLI 脚本实现

$cluster = "VCF-Mgmt-Cluster"
$vmhosts = Get-Cluster -Name $cluster | Get-VMhost
Write-Host
foreach($vmhost in $vmhosts | Sort-Object -Property Name) {
$healthSubSys = Get-View $vmhost.ExtensionData.ConfigManager.HealthStatusSystem
$sensorReadings = $healthSubSys.Runtime.SystemHealthInfo.NumericSensorInfo
$results = @()
foreach($sensorReading in $sensorReadings) {
$tmp = [pscustomobject] [ordered]@{
Id = $sensorReading.id
Sensor = $sensorReading.Name
Status = $sensorReading.HealthState.Key
Reading = $sensorReading.CurrentReading
Units = $sensorReading.baseUnits
Categories = $sensorReading.SensorType
LastUpdate = $sensorReading.TimeStamp
}
$results += $tmp
}
Write-Host -ForegroundColor Cyan "ESX: $($vmhost.name)"
$results | Format-Table -AutoSize
}方式二:VI JSON API 脚本实现

VC="vc01.vcf.lab"
VC_USERNAME='administratorat[at]vsphere[dot]local'
VC_PASSWORD='VMware1!VMware1!'
VC_API_RELEASE='8.0.0.0'
VMHOST_CLUSTER_NAME="VCF-Mgmt-Cluster"
VCREST_API_SESSION_ID=$(curl -k -s -u "${VC_USERNAME}:${VC_PASSWORD}" -X POST "https://${VC}/api/session" | jq -j)
CLUSTER_MOREF=$(curl -k -s -H "vmware-api-session-id: ${VCREST_API_SESSION_ID}" -X GET "https://${VC}/api/vcenter/cluster?names=${VMHOST_CLUSTER_NAME}" | jq -r '.[0].cluster')
SESSION_MANAGER_MOID=$(curl -k -s https://$VC/sdk/vim25/${VC_API_RELEASE}/ServiceInstance/ServiceInstance/content | jq -j .sessionManager.value)
VIJSON_API_SESSION_ID=$(curl -k -s -o /dev/null -D - "https://$VC/sdk/vim25/${VC_API_RELEASE}/SessionManager/$SESSION_MANAGER_MOID/Login" -H 'Content-Type: application/json' -d "{\"userName\":\"${VC_USERNAME}\", \"password\": \"${VC_PASSWORD}\"}" | awk 'BEGIN {FS=": "}/^vmware-api-session-id/{print $2}')
curl -k -s \
-H "vmware-api-session-id: ${VCREST_API_SESSION_ID}" \
"https://${VC}/api/vcenter/host?clusters=${CLUSTER_MOREF}" \
| jq -r '.[] | "\(.name) \(.host | sub("host-"; ""))"' \
| while read -r name id; do
echo "Host: $name (ID: $id)"
curl -ks \
-H "vmware-api-session-id: ${VIJSON_API_SESSION_ID}" \
"https://$VC/sdk/vim25/${VC_API_RELEASE}/HostHealthStatusSystem/healthStatusSystem-${id}/runtime" \
| jq '.systemHealthInfo.numericSensorInfo[]
| {
id,
name,
health: .healthState.key,
currentReading,
baseUnits,
sensorType,
timeStamp
}'
done