ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

VMware虚拟机无法启动?硬盘空间占用排查与清理扩容实战

VMware虚拟机无法启动?硬盘空间占用排查与清理扩容实战 说实话我遇到过好几次这种让人血压飙升的场面早上打开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-depth2 / 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-time5d # 清理临时文件 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的sdeletesdelete -z C:干净地关闭客户机。在宿主机上执行收缩vmware-vdiskmanager.exe -k 你的虚拟机磁盘路径.vmdkLinux客户机的流程类似用fstrim通知底层存储回收未使用块fstrim -av或者用dd写入零值这是最稳妥的清零方法dd if/dev/zero of/tmp/zero.fill bs1M 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还是SCSISATA/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客户机打开“磁盘管理”WinX选择磁盘管理你会发现当前系统盘后面多了一块未分配空间。右键系统分区选择“扩展卷”按向导把未分配空间合并进去。如果扩展卷按钮是灰色的最常见的原因是系统分区和未分配空间之间隔着一个恢复分区或其他分区需要先把中间分区处理掉或者用第三方分区工具比如DiskGenius、MiniTool Partition Wizard来调整。Linux客户机如果系统盘是LVM直接一套组合拳# 刷新LVM PV大小 pvresize /dev/sda # 扩展逻辑卷 lvextend -l 100%FREE /dev/mapper/你的vg-你的lv # 扩展文件系统ext4用resize2fsxfs用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无法连接到虚拟机”最后才发现就是宿主机系统盘被更新缓存塞满了——把空间释放出来虚拟机重新启动一切正常。虚拟机磁盘管理是一个持续过程不是一次性操作。你需要定期关注客户机内部的空间使用、快照的增长、宿主机剩余空间把问题消灭在萌芽阶段。如果哪台虚拟机总是出现磁盘问题我会考虑把它的数据单独挂载到独立虚拟磁盘上这样即使系统盘出问题数据盘还能保住。最后分享一个小技巧遇到磁盘占用问题时先做一个完整的快照再动手清理。虽然快照会占额外空间但它能让你在清理出错时一键回滚。我自己的习惯是宁可慢一点也要留好退路。毕竟对绝大多数人来说虚拟机里的数据比环境本身重要得多。希望这篇内容能帮你少走一些弯路让那些被硬盘占用问题卡住的虚拟机都能顺利跑起来。
返回列表