ESXi vm-support 支持包分析

---
name: esxi-vm-support-analysis
description: >-
Analyze a VMware ESXi vm-support / vm-support bundle directory (or .tgz
extract) to diagnose host crashes, PSODs, hardware faults
(memory/CPU/PSU/fan/storage), performance freezes, networking issues, and
per-VM power-off/reboot or vMotion questions. Use whenever the user provides a
vm-support folder containing README, action.log, commands/ and var/run/log/,
or asks "分析崩溃原因 / 分析 ESXi 支持包 / vm-support 里怎么看 XX / why did the host or VM
reboot".
---

# ESXi vm-support 支持包分析

对 VMware ESXi(`vm-support` 打包)诊断包做系统化分析的标准流程与判据。
目标:**从一堆日志中给出可复现、可举证、可行动的结论**(发生了什么 → 什么时候 → 为什么 → 怎么办)。

---

## 0. 使用前提与起步动作

- 输入通常是一个目录(或解压后的 .tgz),根下有:`README`、`action.log`、`error.log`、
`errors-ignored.log`,以及镜像目录 `commands/ var/ etc/ json/ bootbank/ altbootbank/ lib64/ usr/ vmfs/`。
- **只看 `commands/` 和 `var/`,绝大多数问题就够了**;其余目录是"需要深挖时才翻"的镜像。
- 只在只读日志上分析,**不要**假设主机当前状态;一切以包内时间戳为准。
- 命令一律用 bash/POSIX 语法(Windows 下也用 Git Bash)。路径含中文(如 VM 名 `脚本服务01`)时加引号。

**开场三条命令**(先建立时空坐标系,再谈其他):

```bash
cat README # Captured on = 采集时刻
cat commands/date.txt # 确认时区(ESXi 常为 UTC)
cat var/run/log/vmksummary.log # 启动/关机历史 + uptime + VM 数
```

---

## 1. 支持包结构全解

| 目录/文件 | 是什么 | 看什么 |
|---|---|---|
| `README` | 采集元信息 | `Captured on`(采集时间)、命令行、选项 —— **第一眼看它** |
| `action.log` | 采集时执行过的所有命令及耗时 | 判断某条命令是否超时/未收集到(对应 `error.log`)|
| `error.log` / `errors-ignored.log` | 采集过程报错 | 某个文件缺失/命令失败的原因 |
| `commands/` | 按命令名生成的**纯文本输出**(`lsusb.txt`、`esxcfg-info.txt`…)| **信息密度最高**,采集时现场跑一遍并落盘 |
| `json/` | 与 `commands/` 同源,但为 JSON 格式 | 交给脚本/自动化解析时用 |
| `var/run/log/` | **运行时日志主战场** | 见 §1.1 |
| `var/log/` | `boot.gz`、`sysboot.log`、`kickstart.log` 等引导期日志 | 启动报错、历史启动参数 |
| `var/core/` | 内核转储(PSOD) | 紫屏日志 `vmkernel-zdump.*`;对照 `commands/localcli_system-coredump-file-*` |
| `etc/` | 主机配置文件全量复制 | `ntp.conf`/`ntp.drift`、网络、认证、服务配置 |
| `bootbank/` | **活动分区**软链接 | 正在运行的内核模块与 VIB |
| `altbootbank/` | **备用分区**软链接 | 升级/新装先写入此分区,重启后切换;主分区故障时回滚 |
| `lib64/` | 64 位共享库与内核模块(PAM 等)| ESXi 优先从 `/lib64` 加载 |
| `usr/` | 可执行文件、脚本 | `vm-support` 脚本本体在 `/usr/lib/vmware/vm-support/` |
| `vmfs/` | 挂载的 VMFS 数据存储镜像 | `vmfs/volumes/<uuid>/<vm name>/` 下是 VM 磁盘与配置 |

### 1.1 `var/run/log/` 关键日志

| 文件 | 用途 |
|---|---|
| `vmkernel.log` | **内核主日志**:崩溃、MCA、存储 IO、调度、驱动程序全在此 |
| `vmkwarning.log` | 警告/ALERT 汇总:NMI、Heartbeat、PageRetire、性能退化 |
| `vmksummary.log` | **启动/关机历史**(uptime、VM 数、`Host has booted`)——**做时间线起点** |
| `vobd.log` | 硬件/网络/存储事件(VMFS 心跳、`vmnic linkstate is`)|
| `hostd.log` | 主机服务、任务、重启原因、卷挂载/丢失 |
| `syslog.log` | 用户态聚合日志 |
| `localcli.log` / `esxcli.log` / `esxtokend.log` | 命令与认证审计 |
| `cmmdsd/clomd/clusterAgent/vsan*` | vSAN / 集群栈 |

---

## 2. 分析总流程(故障定责主线)

1. **采集时间与版本**
- `README` → `Captured on`;`commands/date.txt` → 确认时区
- `commands/localcli_system-version-get.txt`、`uname_-a.txt`、`vmware_-vl.txt`
2. **建立重启/关机时间线**
```bash
grep -n "Host has booted\|Host is rebooting\|Host is powering off" var/run/log/vmksummary.log
```
- 有 `booted` 却无 `powering off/rebooting` → **非正常重启**(崩溃/掉电)
- `hostd.log` 的 `Last reboot reason is unknown` 为佐证
- `vmkernel.log` 用启动分隔符切片:`grep -n "Boot Successful\|Initializing InitVMKernel" ...`
3. **崩溃 / PSOD 排查**
```bash
grep -n -iE "panic|BUG:|Assert|MCE|MCA|SRAR|Uncorrectable|NMI|trap|not responding|lost access|APD|PDL|deadlock|backtrace" var/run/log/vmkernel.log
```
- 转储核对:`commands/localcli_system-coredump-file-list.txt` `-file-get.txt`
`-partition-get/-list.txt`、`localcli_--plugin-dir-usrlibvmwareesxcliint-systemInternal-coredump-configuration-check.txt`、`var/core/`
- 无 panic 文本 + 日志戛然而止 + 无平滑关机 = **硬复位/掉电**
4. **硬件告警(BMC / IPMI)—— 崩溃类必查**
- `commands/localcli_hardware-ipmi-sel-get*.txt`(SEL 概要:`Last Added` / `Last Cleared` / 条数)
- `commands/localcli_hardware-ipmi-sel-list*.txt`(**逐条事件 + 时间戳**)
- `commands/localcli_hardware-ipmi-sdr-list*.txt`(**传感器当前状态**:内存槽/温度/电源/风扇)
- `commands/localcli_hardware-ipmi-bmc-get.txt`、`...fru-*`
5. **内存故障定位**(本类问题最常见,见 §4.1)
6. **CPU / 调度**:`vmkwarning.log` 的 `Heartbeat: PCPU x didn't have a heartbeat` + `ALERT: NMI ... RIPOFF`
7. **存储 / 网络 / VM 层**:按 §3 的四大方向表逐项查
8. **交叉比对历史包**:换件/变更前后的两份包对比(见 §5)

---

## 3. 四条巡检主线(不问具体故障时用)

> 拿到包不知道从哪下手时,按 **VM → 主机 → 网络 → 存储** 四方向各走一遍。

### 3.1 方向一:虚拟机 VM 的问题

VM 日志路径:`vmfs/volumes/<datastore-uuid>/<vm name>/vmware.log`(**每个 VM 独立一份**)

| 细分 | 路径 | 搜索关键字 | 含义 |
|---|---|---|---|
| VM 数量/清单 | `etc/vmware/hostd/vmInventory.xml` | — | 该 ESXi 上所有登记的 VM |
| VM 配置 | `vmfs/volumes/<uuid>/<vm>/<vm>.vmx` | `numvcpus` | vCPU 数 |
| | 同上 | `memSize` | 内存(MB) |
| | 同上 | `guestOS` | Guest 系统类型 |
| 开机/关机原因 | `vmware.log` | `CPU reset: soft` | Guest OS 内主动重启 |
| | | `PM Soft Off` | Guest OS 内主动关机 |
| | | `CPU reset: hard` | 外部(vSphere API)重启 |
| | | `MKS local poweroff` | 外部强制关机(类似拔电)|
| | | `Tools: sending 'OS_Halt' (state = 1)` | 外部通过 Tools 关机 |
| | | `PM Soft Off. Good-bye.` | 外部 API 关机 |
| vMotion | `vmware.log` | `mid id` | 取 migration id |
| | `vmware.log` / `hostd.log` | 上一步的 `mid id` | 看源/目标、迁移过程 |

> 注:`mid id` 仅在该 VM 发生过 vMotion 时存在;无命中不等于异常。

### 3.2 方向二:ESXi 主机本身

| 细分 | 路径 | 搜索关键字 | 含义 |
|---|---|---|---|
| 采集时刻 | `commands/date.txt` | — | 本次 vm-support 的时间 |
| 机型/厂商/SN | `commands/esxcfg-info_-a.txt.FRAG-00000` | `Product Name` | 服务器型号 |
| | 同上 | `Vendor Name` | 服务器厂商 |
| | 同上 | `Serial Number` | 主机序列号 |
| 主机名 | `commands/python_usrlibvmwarevm-supportbinsystemStorageDebugpyc.txt` | `Hostname` | ESXi 主机名 |
| 升级/补丁 | `commands/localcli_software-profile-get.txt` | — | 已应用的升级配置文件 |
| VIB 清单 | `commands/localcli_software-vib-list.txt` | — | 已安装的所有 VIB |
| 内核模块 | `commands/esxcfg-module_-q.txt` | 如 `migrate` | 模块是否加载 |
| uptime/VM 数 | `var/run/log/vmksummary.log` | `Host has booted` | 运行时长与 VM 数量 |

### 3.3 方向三:网络

| 细分 | 路径 | 搜索关键字 | 含义 |
|---|---|---|---|
| 物理网口 | `commands/nicinfo.sh.txt` | `vmnic` | 有几个物理口(vmnic0/1/2/3…)|
| | 同上 | `Firmware Version` | NIC 固件版本 |
| | 同上 | `Driver Info` | 驱动名(如 `qfle3`)|
| 驱动版本 | `commands/localcli_software-vib-list.txt` | 上一步的驱动名 | 驱动对应的 VIB 版本 |
| vmkernel 端口 | `commands/esxcfg-vmknic_-l.txt` | — | 管理 IP、vMotion IP、MTU |
| 虚拟交换机 | `commands/esxcfg-vswitch_-l.txt` | — | vSwitch / 上行链路 / 端口组 |
| 链路状态日志 | `var/run/log/vobd.log` | `linkstate is` | 物理口 up/down 记录 |
| 内核侧异常 | `var/run/log/vmkernel.log` | 故障时刻附近 | 网卡相关错误 |

### 3.4 方向四:存储

**先看配置:**

| 细分 | 路径 | 搜索关键字 | 含义 |
|---|---|---|---|
| HBA 清单 | `commands/localcli_storage-core-adapter-list.txt` | — | 有哪些 HBA |
| SAS HBA | `commands/localcli_storage-san-sas-list.txt` | — | SAS 卡固件版本与驱动名(如 `smartpqi`)|
| SAS 驱动版本 | `commands/localcli_software-vib-list.txt` | 上一步的驱动名 | 驱动 VIB 版本 |
| FC SAN HBA | `commands/localcli_storage-san-fc-list.txt` | — | FC 卡固件版本与驱动名(如 `qedf`)|
| FC 驱动版本 | `commands/localcli_software-vib-list.txt` | 上一步的驱动名 | 驱动 VIB 版本 |
| 空间占用 | `commands/df.txt` | — | Datastore 使用率 % |
| 文件系统 | `commands/localcli_storage-filesystem-list--i.txt` | — | Datastore UUID、挂载点 UUID |
| Datastore↔设备 | `commands/esxcfg-scsidevs_-m.txt` | — | 找到 datastore 底层设备的 `naa.id` |
| 设备详情 | `commands/localcli_storage-core-device-list.txt` | 上一步的 `naa.600508b1...` | vendor、RAID level、是否 SSD、是否 offline、VAAI、RDM |
| 多路径 | `commands/esxcfg-mpath_-b.txt` | — | SAN 多路径配置 |

**再看日志:**

| 路径 | 搜索关键字 | 含义 |
|---|---|---|
| `var/run/log/vmkernel.log` | `ScsiDeviceIO` | SCSI 层 IO 异常汇总 |
| | `CmdSN` | 关联命令序列号,定位单条超时 |
| | `All Paths Down state` | 存储 APD(全路径丢失)|
| | `0x28` | SCSI sense 码(见 t10.org status 表)|
| | `TimedOut` | 存储心跳超时 |
| `var/run/log/vmkwarning.log` | `performance has deteriorated` | 存储性能下降 |
| `var/run/log/hostd.log` | `Lost access to volume` | 存储卷断开 |
| | `Successfully restored access to volume` | 存储卷恢复 |
| `var/run/log/vobd.log` | `esx.problem.vmfs.heartbeat.timedout` | VMFS 心跳超时 |
| | `esx.problem.vmfs.heartbeat.recovered` | 心跳恢复 |
| | `connection failure` | 存储网络连接失败 |

---

## 4. 关键判据(速查)

| 现象 | 判据 | 含义 |
|---|---|---|
| 非正常重启 | `vmksummary` 无 `powering off/rebooting`,但有 `booted` | 崩溃/掉电 |
| 重启原因未知 | `hostd.log` `Last reboot reason is unknown` | 非平滑关机 |
| 内存 CE | `PageRetire: ... retirement is 1` 周期性刷屏 | 某 DIMM 持续可纠正错误 |
| 内存 UCE | `ALERT: MCA ... SRAR` + 杀 VM | 硬件不可纠正错误 |
| 具体坏槽 | SEL `Memory (Un)Correctable ECC` + SDR `Memory Device ...` | 定位到 DIMM 槽 |
| 盘慢 vs 主机卡 | 延迟尖峰与 CPU 冻结窗口逐秒重合 | 主机卡死拖累 IO |
| 全核冻结 | 多次 `Heartbeat` + 同一 `NMI` 栈 | 全局锁竞争 / fork 风暴 |
| 卷掉线 | `vobd` heartbeat timedout + `hostd` Lost access | 存储心跳/链路问题 |

### 4.1 内存故障定位细则

- 内核侧:`PageRetire`(可纠正 CE 反复退役页)、`ALERT: MCA`(机器检查异常)
- BMC 侧:SEL 的 `Memory Uncorrectable ECC` / `Memory Transition to Critical`
- 槽位状态:`sdr-list` 中 `Memory Device <n> <bank> <slot>` 的 Computed Reading:
`Presence Detected`(正常)/ `Correctable ECC Logging Limit Reached` / `Uncorrectable ECC`
- 物理信息:`commands/smbiosDump.txt` → `Memory Device (Type 17)` 的
`Location / Serial / Asset Tag / Part Number / Rank / Speed / Size`
- **交叉比对**:SEL/传感器报错槽 ↔ SMBIOS 已插槽 ↔ 历史包(换件前后)

---

## 5. 陷阱与注意事项

- **BMC 传感器状态可能是锁存值**:换件后若未清 SEL/未重新 POST,仍可能显示旧错误。
→ 结论前先确认"是否清过 SEL / 是否换件后重启"。
- **单包无法证明"已修复/未修复"**:必须结合**换件前后的多份包对比**。
- **对比两份包的正确姿势**:比较 SMBIOS `Serial`/`Asset Tag`(是否真换件)、
`Location`(槽位是否变化)、SDR 传感器状态、SEL 事件时间。
- **命令输出常被分片截断**为 `*.FRAG-000NN`,需拼接多片后再 grep。
- **时钟跳变**:部分日志有 `esx.problem.clock.correction.delta.allowed`,跳变前的绝对时间不可信;
`vobd.log` 里出现 `2001-01-01` 即为未校时阶段的伪时间。
- JSON 优先:`json/` 目录或 `localcli --formatter=json` 更易自动解析。
- 中文 VM 名/路径 grep 时加引号;`awk` 处理 CRLF 注意 `\r`。
- 文件名中的连字符易抄错(例如文件系统清单是 `localcli_storage-filesystem-list--i.txt`,
两个连字符),**用 `ls commands | grep -i <关键词>` 确认实际文件名**,不要凭记忆敲。

---

## 6. 报告输出模板

```
# <主机名/机型> 故障分析报告
## 1. 结论摘要(1-3 句,先说结论)
## 2. 环境概况(机型/CPU/内存/版本/存储/采集包信息)
## 3. 事件时间线(表:UTC 时间 | 事件 | 证据文件)
## 4. 证据链(逐条:现象 + 原始日志引用)
## 5. 根因分析(现象 → 机理 → 根因)
## 6. 建议(按 P0/P1/P2 优先级,含验证实验)
## 7. 局限性与未确认项
## 附录:证据文件清单(相对路径)
```

**报告原则**:每个结论都要能指到具体文件名 + 行号/时间戳;区分"已证实"与"推测";
给出可执行的**决定性实验**(如"两槽对调看错误是否跟条走")。

---

## 7. 一键排查命令片段

```bash
# 采集时间 / 时区 / 版本
cat README | grep "Captured on"; cat commands/date.txt
cat commands/localcli_system-version-get.txt; cat commands/uname_-a.txt

# 非正常重启检测
grep -n "Host has booted\|Host is rebooting\|Host is powering off" var/run/log/vmksummary.log

# 崩溃/硬件异常全景
grep -n -iE "panic|MCA|SRAR|Uncorrectable|NMI|panic|APD|PDL|deadlock" var/run/log/vmkernel.log var/run/log/vmkwarning.log

# BMC 事件与传感器
grep -n "Memory\|CPU\|Power\|Fan\|Temperature" commands/localcli_hardware-ipmi-sel-list*.txt
grep -n "Memory Device" commands/localcli_hardware-ipmi-sdr-list*.txt

# 内存条物理信息
grep -n -A 20 "Memory Device (Type 17)" commands/smbiosDump.txt

# 机型/SN
grep -m5 -E "Product Name|Vendor Name|Serial Number" commands/esxcfg-info_-a.txt.FRAG-00000

# 网络链路事件
grep -n "linkstate is" var/run/log/vobd.log

# 存储异常
grep -n -iE "ScsiDeviceIO|TimedOut|All Paths Down" var/run/log/vmkernel.log
grep -n "performance has deteriorated" var/run/log/vmkwarning.log

# VM 关机/重启原因(对每个 VM 执行)
grep -n -E "CPU reset: (soft|hard)|PM Soft Off|MKS local poweroff|OS_Halt" \
"vmfs/volumes/<uuid>/<vm name>/vmware.log"
```