首页 / 资讯中心 / 文章详情

ESXi 升级后 Datastore 容量显示 0?一篇讲透 vmfs 缓存清空 + 实战恢复步骤

ESXi 升级后 Datastore 容量显示 0?一篇讲透 vmfs 缓存清空 + 实战恢复步骤 ★ FEATURED ARTICLE
本文适用版本:ESXi 7.0 U3 / 8.0 U2 / 9.0 GA阅读时长:约 6 分钟难度:⭐⭐(5 分钟救回来,前提是别乱点 Remove Datastore)一、真实案例:一个差点搞出故障的零容量告警10:02 客户微信:张工,刚升级完 ESXi 7.0 到 8.0,生产 datastore 容量显示 0,VM 还在跑,但 vCenter 已经红了。10:05 我远程看了下 vCenter:Datastore Prod-DS-01 显示 Capacity: 0 B / Free: 0 B / Provisioned: 800 GB。VM 列表里 18 台生产机,运行状态全绿。10:08 SSH 进 ESXi,跑df -h:一切正常,容量 2 TB,已用 1.4 TB。10:12 定位:vmfs 缓存条目不刷新。跑esxcli storage vmfs datastore unlistrescan,5 秒后容量回来。10:14 客户:就这?——是的,就这。关键提醒:遇到Datastore 容量显示 0,但 VM 还在跑、SSH 进 ESXi 也能正常看到磁盘,基本就是缓存问题。千万别点 vCenter 里的 Remove Datastore,会真的让 ESXi 卸载挂载点,导致 VM 失联。二、先搞清楚:为什么 vCenter 显示 0?ESXi 的 datastore 元数据有三层缓存:┌─────────────────────────────────────────────────┐ │ vCenter 数据库 ← vSphere Client 显示的来源 │ ├─────────────────────────────────────────────────┤ │ hostd 内存缓存 ← 主机 agent 的 datastore 列表 │ ├─────────────────────────────────────────────────┤ │ VMFS 卷头 vmkernel 实时视图 ← 真实数据 │ └─────────────────────────────────────────────────┘升级触发的两个事件:升级过程中hostd 重启,内存缓存被清空某些情况下VMFS 卷头被 vmkernel 重新校验,UUID 可能微调vCenter 看到的0 容量其实是vCenter 数据库里还残留着旧条目,而 hostd 已经重新挂载了一份新的,两边对不上。三、3 步定位:确认是缓存问题还是真坏了# 第 1 步:看 ESXi 真实看到的 datastore esxcli storage filesystem list # 看 VMFS UUID 字段 # 第 2 步:看后端物理磁盘是否正常 esxcli storage core device list | grep -E naa|Size # 第 3 步:对比 vCenter 显示的 datastore 名字 # vCenter 里看到的 Datastore 名字 vs ESXi 里 mount 名字结论对照表:esxcli 输出vCenter 显示结论正常容量0 容量 缓存问题,5 分钟修找不到 datastore0 容量 datastore 没挂上,需要手动 mount找不到磁盘0 容量 存储端问题,检查 LUN mapping磁盘被格式化为 EXT40 容量 数据可能被破坏,马上停手四、解法:5 秒救回 datastore 缓存步骤 1:让 ESXi 忘记这个 datastore(不会删数据)esxcli storage vmfs datastore unlist --nameProd-DS-01 # 注意:不是 remove!unlist 只是从内存列表里摘掉步骤 2:重扫整个存储# 重扫所有 HBA esxcli storage core adapter rescan --all # 或者只重扫特定 HBA(更精准) esxcli storage core adapter rescan --adapter vmhba1步骤 3:重新挂载 VMFS# 自动挂载所有检测到的 VMFS esxcli storage vmfs datastore mount --all # 或者挂载单个 esxcli storage vmfs datastore mount --nameProd-DS-01验证:esxcli storage filesystem list # 应该看到 Capacity / Free 都恢复正常回 vCenter 看,等 30 秒左右(vCenter 数据库同步有延迟),容量就回来了。五、另一种解法:重启 hostd 让它重新读取如果上面的步骤没生效(可能是 hostd 内部缓存被锁),重启 hostd 也行:# 重启 hostd(VM 不会中断) /etc/init.d/hostd restart # 等 30 秒,vCenter 会自动重连 # 加强版:同时清 vpxa 缓存 /etc/init.d/vpxa stop /etc/init.d/hostd restart sleep 30 /etc/init.d/vpxa start六、如果上面两步都没救回来——深挖6.1 datastore 没自动挂载(常见)# 看哪些 VMFS 被检测到但没挂载 esxcli storage vmfs datastore list # 看 Is Mounted 字段 # 手动挂载(按 UUID) esxcli storage vmfs datastore mount --uuidUUID6.2 存储端 LUN 路径变了# 1. 看主机上的存储路径 esxcli storage core path list # 2. 重新认领磁盘(认领后会自动扫描) esxcli storage core claiming reclaim --device naa.600601609430280048fc1dde3b3ce911 # 3. 再 rescan esxcli storage core adapter rescan --all6.3 ⚠️ 磁盘真的被格式化成其他文件系统如果有人(或者升级脚本)不小心把 VMFS 卷格式化了:# 看磁盘上的文件系统签名 esxcli storage filesystem list # 如果看到 VMFS 没了,出现 ext4 或 ntfs,立即停手 # ⚠️ 这种情况下数据可能还在,但文件系统头损坏 # 必须用专业数据恢复工具,不要自己 mount七、防患于未然:写个一键自愈脚本#!/bin/bash # fix_datastore_cache.sh # 用法:在 ESXi 上跑 ./fix_datastore_cache.sh Prod-DS-01 DS_NAME$1 echo 重置 datastore 缓存:$DS_NAME # 1. 卸载有问题的缓存条目 esxcli storage vmfs datastore unlist --name$DS_NAME 2/dev/null # 2. 重扫存储 esxcli storage core adapter rescan --all sleep 5 # 3. 重新挂载 esxcli storage vmfs datastore mount --name$DS_NAME sleep 3 # 4. 验证 echo 验证结果 esxcli storage filesystem list | grep $DS_NAME if [ $? -eq 0 ]; then echo ✅ 恢复成功 else echo ❌ 恢复失败,需要人工介入 exit 1 fi放进 vCenter 的定时任务或 ESXi 的 cron 里,每天凌晨自检一遍。八、速查命令卡(可收藏转发)# 1. 5 秒修复缓存 esxcli storage vmfs datastore unlist --name你的DS名字 esxcli storage core adapter rescan --all esxcli storage vmfs datastore mount --name你的DS名字 # 2. 重启 hostd 兜底 /etc/init.d/hostd restart # 3. 重新认领磁盘 esxcli storage core claiming reclaim --device naa.xxx # 4. 看真实容量 esxcli storage filesystem list # 5. 验证 vCenter 30 秒后会自动同步
阅读完成 · 觉得有帮助?
咨询建站