# ESXi 常见故障处理 ## 场景 ESXi 主机上出故障了,虚拟机起不来、连不上、卡死、磁盘满了、虚机莫名重启。 这篇按「现象 → 定位 → 处理」整理,都是实际会遇到的。 ## 前置条件 - 能登上 ESXi 的网页控制台(管理网络出问题时用 DCUI) - 有 SSH 权限:网页 → 主机 → 管理 → 安全 → 访问策略 → 启用 SSH - 记下这台主机的 IP 和管理口(vmk0) - 重要操作前先看一遍「虚拟机 → 操作 → 备份」有没有在做 ## 配置 ### 1. 虚拟机无法开机 先看事件,ESXi 的报错基本都在里面: ```text 虚拟机 → 选中 → 监控 → 事件 ``` 常见几种: ```text "msg.vpx.vm.powerOn.timeout" 启动超时,宿主机负载高或磁盘慢 "msg.vmx.powerOn.failed" 配置文件或磁盘有问题 "msg.disk.filter.pd.sesparse.outOfSpace" 空间不足 "msg.hostPort.vmmi网卡不存在" 网卡被删了 ``` 按顺序查: ```bash # 1. 宿主机有没有进入维护模式或重启了 esxcli system stats uptime get # 2. 存储是否可访问(最常见原因) esxcli storage filesystem list esxcli storage core path list esxcli storage vmfs extent list # 3. 磁盘文件在不在 ls -lh /vmfs/volumes/datastore1/虚拟机目录/ # 4. CPU/内存有没有被占满 esxcli system stats cpu load get esxcli hardware memory get # 5. 虚拟机的 .vmx 有没有语法错误 vi /vmfs/volumes/datastore1/虚拟机目录/虚拟机.vmx ``` `.vmx` 里常见的问题: ```ini # 网卡类型在当前版本不存在(换过硬件版本) ethernet0.virtualDev = "vmxnet3" ← 改成 vmxnet2 或 e1000e # 残留的网卡配置指向已删除的端口 ethernet0.present = "TRUE" # 磁盘路径写错 scsi0:0.fileName = "[datastore1] 目录/磁盘.vmdk" ``` 改完 `.vmx` 后**必须重新注册**才生效: ```text 虚拟机 → 操作 → 取消注册 然后 文件 → 打开或浏览数据存储 → 找到 .vmx → 登记为虚拟机 ``` ### 2. 虚拟机连不上 / 网卡不通 ```bash # 物理口链路是否 up esxcli network interface list # vmk0 管理网络配置 esxcli network ip interface list esxcli network ip route list # 虚拟交换机和上行口 esxcli network vswitch standard list esxcli network vswitch standard portgroup list # ARP 和邻居 esxcli network arp table list # 防火墙(ESXi 默认拦很多) esxcli network firewall ruleset list ``` 分层排查,按这个顺序排除: | 步骤 | 检查 | 正常结果 | | --- | --- | --- | | 1 | 物理口 up 吗 | `Link Status: up` | | 2 | vSwitch 有上行口吗 | 上行口数量对得上 | | 3 | 端口组 VLAN 对吗 | 和物理交换机配置一致 | | 4 | 虚机网卡连上端口组了吗 | `适配器 1` 勾了端口组 | | 5 | 虚机里看到 IP 吗 | 有 IP 才谈通不通 | | 6 | ESXi 防火墙挡了吗 | 临时关掉测试 | 快速判断是不是 ESXi 防火墙: ```text 主机 → 管理 → 安全与配置 → 防火墙 → 关闭全部(临时) ``` 关掉虚拟机能通就说明是防火墙挡的,接着在防火墙里放行具体端口,别长期全关。 虚拟机里的虚拟网卡没连上端口组,是最容易漏的一步: ```text 虚拟机 → 硬件 → 虚拟网卡 → 勾上端口组(原来可能是「不连接」) ``` ### 3. 宿主机紫屏 / 卡死 ESXi 紫屏(Purple Screen)通常是硬件或驱动问题。 ```bash # 崩溃转储(重启后还在) ls -lh /var/core/ /usr/lib/vmware/vmware-core-dump /var/core/vmware-core-*.dump | less ``` 常见原因: | 现象 | 大概率原因 | | --- | --- | | 蓝屏 `PFN corruption` | 内存条坏了或双通道没插满 | | 紫屏 `NMI watchdog` | 固件或 CPU 稳定性 | | 紫屏 `LINT1` / `PCIE` | 插槽、PCIe 卡、供电 | | 紫屏 `I/O error` | 阵列卡、磁盘、RAID 卡固件 | | 紫屏 `TSL` / `e1000e` | 网卡驱动,换成 `e1000` 或更新网卡固件 | 处理顺序: ```bash # 1. 看硬件健康 esxcli hardware cpu global get esxcli hardware memory get # 2. 阵列卡状态(LSI/Broadcom 用这个) /opt/lsi/MegaRAID/merlincli "/c0 show all" | grep -E "State|Firmware" # 或 storcli /opt/storcli/storcli64 /c0 show all # 3. 日志里有没有硬件报错 grep -iE "hardware|error|fail" /var/run/log/hostd.log | tail -50 # 4. 禁用有问题的设备 esxcli device compass list esxcli device compass set -s vmnic1 -e false ``` 排查内存: ```bash # 看内存条和通道 esxcli hardware memory get # 4 条内存只插了 2 条,通道没插满,性能会掉一半 ``` ### 4. 磁盘空间告急 ```bash # 数据存储剩余空间 esxcli storage filesystem list # 占用最大的虚拟机目录 du -h -d 2 /vmfs/volumes/datastore1/ | sort -h | tail -20 # 找大文件(日志、快照、旧备份) find /vmfs/volumes/datastore1/ -size +5G -type f -exec ls -lh {} \; 2>/dev/null | head -20 ``` 空间不足的常见来源和处理: ```text 虚拟机快照没删 → 占的是原始盘大小的增量,删快照才真正释放 日志文件太大 → /var/log 下的一堆 .gz 旧 ISO 镜像 → 装完没删的安装介质 模板机留了副本 → 模板机本身占一份,克隆出来每台又占一份 孤儿虚拟磁盘 → 删了虚拟机但 .vmdk 还在 ``` 删快照的正确顺序(**先删虚拟机里的快照,再合并**): ```text 虚拟机 → 快照 → 管理快照 → 删除 ``` 不要直接去数据存储里删 `-delta.vmdk`,会毁掉虚拟机。 清孤儿磁盘(虚拟机已删、磁盘还在): ```bash # 先在 vCenter/ESXi 上确认虚拟机确实已删 grep -i "orphan" /var/log/vmkernel.log | tail -20 ``` ### 5. 虚拟机莫名重启 / 卡顿 ```bash # 宿主机整体负载 esxcli system stats uptime get esxcli hardware cpu global get # 存储延迟(重点看这个) esxcli storage core device stats list ``` 虚拟机被自动重启,先查是不是触发了 HA: ```text 主机 → 监控 → 事件 看 "VM heartbeat" 和 "APPD" ``` HA 把虚拟机重启掉,说明宿主机之间的心跳断了。常见原因: - 管理网络抖动(虚拟化流量和管理流量混在一条链路上) - 网卡做了链路聚合但交换机侧没配对 - 交换机 STP 收敛慢,导致短暂断链 卡顿(不重启但慢)多看存储: ```bash esxcli storage core device stats list | grep -A 10 "Device" ``` 关注 `KAVG`(内核延迟)、`GAVG`(设备延迟)和 `QAVG`(队列)。`KAVG` 大而 `GAVG` 小,说明是宿主机内部排队——通常是虚拟机数量太多或 CPU 超分配。 CPU 超分配检查: ```text 主机 → 监控 → 资源 → CPU 「已用容量」超过 100% 就是超分配了 ``` ### 6. 虚拟机时间漂移 / 证书告警 ```bash # 当前时间 esxcli system time get # NTP 状态 esxcli system ntp service list esxcli system ntp server list ``` 时间不对会导致: - vCenter 里虚机时间慢慢偏 - TLS 证书有效期校验失败 - 快照、备份的时间戳错乱 修: ```text 主机 → 管理 → 时间和日期 → 编辑 NTP 设置 服务器:ntp1.corp.local 服务模式:仅主机(和 NTP 服务器同步) 启动时同步:勾上 ``` 改完要重启一下服务,或者等下一个同步周期。 ### 7. 存储掉线 / 阵列卡异常 ```bash # 阵列卡状态 /opt/lsi/MegaRAID/merlincli "/c0 show all" | grep -E "State|Firmware" /opt/storcli/storcli64 /c0 show all | grep -E "State|Size" # 存储路径状态(Path State 必须是 Optimal) esxcli storage core path list # 如果是 degraded,看哪条路径断了 esxcli storage core path list | grep -A 5 "degraded" ``` 阵列卡固件不匹配是重灾区。ESXi 6.5/6.7 对 Broadcom/LSI 卡有明确的固件白名单, 固件太老或太新都可能导致阵列卡被 ESXi 挂掉、存储直接失联。 ```bash # 看 ESXi 认到的卡和驱动 esxcli hardware pci list | grep -i -A 3 "LSI\|Broadcom\|RAID" ``` 处理:进阵列卡的 CLI(Ctrl+R 或 storcli)升级固件到 ESXi 兼容列表里的版本。 **升级固件前一定要先备份配置**,阵列卡固件升级失败会导致数据全丢。 ## 验证 - 虚拟机能正常开机,`esxcli` 里没有新报错 - 虚机网络能通:`ping` 宿主机网关 → 虚机 IP → 业务地址 - 存储路径都是 `Optimal` - 数据存储剩余空间回到安全线(至少 20%) - 事件里没有持续刷新的 warning - 时间同步正常,`esxcli system ntp service list` 显示 synced ## 回滚 - 改 `.vmx` 前先备份:`cp xxx.vmx xxx.vmx.bak` - 改阵列卡固件前必须导出配置:`/opt/lsi/MegaRAID/merlincli "/c0 save_configfile xxx.cfg"` - 动存储前先确认有备份,别用「快照合并」当备份用 - 禁用网卡/设备前记下原状态,方便装回去 ## 坑 - **`.vmx` 改完不重新注册就不生效**,这是最常见的「我改了怎么没用」 - 删快照要在虚拟机里删,直接删 `-delta.vmdk` 会毁数据 - 阵列卡固件升级失败可能掉盘,升级前一定导出配置 - ESXi 装在 U 盘上,U 盘拔了或坏了,整机起不来 - vmk0 管理网络配错,只能去机房接显示器用 DCUI 改 - 内存条不插满通道,性能掉一半,但很多人不知道 - 虚拟化流量和管理流量走同一条链路,HA 容易误判 - ESXi 7 免费版没有 vCenter API,很多备份软件不支持 - `/var/log` 里的日志会一直涨,磁盘小的机器记得配 log rotation - 用 `esxcli` 改配置时,Web 界面的缓存可能覆盖你的改动,**改完刷新一下网页确认** - 快照链超过 3 层就很难清理了,能不用就不用