theme: default themeName: "默认主题" title: "VMware虚拟机起不来?我把5年踩坑经验整理成这份排查清单"
前言
VMware虚拟化环境里,虚拟机起不来是日常。报错信息五花八门——"无法获取虚拟机所有权"、"无法打开电源"、"已存在同类虚拟机"、"无法挂载虚拟磁盘"……每一种报错背后都有不同的成因。
这篇文章把笔者这些年踩过的坑浓缩成一份清单,不讲虚的,直接给排查路径和解决方案。遇到问题直接查目录,对号入座。
场景一:虚拟机已存在,无法注册
报错关键词: `Unable to add machine. The virtual machine is already in use.`这类报错通常意味着VM的"锁文件"还挂在目录里,ESXi认为这台VM正在被另一台主机使用。这种情况在强制关机、vMotion中断、主机断电后常见。
排查步骤:# SSH连接到ESXi主机
ssh root@your-esxi-host
找到出问题的虚拟机目录
cd /vmfs/volumes/你的存储卷/你的虚拟机名称/
查看所有文件(包括隐藏锁文件)
ls -la
查找 .lck(锁文件)目录或文件
find . -name ".lck" -o -name ".vmdk*.lck"
锁文件类型解释:
- `.lck/` 目录 + 里面包含锁描述文件 = 软锁(正常情况可能是意外残留)
- `*-ctk.vmdk.lck` = 快照相关锁
- `*-000001.vmdk.lck` = delta盘相关锁
# 确认虚拟机确实没有在其他ESXi主机上运行后,删除锁目录
rm -rf .lck/ rm -rf .lck
如果锁文件名有特定格式,精确删除
rm -f /vmfs/volumes/datastore1/VMNAME/.lck
⚠️ 警告:执行删除前务必确认VM没有在其他主机上运行,否则可能造成数据损坏。进阶排查——检测残留锁:
# 查看当前所有VM的锁状态
esxcli vm process list
如果VM处于 Running 状态但你确信它已关闭,说明状态异常
重启 hostd 服务(需要进入维护模式或不在线迁移VM)
/etc/init.d/hostd restart
场景二:无法打开虚拟机电源
报错关键词: `Cannot power on: The virtual machine cannot be powered on because it requires the NX/XD bit to be present.`这个报错说明虚拟机的CPU虚拟化特性配置与当前物理CPU不匹配。最常见的原因是:创建VM时勾选了"Intel VT-x/AMD-V"但BIOS里没有开启;或者反过来,用了旧版虚拟化兼容模式。
排查步骤:# SSH登录ESXi
查看VM的CPU配置
vmware -v
cat /proc/cpuinfo grep -E "vmx svm" # 检查CPU是否支持硬件虚拟化
查看VMX文件中的虚拟化配置
grep -E "vh.enable nvram" /vmfs/volumes/存储/VM/VMNAME.vmx
最常见的原因:BIOS里VT-x/AMD-V被禁用了
需要进入服务器BIOS(开机时按F2/Del等键进入Setup),找到以下选项并启用:
- Intel服务器:`Intel(R) Virtualization Technology` → `Enabled`
- AMD服务器:`SVM Mode` → `Enabled`
同时在vSphere Client里检查VM的配置:
# 在ESXi上直接修改VMX文件,强制使用虚拟化指令集
编辑 VMNAME.vmx
vh.enable = "TRUE" # 启用虚拟化 cpuid.1.ecx.inteldep = "0:----:----:-:--:-:-:-:-" # 兼容性调整(实际值需要查官方文档)
注意:修改VMX文件前先备份,修改后需要从Inventory移除再重新注册VM。
场景三:虚拟机硬盘空间耗尽
报错关键词: `Not enough space`、`Unable to allocate`、`disk is full`虚拟磁盘满了会导致VM进入只读模式或直接崩溃。排查前先搞清楚是虚拟磁盘文件本身超过限制还是ESXi数据存储物理空间耗尽。
# SSH到ESXi
查看所有数据存储的使用情况
esxcli storage filesystem list
查看指定VM的虚拟磁盘文件大小
ls -lh /vmfs/volumes/datastore1/VMNAME/*.vmdk
查看VM的 Thin Provision(精简置备)已分配 vs 实际使用
vmkfstools -K /vmfs/volumes/datastore1/VMNAME/disk.vmdk # 查看已用空间
数据存储满了的处理方案:
# 方案一:删除快照(快照会消耗大量空间)
vim-cmd vmsvc/snapshot.get 虚拟机ID vim-cmd vmsvc/snapshot.remove 虚拟机ID # 删除所有快照
方案二:迁移到其他数据存储
通过vSphere Client迁移VM存储
方案三:扩大现有虚拟磁盘(需先确认存储有空间)
vmkfstools -X 200G /vmfs/volumes/datastore1/VMNAME/disk.vmdk
预防措施:
生产环境建议开启存储告警,阈值设为使用率80%时触发:
# 在vCenter里用PowerCLI设置告警
Connect-VIServer -Server vcenter.example.com
Get-Datacenter -Name "数据中心" New-AlarmDefinition -Name "存储空间告警" -Metric "DatastoreDiskUsedSpace" -Threshold 80
场景四:vmdk虚拟磁盘文件损坏
报错关键词: `The parent virtual disk has been modified since the child was created`、`Failed to lock the file`快照链断裂或非正常关机后,VMDK描述符文件可能与实际磁盘头不一致。
# 检查VMDK描述符文件(正常情况下只有几十字节)
cat /vmfs/volumes/datastore1/VMNAME/disk.vmdk head -20
正常输出示例:
# Disk DescriptorFile
CID=12345678
parentCID=ffffffff
createType="vmfsLinkedClone"
parentFileNameHint="parent-disk.vmdk"
# Extent description
RW 419430400 VMFS "parent-disk-flat.vmdk"
VMDK损坏的修复方法:
# 从 flat.vmdk 重建描述符文件
1. 先确定flat盘的实际大小(字节数)
stat -c %s /vmfs/volumes/datastore1/VMNAME/disk-flat.vmdk
2. 计算扇区数(大小 / 512)
假设是 85899345920 字节,则扇区数 = 167772160
3. 创建新的描述符文件
vmkfstools -c 85899345920 -d thin -a lsilogic /vmfs/volumes/datastore1/VMNAME/new-disk.vmdk
4. 将原flat盘映射到新描述符
修改新描述符文件中的 extent description,指向原flat盘
5. 替换原描述符
mv new-disk.vmdk disk-broken.vmdk.bak
编辑 new-disk.vmdk,把 Extent description 改为 RW 167772160 VMFS "disk-flat.vmdk"
这个过程有一定风险,建议操作前对整个VM目录做一次快照或完整备份。
场景五:VM内存不足导致崩溃
虚拟机分配了过多内存导致ESXi宿主内存压力过大,触发内存气球(balloon)回收或直接OOM。
# 在ESXi上查看内存使用情况
esxcli hardware memory get esxcli software acceptance get
查看各VM的实际内存使用
esxcli vm process list
查看内存气球活动
vm-support -v
或者用esxtop,按M切换到内存视图
esxtop
快速缓解措施:
# 对指定VM强制重启(紧急情况)
vim-cmd vmsvc/power.reset 虚拟机ID
减少VM分配的内存(需要先关闭VM)
编辑 .vmx 文件
mem.hotadd = "FALSE" sched.mem.max = "2048M" sched.mem.minsize = "512M"
场景六:网络适配器丢失
VM启动后网络不通,在ESXi里发现网卡不见了。
# 查看VM的网络适配器状态
vim-cmd vmsvc/get.config 虚拟机ID grep ethernet
检查ESXi主机的物理网卡状态
esxcli network nic list
检查交换机配置
esxcli network vswitch standard list
常见原因及解决:
# 原因1:MAC地址冲突
编辑VMX文件,移除旧的MAC地址配置,让系统重新生成
删除以下行(如果有):
ethernet0.addressType = "static"
ethernet0.address = "00:50:56:XX:YY:ZZ"
添加:
ethernet0.addressType = "vpx"
原因2:VMkernel端口未绑定物理网卡
esxcli network vswitch standard uplink add -v vSwitch0 -u vmnic0
原因3:防火墙阻止了VM流量
esxcli network firewall ruleset list esxcli network firewall ruleset set --ruleset-id=vmotion --enabled=true
场景七:ESXi主机时间不同步
VM里应用报错、证书验证失败、AD域认证异常——这些症状有时候不是应用的问题,而是ESXi主机时间和VM内部时间不一致。
# 检查ESXi主机时间
esxcli system time get
检查NTP状态
cat /etc/ntp.conf grep server
/etc/init.d/ntpd status
如果NTP服务停了
/etc/init.d/ntpd start chkconfig ntpd on
手动同步一次时间
ntpdate -q pool.ntp.org # 先测试 ntpdate pool.ntp.org # 正式同步
注意:ESXi主机时间影响其上所有VM的时钟基准。如果ESXi时间比VM快8小时,VM内部系统时间即使配置正确,显示也会偏差。VMtools同步依赖于此。
结语
VMware故障排查没有银弹,但大多数问题都有规律可循。熟悉ESXi的命令行工具、了解锁文件和VMDK的结构、掌握数据存储的使用监控,这三件事做到位,能解决80%的日常故障。
建议把这份清单存一份放在手边,下次VM起不来的时候,对照报错信息直接查对应场景,效率至少翻倍。
希望本文的教程对你有所帮助。如有疑问或需要专业技术支持,可通过以下方式联系我们:
📞 服务热线:13708730161 💬 微信:eyc1689 📧 邮箱:service@eycit.com
易云城IT服务,您身边的IT专家。