说实话,我遇到过好几次这种让人血压飙升的场面:早上打开VMware Workstation,想继续昨晚没调完的测试环境,点了“开启此虚拟机”,结果客户机要么卡在启动界面半天没反应,要么直接弹出一句“客户机操作系统已禁用 CPU。请关闭或重置虚拟机”,更离谱的是有时候报“VMware Workstation无法连接到虚拟机。请确保您有权运行该程序、访问该程序使用”。折腾了大半天权限、重装、检查配置,最后发现罪魁祸首居然是宿主机硬盘被虚拟机镜像文件塞满了——剩余空间只剩几百MB,虚拟机当然起不来。
这篇文章我打算把这类“VMware虚拟机因硬盘占用过大导致无法启用”的问题完整梳理一遍:怎么从现象反推根因、怎么在宿主机和客户机两侧做排查、如何清理快照和收缩虚拟磁盘、什么情况下必须扩容、以及日常怎么维护才能避免再次踩坑。
这不是针对特定某一个版本的教程,只要是VMware Workstation/Pro,不管宿主机是Windows还是Linux,排查思路基本都是通用的。如果你正好被“虚拟机起不来”折磨,建议按顺序看下去。
1. 问题现象与根因分析
1.1 虚拟机“无法启用”的典型表现
先说症状,方便大家对号入座。我实际遇到过的虚拟机异常表现大概有这几类:
- 虚拟机启动到一半进度条长时间不动,进入系统后任何操作都卡顿。
- VMware直接报错,比如“客户机操作系统已禁用 CPU。请关闭或重置虚拟机”,或者“VMware Workstation无法连接到虚拟机”。
- 虚拟机内部服务突然不可用,数据库或应用写入直接报磁盘空间不足。
- 宿主机剩余空间为0时,有些虚拟机还会出现镜像文件“损坏”的提示,实际上只是写入失败导致的文件系统元数据异常。
- 更隐蔽的情况:虚拟机可以启动,但客户机内部看到磁盘已满,各种命令都执行不了。
这些现象有一个共同点:它们都很容易被误诊。有人先怀疑是VMware许可证过期,有人重新安装VMware Tools,有人干脆把虚拟机删了重建。但根据我的经验,只要宿主机可用空间告急,上面任何一条都可能发生,而且经常是多个症状同时出现。
为什么会这样?虚拟机的所有磁盘I/O最终都要落到宿主机硬盘上的镜像文件里。宿主磁盘一旦没有可写空间,客户机的“写操作”就无处落地,相当于整个系统被抽掉了写能力,表现自然千奇百怪。
1.2 为什么硬盘占满会让虚拟机直接罢工
要理解这一点,得先搞清楚VMware虚拟磁盘的文件结构。虚拟机的硬盘通常由一个或多个.vmdk文件构成。默认的“动态分配”模式(thin provisioning)意味着这个文件的大小会随着客户机内部实际写入的数据量逐渐增长。比如你创建虚拟磁盘时设置最大容量为50GB,刚装完系统时可能只有3GB,但用了一段时间后,文件会慢慢膨胀到30GB甚至更多。每一次文件增长,都需要宿主机额外分配磁盘空间。
更要命的是快照机制。一旦给虚拟机创建了快照,VMware就会生成一个或多个-delta.vmdk增量文件。后续虚拟机内部的所有写入都会落到这些增量文件中,而原始vmdk被冻结。这意味着客户机内部删除文件,也不会释放宿主机空间——因为删除动作本身也是一次“写入”,在快照场景下,它是往增量文件里写一条“删除标记”。
所以你会看到这样的情况:客户机里删了几个大文件,可用空间明明变多了,但宿主机上虚拟机目录的体积反而更大了。这就是快照在暗中扩张。
另外还有几个容易忽略的文件:交换文件(.vmem)、挂起文件(.vmss)、锁定目录(.lck)。这些文件一般不占太大空间,但在虚拟机异常退出时会残留,宿主机空间紧张时它们就是压垮骆驼的最后一根稻草。
明白这层机制之后,后面的排查方向就很清晰了:释放宿主机可用空间,或者限制虚拟磁盘继续膨胀,就能解决大部分问题。
2. 磁盘占用排查:先搞清楚空间消失在哪里
排查的第一步永远是定位空间被谁吃掉了,而不是盲目清理。我见过有人一上来就删日志,结果问题根本不在日志那里;也有人直接在客户机里删了一堆文件,宿主机空间却一分没降——因为快照挡住了空间释放。
2.1 客户机内部排查思路
如果虚拟机还能勉强进入系统,先看看客户机内部的情况。这是最直观的路径。
Linux客户机用df查看分区使用率:
df -h再用du找出大目录:
du -h --max-depth=2 / 2>/dev/null | sort -hr | head -30常见的空间黑洞集中在这些位置:
- /var/log下的日志文件堆积,尤其是journal日志。
- /tmp目录下的临时文件。
- Docker镜像和容器日志,/var/lib/docker的体积会大得惊人。
- 包管理器缓存,比如/var/cache/apt或/var/cache/yum。
- MySQL/PostgreSQL等数据库的数据文件。
- 用户home目录下的下载文件和core dump文件。
Windows客户机更简单,磁盘管理界面就能看到基本使用情况。右键C盘-属性,看常规和清理,也可以运行cleanmgr清理系统文件、Windows更新缓存、临时文件等。
不过我要提醒一句:客户机内部的清理只是第一步。对动态磁盘来说,删除了客户机里的文件,vmdk并不会自动缩小,宿主机空间可能依然紧张。客户机内部清理主要是恢复客户机自己的可用空间,宿主机层面的释放还需要配合3.3节的操作。
2.2 宿主机层面的磁盘镜像分析
客户机查完,再看宿主机上虚拟机目录的情况。在“虚拟机设置-硬件-硬盘”里可以看到磁盘文件的完整路径,打开这台虚拟机所在的目录。
Windows宿主机上我习惯用脚本或工具分析目录大小:
Get-ChildItem "D:\VMs\YourVM" -Recurse | Measure-Object -Property Length -Sum或者用WizTree、TreeSize这种可视化工具,一眼就能看出哪个文件最大。正常情况下你会看到:
- 一个或多个vmdk文件,这是虚拟磁盘本体。
- 可能有多个-delta.vmdk文件,代表快照链。
- .vmx配置文件,很小。
- .vmem或.vmss文件,挂起或崩溃时产生。
Linux宿主机上直接看文件体积:
ls -lah /var/lib/vmware/Virtual\ Machines/你的虚拟机/重点观察三件事:
- 主vmdk的体积是否远大于客户机内的实际使用量,如果差距很大说明磁盘膨胀严重。
- 是否存在多个delta文件,各自体积多大,合计占了多少空间。
- 有没有.vmss和.vmem残留,异常断电后容易产生。
2.3 快照文件是隐藏的磁盘杀手
快照文件的增长往往最隐蔽。VMware的快照管理器界面只显示快照名称和创建时间,不显示体积,很多人根本不知道自己的快照已经占了几十GB。
在VMDK目录里可以看到具体体积。正常情况下,你应该只有一个基础vmdk。一旦出现了多个-delta.vmdk,而且体积很大,基本能断定快照堆积严重。
判断快照空间的命令行操作也很有用。如果安装了vmware-vdiskmanager工具,可以执行:
vmware-vdiskmanager.exe -lLinux下同样有vmware-vdiskmanager,列出所有虚拟磁盘的完整信息。
快照为什么这么麻烦?因为删除快照并不像删除普通文件那样简单。删除快照需要把增量数据合并回基础vmdk,这是一个写入密集的操作,特别依赖宿主机剩余空间。如果宿主机空间不足,合并可能中途失败,导致快照既删不掉、虚拟机也起不来——这就进入了最棘手的“半卡死”状态。第5节我会详细讲这种情况怎么处理。
3. 实际解决操作全流程
问题定位清楚了,下面进入实操。按照从易到难的顺序:先做客户机清理,再做快照合并和磁盘压缩,最后才是扩容。
3.1 删除无用文件与日志清理
客户机内部清理建议先做,因为这一步能同时恢复客户机可用空间,后续操作会更顺畅。
Linux客户机,我一般执行这几条:
# 清理apt缓存 apt-get clean # 清理journal日志(保留最近5天) journalctl --vacuum-time=5d # 清理临时文件 rm -rf /tmp/*清理Docker非常关键,很多人没注意这一点:
docker system prune -a -f docker builder prune -f清理Docker这步很可能直接释放几个GB甚至几十GB。清理完再用df -h复查空间。
Windows客户机,推荐以下操作:
- 运行cleanmgr,勾选“系统文件清理”,把Windows更新缓存、旧系统文件一起清理。
- 删除C:\Windows\Temp和C:\Users<用户名>\AppData\Local\Temp下的文件。
- 清理浏览器缓存和下载目录。
- 如果启用了休眠,用powercfg /h off关闭休眠,可以释放出接近物理内存大小的空间。
清理完客户机内部空间恢复了,但宿主机上的vmdk文件可能并没有变小。这一步只是“止血”,真正让vmdk瘦身还要继续往下看。
3.2 从宿主机直接清理快照与临时文件
宿主机层面的清理主要是三件事:删除不需要的快照、清理残留的临时文件、压缩vmdk。
删除快照的入口在“VMware Workstation-虚拟机-快照-快照管理器”。选择不需要的快照,点击“删除”,系统会把增量数据合并回父级磁盘。建议从最老的非当前快照开始删,先删链条顶端的,再逐步往下删。好处是每次合并的数据量相对较小,降低失败概率。
如果快照合并过程中报“空间不足”,说明宿主机可用空间还是不够。这时候可以先把宿主机上其他盘的大文件临时转移到外部存储,给虚拟机目录腾出空间,再执行删除快照。等删除操作完全结束后,再把文件移回去。
临时文件的清理也重要。虚拟机异常断电后,目录下可能残留.lck锁定目录,这些目录会导致启动报错。虚拟机关机状态下,删除.lck目录完全没风险。还有.vmem和.vmss文件,如果不用恢复挂起前的状态,直接删掉。
清理完以后,对比一下目录体积变化,你会发现空间释放非常明显。这时候再启动虚拟机,基本已经能正常起来了。但vmdk该大的还是大,接着看下一节。
3.3 磁盘收缩与压缩的正确姿势
客户机内部删了文件、快照也清理完了,vmdk文件可能还是那么大。这是因为VMware不会自动把已删除的数据真正从vmdk中抹去。想让vmdk瘦身,必须主动执行“收缩”。
Windows客户机的标准流程:
- 在客户机内对磁盘做碎片整理,把零散区块合并,为后续清零创造条件。
- 用工具把空闲空间清零,最常用的是Sysinternals的sdelete:
sdelete -z C:- 干净地关闭客户机。
- 在宿主机上执行收缩:
vmware-vdiskmanager.exe -k "你的虚拟机磁盘路径.vmdk"Linux客户机的流程类似:
- 用fstrim通知底层存储回收未使用块:
fstrim -av- 或者用dd写入零值,这是最稳妥的清零方法:
dd if=/dev/zero of=/tmp/zero.fill bs=1M rm -rf /tmp/zero.fill- 关机后宿主机上执行收缩:
vmware-vdiskmanager -k "你的虚拟机磁盘路径.vmdk"几个必须知道的坑:
- 存在快照的时候,VMware默认不允许收缩操作,所以要先删干净快照再执行。
- 收缩前一定做好备份。这个过程会重写vmdk,如果中途断电或崩溃,虚拟磁盘可能损坏。
- 虚拟磁盘如果是独立持久模式(Independent-Persistent),无法收缩。
- VMware Workstation对收缩的支持比ESXi弱一些,如果收缩失败,可以检查VMware Tools是否正常安装,或者改用其他方式,比如克隆迁移。
遇到收缩不理想的情况,有个备选方案:先用vmware-vdiskmanager把磁盘转换成另一种格式再转回来,比如从单文件转成2GB分片格式,再转回单文件,空间也能得到一定整理。这个方法比较绕,但对某些顽固的vmdk有效。
4. 扩容方案:从根本解决空间不足
如果清理完空间,虚拟机磁盘本身也已经达到设定的容量上限,那就要考虑扩容了。扩容不只是调大设置里的数字,后面还有分区调整的步骤,一步都不能少。
4.1 扩容前必须做的准备工作
扩容之前先确认几个信息。
第一,虚拟磁盘的总线类型。IDE还是SCSI(SATA/NVMe)。不同总线在部分版本的VMware Tools支持上有差异,会影响客户机识别扩容后的磁盘。
第二,客户机分区表格式。MBR分区表最大只支持2TB单分区,GPT则没有这个限制。如果要从1TB扩到2TB以上,得先把MBR转GPT。
第三,有没有残留的快照链。扩容操作建议在快照删除之后进行,否则可能扩展失败。
准备工作按顺序做:
- 关闭虚拟机。扩容操作建议在关机状态下进行,虽然VMware支持在线扩容,但边界情况更容易出错。
- 如果担心操作失误,先创建一份完整快照或者备份整个虚拟机目录。不过要注意:备份也会占用宿主机空间,如果宿主机空间已经不多了,先腾地方再备份。
- 查看当前磁盘容量和客户机内分区使用率,确定扩容的目标大小。
4.2 磁盘扩容操作步骤
在VMware Workstation中扩容:
- 打开“虚拟机设置-硬件-硬盘”,选中要扩容的虚拟硬盘。
- 右侧“磁盘实用工具”区域点击“扩展”。
- 输入新的磁盘大小,单位是GB。注意只能扩大不能缩小,所以要一次想清楚最终需要多大。
- 点击“扩展”后,VMware会开始扩展vmdk文件。等界面提示完成。
如果虚拟机由VMware vSphere/ESXi管理,扩容在Web控制台的“编辑设置-硬盘-容量”里操作,效果类似。
扩容完成后,客户机内部不会自动识别新空间。必须进入客户机做分区调整才能使用。
4.3 扩容后分区调整
Windows客户机:
打开“磁盘管理”(Win+X选择磁盘管理),你会发现当前系统盘后面多了一块未分配空间。右键系统分区,选择“扩展卷”,按向导把未分配空间合并进去。如果扩展卷按钮是灰色的,最常见的原因是系统分区和未分配空间之间隔着一个恢复分区或其他分区,需要先把中间分区处理掉,或者用第三方分区工具(比如DiskGenius、MiniTool Partition Wizard)来调整。
Linux客户机:
如果系统盘是LVM,直接一套组合拳:
# 刷新LVM PV大小 pvresize /dev/sda # 扩展逻辑卷 lvextend -l +100%FREE /dev/mapper/你的vg-你的lv # 扩展文件系统(ext4用resize2fs,xfs用xfs_growfs) resize2fs /dev/mapper/你的vg-你的lv如果是传统parted分区表,调整流程稍复杂:
# 查看当前分区编号 fdisk -l # 用parted扩展分区边界 parted /dev/sda resizepart 1 100% # 扩展文件系统 resize2fs /dev/sda1分区调整完成后用df -h确认新空间已经可用。
这里想特别提醒一句:扩容操作虽然不复杂,但操作前一定要想清楚目标容量,因为vmdk本质上是个稀疏文件,扩容后即使分区没有使用,文件体积也可能增长。扩容要适度,别贪多。
5. 常见问题与避坑清单
5.1 启动失败时的应急处理
如果虚拟机已经完全打不开,最紧急的目标是先让虚拟机能启动,再考虑清理。
第一步,检查虚拟机目录里有没有.lck目录。VMware在虚拟机运行时会创建一个.lck目录用于锁定,如果虚拟机非正常关闭,这个锁定目录会残留,导致“VMware Workstation无法连接到虚拟机”之类的错误。虚拟机关机状态下,直接删除这些.lck目录即可。
第二步,检查.vmss挂起文件。如果虚拟机上次是挂起而不是关机,VMware启动时会尝试恢复挂起状态。如果这个文件损坏,启动会直接失败。如果不在乎上次挂起时的状态,删掉.vmss文件,让虚拟机从干净状态启动。
第三步,如果异常退出导致快照不完整,进入快照管理器,尝试删除损坏的快照,或选择恢复到某个正常的时间点。
这些应急操作不能解决磁盘空间问题,但能帮你把虚拟机从“完全不可用”的状态捞回来。捞回来之后,再回到第2节和第3节的正常排查流程。
5.2 磁盘清理后的典型误区
这里整理一些我在实际中见过的、容易让人误入歧途的做法:
- 不要直接删除vmdk文件。哪怕你确认它“没用”,删除后虚拟机等于直接报废。
- 不要直接在文件管理器里剪切/移动虚拟机目录。VMware对路径变化很敏感,移动之后可能无法识别,正确做法是用“虚拟机-管理-更改虚拟机目录”或重新注册vmx文件。
- 不要在客户机运行的时候对vmdk文件做任何操作,包括压缩、收缩、改名。
- 不要在快照管理器里删除快照之后马上关机。删除快照意味着合并delta文件,需要等待进度条完全走完再关机,否则会中断合并。
- 清理宿主机磁盘时,注意别把Windows系统盘清理到没有运行空间。VMware Workstation本身和临时文件都依赖系统盘空间,系统盘被塞满同样会导致各种诡异报错。
- 收缩操作后,如果想验证vmdk变小了,建议在宿主机文件管理器里刷新一下再看大小,有时候显示有延迟。
5.3 日常维护建议
踩了不少坑之后,我现在的维护习惯其实很简单,但确实有效:
- 给宿主机预留足够的剩余空间,建议至少20%以上。虚拟机的峰值扩展需求往往比预期高。
- 定期检查快照,建议最多保留1-2个短期快照,按时删除旧快照。
- 客户机内部至少每季度做一次日志和缓存清理。特别是日志服务、数据库日志这类持续增长的部分。
- 创建虚拟磁盘的时候,不要贪大但也不要太抠。现在大部分场景建议直接给客户机足够的空间,减少频繁扩容的风险。如果确实用不完,宁可把空间给到40GB而不是100GB,避免vmdk无谓膨胀。
- 重要虚拟机开启VMware Tools的磁盘空间预警,结合宿主机监控,剩余空间低于阈值时提前处理。
- 定期备份虚拟机。备份不代表万事大吉,但能确保最坏情况下可以快速恢复。
我个人的深刻体会是:遇到虚拟机出现诡异故障时,先花两分钟看一眼宿主机磁盘剩余空间,再去看各种复杂的报错排查。这个顺序能帮你省下大量时间。我有几次花了两三个小时排查“VMware Workstation无法连接到虚拟机”,最后才发现就是宿主机系统盘被更新缓存塞满了——把空间释放出来,虚拟机重新启动一切正常。
虚拟机磁盘管理是一个持续过程,不是一次性操作。你需要定期关注客户机内部的空间使用、快照的增长、宿主机剩余空间,把问题消灭在萌芽阶段。如果哪台虚拟机总是出现磁盘问题,我会考虑把它的数据单独挂载到独立虚拟磁盘上,这样即使系统盘出问题,数据盘还能保住。
最后分享一个小技巧:遇到磁盘占用问题时,先做一个完整的快照再动手清理。虽然快照会占额外空间,但它能让你在清理出错时一键回滚。我自己的习惯是,宁可慢一点,也要留好退路。毕竟对绝大多数人来说,虚拟机里的数据比环境本身重要得多。希望这篇内容能帮你少走一些弯路,让那些被硬盘占用问题卡住的虚拟机都能顺利跑起来。