ESXi 数据存储消失:SATA 直通故障复盘
📝 ESXi 数据存储消失:SATA 直通故障复盘
💡 如果你的 ESXi 同时出现“数据存储为 0、虚拟机无效、SSH 仍可用”,先不要格式化或重建卷。按第 1 节判断设备到底消失在哪一层。
30 秒结论
先记住这条因果链
系统盘所在的 SATA 控制器被误开直通 → ESXi 看不到 HBA 和磁盘 → BOOTBANK / OSDATA 降级到内存盘 → VIB 验签失败只是表象。
图 1:从症状到恢复的完整因果链。可在 ProcessOn 查看或继续编辑。
0. 背景
适用版本与验证边界
本文基于 J4125、16GB 内存、ESXi 8.0.2 的一次真实故障。关键命令、设备归属和内核时间线来自本次真机排障;不同 ESXi 版本或硬件平台执行前,请先核对命令行为并保留配置备份。
家里的 All-in-One 主机:
| 项目 | 配置 |
|---|---|
| 平台 | Intel J4125(Gemini Lake)小主机 |
| 内存 | 16 GB |
| 系统盘 | 金百达 512G SATA SSD(ESXi 系统盘 + datastore1) |
| 网卡 | 4 × Intel I226 2.5G |
| 虚拟化 | VMware ESXi 8.0.2(sysin.org 打包镜像) |
| 虚拟机 | 爱快软路由(3 个物理网卡 PCI 直通) |
某次重启 ESXi 后,打开网页:
- 存储页面:数据存储计数 0——空空如也
- 虚拟机页面:爱快 VM 显示「无效」,配置路径指向
/vmfs/volumes/4f02eeb0-.../iKuai/iKuai.vmx
512G 的 SSD 就装在机器里,ESXi 却像一台”没插硬盘”的裸机一样运行着。
更诡异的是:系统还能开机、SSH 能登、密码和 IP 都还在——配置没丢,只是存储消失了。
1. 诊断决策树
flowchart TD
A[数据存储全部消失] --> B{esxcli storage core device list}
B -->|空| C[所有磁盘设备不可见]
C --> D{adapter list / vmfs/devices/disks}
D -->|空| E[连 HBA 适配器都没有]
E --> F{lspci 看 SATA 控制器}
F -->|设备存在| G{vmkchdev -l 看归属}
G -->|passthru| H[🎯 根因:SATA 控制器被 PCI 直通层抢占]
H --> I[手动加载 vmw_ahci 驱动]
I --> J[解除直通 → 磁盘/数据存储瞬间恢复]
J --> K[修复持久化 → 重启验证]
1.1 第一层:不是”卷丢了”,是”盘丢了”
SSH 登录(幸好 SSH 和密码配置还在),三条命令定位问题层级:
1 | esxcli storage filesystem list # 输出为空!连 BOOTBANK/OSDATA 都没有 |
关键判断:如果只是 VMFS 卷损坏/未挂载,至少能看到块设备(如 t10.ATA_____xxx)。连设备节点都没有,说明问题在存储驱动层之下——要么驱动没加载,要么控制器没交给 ESXi 内核。
1.2 第二层:干扰项——VIB 签名告警
dmesg 里翻到一条触目惊心的 ALERT:
1 | ALERT: Failed to verify signatures of the following vib(s): |
几乎所有 VIB 都”验签失败”?!第一反应:
- Secure Boot 开了,第三方打包镜像被拒?
- 启动分区数据损坏,签名校验不过?
逐项排除:
1 | dmesg | grep -i secureboot |
再深挖发现 /bootbank 指向了 /tmp/_bootbankxabv0jit(内存中的降级空目录),vdf -h 里所有挂载点全是 Ramdisk——根分区、/etc、osdata、configstore 全部跑在内存里。
⚠️ 此时很容易得出错误结论:”因为启动分区坏了 → VIB 验签失败 → 驱动不加载 → 看不到盘”。
因果其实是反的,这是本次排障最大的陷阱,下一节揭晓。
1.3 第三层:实锤——PCI Passthrough 劫持了 SATA 控制器
不纠结告警,直接看”谁在管这块 SATA 控制器”:
1 | lspci | grep -i sata |
passthru! 这块承载着系统盘的 SATA 控制器,在开机早期被 PCI 直通层(VM Passthrough) 从 ESXi 内核手里抢走了。
内核日志给出了精确时间线:
1 | 03:09:28.869 PCI: 0000:00:12.0 named 'vmhba0' (was '') ← 设备被枚举 |
1.4 完整因果链(倒推)
1 | (人为)在网页界面给 00:12.0 SATA 控制器开启了"直通" |
破案补充:这台机器爱快 VM 一直用 3 个 I226 网卡直通,一切正常——因为那 3 个口上没有系统盘。某次把 SATA 控制器也加入了直通(可能是想给 NAS 虚拟机直通硬盘),重启后系统盘控制器直接消失,于是”存储一夜蒸发”。
2. 修复
先保住数据
不要格式化 VMFS、不要新建数据存储、不要重装系统。先确认磁盘、HBA 和 SATA 控制器的归属,再执行恢复动作。
2.1 运行时恢复(不重启)
1 | # 1. 手动加载 AHCI 驱动(模块文件一直在内存 tardisk 里,只是没被激活) |
解除直通的那一秒,所有分区瞬间回归:
1 | /vmfs/volumes/4f02eeb0-... datastore1 VMFS-6 374467461120 353919565824 ← 数据回来了! |
爱快虚拟机也从「无效」恢复为正常,/bootbank 符号链接指回真实分区。
🐛 顺带踩了个工具坑:老牌命令
vmkchdev -v 0000:00:12.0在 8.0.2 上有进制转换 bug——把 16 进制的槽位12当成 10 进制转换成了0c,报Did not find PCI device at 0000:00:0c.0。遇到这个错直接用上面的localcli hardware pci pcipassthru set即可。
2.2 持久化(否则重启复发)
运行时的修改此时只会写进内存里的临时 bootbank,重启即失。所以:
1 | # 1. 把 bootbank 符号链接指回真实分区 |
ESXi 8 的持久化链路:hostd/configstore(内存)→ auto-backup.sh → state.tgz(AES 加密)→ BOOTBANK1 分区,下次开机由引导程序读回。
2.3 重启验证
1 | vmkchdev -l | grep 00:12 |
另外两处顺手修复:
- 系统时间停在 2012(主板纽扣电池没电的典型症状):配置 NTP
esxcli system ntp set -e true -s 203.107.6.88 -s 106.55.184.199 /etc/vmware/passthru.map末尾有一条手工添加的8086 31e3 d3d0 fasle(还拼错了 false)——这条只是直通重置方式的提示表,不是本次故障根因,但留着容易误导后人,建议清理。
3. 教训与红线
- 系统盘所在控制器,永远不要开直通。 开直通前先
vmkchdev -l确认设备上挂着什么。 - 直通的代价是”重启后才爆”: 界面上点完开关一切正常,提示”需重启”,重启完才崩——间隔让人无法把两件事关联起来。
- “所有 VIB 验签失败” ≠ 镜像坏了。 它可能是 bootbank 不可达的结果。看到这条 ALERT 先查
/bootbank指向哪、vdf -h是不是全内存盘,再下结论。 - 配置”还在”但 esx.conf 变干净 也是同款症状:密码/网络来自 state.tgz 的其他部分,而 esx.conf 被 configstore 同步降级成了默认值。
- 修完务必做持久化验证(重启一次),并留一份
state.tgz备份到别处:
1 | /sbin/auto-backup.sh |
4. 恢复后检查清单
- [ ]
vmkchdev -l中 SATA 控制器归属已经恢复为vmkernel - [ ]
esxcli storage filesystem list能看到并自动挂载datastore1 - [ ]
/bootbank指向真实的BOOTBANK1,而不是/tmp下的临时目录 - [ ]
state.tgz已通过auto-backup.sh重新生成,并复制到其他设备 - [ ] 完整重启一次,确认存储、虚拟机和 SSH 均正常
- [ ] 记录本次变更,避免后人再次把系统盘控制器设为直通
后续重建与四台虚拟机的部署过程,见 J4125-All-in-One折腾笔记。
排障工具速查:
lspci/vmkchdev -l(设备归属)/vmkload_mod <mod>(手动加载驱动)/esxcli storage core adapter rescan --all/vdf -h(看内存盘)/dmesg(时间线)。






