尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

虚拟机黑屏排查:磁盘空间不足导致无法开机的完整解决方案

虚拟机黑屏排查:磁盘空间不足导致无法开机的完整解决方案 虚拟机开机黑屏这件事我在群里被问了不知道多少次。多数人第一反应是“显卡驱动坏了”或者“系统崩了”很少有人会第一时间想到硬盘空间。说实话我自己第一次遇到的时候也走了弯路——又是重置虚拟机、又是改内存折腾了一整晚最后发现问题居然出在磁盘上。这篇就围绕“虚拟机一直显示黑屏无法打开可能是分配的硬盘空间不够”这个方向把我这几年的排查经验和处理步骤完整梳理一遍从现象判断、原因验证、扩容操作到日常预防全部写清楚。1. 先别急着重装系统黑屏要分清楚“哪一种黑屏”很多人一说虚拟机黑屏就急着删了重装其实黑屏能细分成好几种场景不搞清楚就动手大概率是白折腾甚至把原本能救回来的虚拟机搞坏。1.1 开机过程中黑屏连BIOS画面都看不见这种情况最让人慌——点击“开启此虚拟机”之后屏幕一片黑连 VMware 的启动 Logo 或者 BIOS 自检画面都没出现。通常问题出在虚拟机所在的宿主机磁盘空间严重不足或者虚拟机配置文件损坏。判断方法很简单按住Ctrl Alt Delete看有没有反应或者按Ctrl Shift切换输入法。如果完全无响应说明虚拟机进程本身可能已经卡死优先去宿主机的任务管理器看 vmx 进程是否还在跑。1.2 系统滚动条之后黑屏引导已经开始但界面出不来这种黑屏更隐蔽——你能看到 Windows 的转圈动画或者 Ubuntu 的 logo 一闪而过然后屏幕就黑了鼠标箭头可能还在但桌面一直出不来。这时候大概率是系统盘空间被榨干、虚拟内存无法写入或者桌面组件起不来。我遇到过一个案例用户的 Ubuntu 虚拟机根分区只有 12GB装完系统又装了开发环境/ 目录使用率 100%。开机后 GDM 登录界面怎么都出不来黑屏中间只有一个不能动的光标。这种状态下系统其实已经引导了但图形会话一直崩溃表现就是黑屏。1.3 休眠唤醒后黑屏刚才还好好的一唤醒就完蛋还有一种高频场景是虚拟机挂起Suspend之后再恢复屏幕就黑了。这种黑屏跟硬盘空间的关系不大更多是 VMware 的显示缓冲在恢复时读取失败或者虚拟显卡驱动进入异常状态。不过如果宿主机空间不够休眠文件写入失败同样会黑屏。我在后面的章节里会专门把“空间不足”这条线索单独拉出来讲因为现在 Windows 上的 VMware Workstation 默认使用“自动清理磁盘空间”的策略当宿主机空闲空间低于某个阈值虚拟机的写入操作会直接报 I/O 错误表现就是虚拟机越来越慢最终黑屏无法打开。2. 为什么硬盘空间不够会导致虚拟机黑屏原理拆开看标题里说“可能是分配的硬盘空间不够”这个判断方向是对的但得说清楚是“宿主机剩余空间不够”还是“虚拟机内部磁盘分区不够”。两种情况都会导致黑屏但处理方式完全不同。2.1 宿主机剩余空间不足虚拟磁盘文件写不进去VMware 的虚拟磁盘通常以 VMDK 文件形式存在。你给虚拟机分配了 60GB不代表它立刻占用 60GB而是随着使用慢慢增长这种叫“动态增长磁盘”。当你宿主机 C 盘或存放虚拟机文件的磁盘分区剩余空间低于几 GB 时虚拟机的写入操作就会失败。Windows 系统在虚拟磁盘写入失败时往往不会马上弹出错误而是先表现为注册表写失败、临时文件清理失败、桌面图标加载不出来。等磁盘写入彻底阻塞系统就黑屏卡死了。如果你给虚拟机分配的是固定大小磁盘Preallocated那宿主机空间不够的情况会更直接——虚拟机启动时 VMDK 文件需要锁定全部空间空间不够直接就报错。我在 Windows 宿主机上实测过C 盘剩余空间只剩 800MB 时VMware 里一台 Windows 10 虚拟机启动到登录界面就定住了鼠标可以动但桌面一直不加载。用任务管理器一看svchost 进程在不停重试写入磁盘队列长度爆满。2.2 虚拟机内部磁盘分区不足系统盘空间被占满这种更常见你给 Ubuntu 根分区只分了 20GB装完系统、装了开发环境再跑几个 Docker 镜像根分区瞬间满了。Linux 系统有一个特点——当/目录空间耗尽很多关键服务会静默失败而不是报错。图形桌面环境GNOME、KDE、XFCE在启动时需要写临时文件、创建用户会话缓存、加载图标主题这些操作都要写入/tmp、/var、/home这些目录。当磁盘满了mktemp都失败桌面进程就会陷入异常循环最终表现为黑屏。用户可能看到的是“系统进不去桌面”但根因就是空间耗尽。2.3 验证是不是空间问题的具体方法要验证是不是磁盘空间引起的黑屏不用等虚拟机恢复正常直接在你宿主机上做几个检查查看宿主机剩余空间Windows 打开“此电脑”查看虚拟机文件所在分区剩余容量Linux 用df -h /存储虚拟机的目录查看。检查 VMDK 文件增长状态在虚拟机文件目录下看.vmdk后缀的文件大小。如果大小已经接近或超过你实际分配的容量说明磁盘吃紧。进入虚拟机恢复模式或命令行Ubuntu 虚拟机开机时连按Shift或按Esc尝试进入 GRUB 菜单选择“Advanced options for Ubuntu”再选“Recovery mode”。如果能进入 root shell执行df -h直接就清楚了。我把这个场景常见的表现整理成了表格方便你对照着排查排查项空间不足的典型表现非空间问题的表现系统启动引导转圈后黑屏鼠标指针可能可见完全无信号显示器黑屏键盘响应按 CtrlAltDelete 可能有反应但很卡完全无响应虚拟磁盘文件VMDK 文件接近上限或增长极快文件大小正常无异常增长宿主机可用空间低于 2GB 甚至 0空间充足还有几十 GB虚拟机日志出现No space left on device或写入超时无磁盘相关报错3. 空间不足场景下的完整恢复流程一步一步救回虚拟机确定了是空间问题之后别急着删快照或者重装。我按“优先级从低到高”给你整理一套完整的恢复流程从最省事的方案开始尝试。3.1 方案一从宿主机层面腾出空间如果问题出在宿主机剩余空间不足最直接的办法就是给宿主机腾空间。我知道这么说有点像废话但实际做起来是有技巧的。Windows 宿主机可以考虑清理休眠文件、临时文件、Windows Update 缓存关闭休眠可以释放一个跟内存大小相同的文件在 CMD 管理员模式执行powercfg /h off用“磁盘清理”把 Windows 临时文件、缩略图缓存清一遍但别清理“下载”目录检查C:\Users\用户名\AppData\Local\Temp和C:\Windows\Temp里面经常有一堆几个 GB 的临时文件Linux 宿主机可以清理 apt 缓存和 Docker 残留sudo apt clean docker system prune -a -f我自己实测过一次比较彻底的清理能腾出 10 到 20GB 空间。腾出空间后把 VMware 虚拟机目录所在的磁盘剩余空间确保在 10GB 以上再启动虚拟机试试。3.2 方案二通过恢复模式清理虚拟机内部空间如果宿主机空间足够问题在虚拟机内部磁盘满了就要进恢复模式清理。Ubuntu 系统开机时按Shift进入 GRUB选择恢复模式然后选“root Drop to root shell prompt”。进去之后第一步是看磁盘占用df -h du -h --max-depth1 / | sort -h | tail -20重点看这几个目录/var/cache、/var/log、/tmp、/home、/var/lib/docker。然后针对性清理# 清理 apt 缓存 apt clean rm -rf /var/lib/apt/lists/* # 清理系统日志 journalctl --vacuum-size100M # 清理无用的内核 apt autoremove --purge清理完之后执行reboot重启后大概率能进桌面了。我处理过的好几台机器都是用这种方式救回来的没有动任何系统配置纯粹是把磁盘空间释放出来。3.3 方案三如果虚拟机已经完全无法启动挂载 LiveCD 救数据遇到最糟糕的情况——虚拟机连恢复模式都进不去或者恢复模式都不显示只能用 LiveCD 方式进系统里清理。你需要下载一个 Ubuntu 的 ISO 镜像然后在 VMware 虚拟机设置里把 CD/DVD 指向这个 ISO并把“启动时连接”勾选上。虚拟机从 ISO 启动进入 Live 环境后打开 Files 或者直接在终端挂载原来系统的根分区sudo fdisk -l # 查看磁盘分区情况 sudo mount /dev/sda1 /mnt注意Ubuntu 的根分区不一定是/dev/sda1请根据fdisk -l输出中的分区大小判断也可以把几个分区都挂载到一个目录下试试sudo mkdir -p /mnt/root /mnt/boot sudo mount /dev/sda2 /mnt/root sudo mount /dev/sda1 /mnt/boot挂载成功后查看根目录占用情况清理掉/mnt/root/var/log下的日志、/mnt/root/tmp下的临时文件或者/mnt/root/var/cache/apt/archives下的安装包。如果你判断空间不足是因为快照文件造成的相关背景后面会细说还可以在 Live 环境下使用vmware-vdiskmanager命令行工具来收缩虚拟磁盘但这个工具的使用频率不高我建议优先用图形化的扩容方案直接看下一节。4. 扩容虚拟磁盘的正确做法从“能用”到“够用”清理空间只是应急如果你本身给虚拟机分配的磁盘就不合理问题迟早还会复发。我见过的真实案例用户给 Windows 10 虚拟机分了 30GB装完系统和常用软件就用掉 90%运行几个月后必出问题。这种根子上就要扩容。4.1 在 VMware 层面给虚拟磁盘“加大”这个操作在虚拟机关机状态下做右键虚拟机选择“设置”选择“硬盘SCSI / SATA / NVMe”在右侧“磁盘容量”里输入新的大小比如从 30GB 改成 80GB选择“将虚拟磁盘拆分成多个文件”推荐方便备份和移动点击“扩展”这一步只是把 VMDK 文件的上限变大虚拟机内部的文件系统大小不会自动变。重启虚拟机进入系统后你还是看到原来的分区大小需要继续做分区扩充分区。4.2 在 Linux 虚拟机内部扩充分区如果你用的是 Ubuntu 或者 CentOS 等 Linux 系统扩容文件系统有两条路线有图形界面的用 GParted无图形界面的用命令行。我推荐命令行因为即使在 SSH 环境或者桌面黑屏的情况下命令行都可用。在虚拟机里执行sudo growpart /dev/sda 1 sudo resize2fs /dev/sda1注意/dev/sda后面的数字是分区号growpart /dev/sda 1表示让第一分区扩展到磁盘剩余空间。不同系统的文件系统不一样如果用的是 XFSCentOS 默认sudo growpart /dev/sda 1 sudo xfs_growfs /两条命令就能完成扩容不需要重启执行完df -h就能看到分区变大。4.3 Windows 虚拟机的扩容操作Windows 虚拟机的扩容稍微有点不同。在 VMware 里扩展磁盘之后进入 Windows 系统右键“此电脑”选“管理”进入“磁盘管理”。你会看到一块磁盘上有未分配的空间。右键系统盘C 盘选择“扩展卷”根据向导把未分配空间合并进 C 盘即可。整个过程不需要重启也不需要第三方工具。唯一需要注意的是扩展卷只能向右扩展如果未分配空间在 C 盘左侧需要先调整分区布局用 DiskGenius 这类工具处理。我自己的习惯是Windows 虚拟机系统盘至少分配 60GBLinux 桌面系统至少 40GB。这只是系统自身的空间软件和文件另算。如果用来跑 Docker、数据库这些吃磁盘的应用建议直接给到 100GB。5. 除了空间不足黑屏问题还有哪些“隐藏凶手”标题里说“可能是分配的硬盘空间不够”确实空间不足是个大方向但我这些年排查虚拟机黑屏发现很多案例的真正原因并不在磁盘或者不止在磁盘。把这些情况列出来是希望你别在空间上面钻牛角尖该排查的还排查。5.1 内存RAM分配过小导致的异常黑屏我给一台 Ubuntu 虚拟机分配了 1GB 内存日常跑个 npm 构建都会卡死更别说图形界面。当虚拟机内存不足系统会疯狂使用 swap磁盘 I/O 被占满图形会话直接崩溃。这时候你看到的就是黑屏。解决方法是关机后把虚拟机内存调到至少 2GB桌面环境建议 4GB。如果宿主机内存不够可以适当增加 swap 文件sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo /swapfile none swap sw 0 0 | sudo tee -a /etc/fstab注意加了 Swap 能缓解内存不足但读写性能远差于内存只能应急。5.2 VMware 显示加速与显卡驱动冲突如果虚拟机里安装了 VMware Tools但虚拟显卡驱动版本不对或者 3D 加速开启后出现兼容性问题也会黑屏。这种情况下单独在虚拟机设置里关掉“加速 3D 图形”就行“虚拟机设置” → “显示器” → 取消勾选“加速 3D 图形”重新启动虚拟机这个方法能解决一部分黑屏问题尤其是 Windows 虚拟机里显卡驱动更新之后黑屏的。我遇到过一次升级了 Windows 10 虚拟机里的 NVIDIA 驱动重启后黑屏关掉 3D 加速后正常重新安装 VMware Tools 后再开启 3D 加速也正常了。5.3 虚拟机文件损坏或快照残留导致启动异常VMware 默认会在某些操作下自动创建快照或者你手动创建过快照。快照文件.vmsn.vmem是独立于主 VMDK 的增量文件如果快照链损坏黑屏的概率很高。可以试试暴力但有效的办法把虚拟机目录下的.vmsn文件移走注意备份删除.vmem文件再启动虚拟机。如果启动成功说明就是快照残留的问题。不过这种方法风险较高操作前一定确认虚拟机数据有备份我本人只在测试虚拟机上用过生产环境不建议这么做。5.4 虚拟机挂起Suspend状态损坏虚拟机的挂起文件.vmem在异常断电、宿主机强制重启的情况下可能损坏。表现形式就是“恢复虚拟机”时黑屏。处理方法比较直接找到虚拟机目录下的.vmem文件把它改名为.vmem.bak然后再启动虚拟机此时 VMware 会提示“未能恢复挂起状态”选择“丢弃”或“删除”虚拟机就能重新冷启动了。5.5 宿主机 VMware Workstation 版本与虚拟机兼容性新版 VMware Workstation 创建的虚拟机拿到旧版本上打开偶尔也会黑屏。这种情况一般不涉及数据丢失只需要在“虚拟机设置”里把兼容性调低一档就行“虚拟机” → “管理” → “更改硬件兼容性”选择稍微旧一点的 Workstation 版本。6. 回过头来聊“快照”这个东西它的空间吞噬能力超出你想象前面反复提到快照这里专门拎出来说是因为太多黑屏事故跟快照直接相关但用户自己都不知道。VMware 的快照机制是写时复制创建快照之后新的写入不会进原来的 VMDK而是进入一个增量文件通常是-00001.vmdk、-00002.vmdk这种命名。6.1 快照为什么会让空间迅速膨胀举个真实的例子你从 VMware 模板部署了一台 Ubuntu 22.04 虚拟机系统盘 20GB。为了安全创建了一次快照。之后你在虚拟机里装编译工具链跑了几个大型构建累计写入 8GB 数据。此时快照增量文件-00001.vmdk就会膨胀到接近 8GB而且这个文件一旦生成很难自动缩小。如果你在 VMware 的“快照管理器”里看到有多个快照层级并且宿主机的空闲空间本身不大那空间不足几乎是必然的。我见过最夸张的一次三层快照占用宿主机超过 120GB 空间虚拟机本身实际数据只有 30GB。6.2 如何安全地清理快照释放空间清理快照的步骤很简单但要注意顺序在虚拟机关机状态下打开“虚拟机 → 快照 → 快照管理器”逐个选择快照点击“删除”删除后 VMware 会提示“将把快照内容合并到原始磁盘”确认即可合并过程会消耗一定时间期间不要强制中断否则容易损坏虚拟机。另外不要等空间完全耗尽了才删快照合并过程本身就需要临时空间空间为 0 的时候删快照也可能失败。6.3 我的快照使用习惯我现在对快照的态度是只在做重大变更前创建一次性快照变更验证完成之后立即删除。日常使用不保留任何快照。需要备份就导出 OVF 模板或者用专业的备份工具而不是依赖快照长期存在。长期的快照链既占空间又是潜在的“黑屏炸弹”。7. 黑屏问题的最终排查顺序照着做总能救回来说了这么多原因和处理方法最后给你一条清晰的排查链路下次遇到虚拟机黑屏直接按这个顺序来基本能定位到 90% 的问题。检查宿主机空间df -hLinux或查看磁盘“此电脑”剩余容量Windows确保虚拟机文件所在盘剩余空间在 10GB 以上。如果不够先清理临时文件、休眠文件、回收站再看情况清理不用的软件和快照。检查虚拟机内部磁盘试试能否进入恢复模式或 LiveCD 环境用df -h查看分区使用率。如果是 100%先清理日志、缓存、临时文件再考虑扩容。检查 VMware 侧设置确认内存是否足够3D 加速是否可能冲突并检查快照管理器里是否有大量快照残留有的话在关机状态下删除。尝试冷启动完全断电把虚拟机“关闭”不是挂起然后在 VMware 的“虚拟机 → 电源 → 重新启动客户机”里冷启动。有时候简单的完全断电就能解决动态显示问题。校验虚拟机文件完整性如果以上都不行找到虚拟机目录查看.vmdk和.vmem文件状态尝试改名.vmem后冷启动检查.vmx配置文件是否有异常内容比如非法的虚拟设备参数。最后手段重新挂载数据盘救数据如果虚拟机实在无法启动把它的 VMDK 作为数据盘挂载到另一台正常的虚拟机上把重要数据复制出来再考虑重装系统。8. 日常如何避免“空间不够导致黑屏”的坑到了最后一部分分享一些实际沉淀下来的维护习惯。如果你把这些习惯落实到位黑屏这个问题的复发率会大幅降低。8.1 给虚拟机规划容量时预留缓冲我给客户配置虚拟机时推荐一个“容量规划公式”系统盘大小 系统实际占用 × 2 20% 余量。比如你的应用和数据预估占 20GB那么系统盘建议给到20 × 2 4 44GB我一般直接给 50GB。不要被虚拟化软件的“动态增长”迷惑——动态增长只是说物理占用从小的开始但逻辑上限一旦设小了后续扩容虽然不难但总归要停机操作生产环境停机都是有成本的。8.2 监控磁盘空间不靠“感觉”在宿主机和虚拟机里都可以配置简单的磁盘监控。Linux 虚拟机可以用cron定期执行 df 检查空间使用率超过 85% 时发个邮件或者系统日志告警Windows 虚拟机可以用 PowerShell 脚本加计划任务。简单一点的可以监控 vmx 日志的报错VMware 的虚拟磁盘 I/O 错误通常会伴随vmx.log中的SCSI相关警告。日志文件位置在虚拟机目录下叫vmware.log或vmx-*.log。8.3 定期清理虚拟机内的日志和临时文件就算你空间规划再合理垃圾文件也是会累积的。Linux 下养成定期执行清理的习惯sudo apt clean sudo journalctl --vacuum-time7d rm -rf /tmp/*Windows 虚拟机里也可以用磁盘清理工具或者定时清理C:\Windows\Temp、C:\Users\用户名\AppData\Local\Temp。同时提醒自己别把下载目录当网盘下载的安装包用完了及时删除。8.4 快照生命周期管理再次强调一遍快照不是备份。每台虚拟机保留的快照数量最好是 0 个最多不超过 1 个短期快照。每次操作快照都把它当作一次有生命周期的任务创建 → 验证 → 删除。8.5 虚拟机文件不要放在系统盘存放虚拟机的磁盘分区也很关键。Windows 宿主机上VMware 默认把虚拟机放在C:\Users\...\Documents\Virtual Machines里但 C 盘往往空间紧张且容易被系统更新占用。建议把整个虚拟机目录迁到专门的 D 盘或 E 盘并确保该盘剩余空间比所有虚拟机总大小至少多 20%。虚拟机迁移的思路也比较简单在 VMware 中选定虚拟机 → “管理” → “移动虚拟机” → 选择目标目录也可以直接把目录复制过去然后在 VMware 里“打开虚拟机”指向新的.vmx文件。写在最后虚拟机黑屏这件事说大不大说小也不小。说它不大是因为绝大多数情况都能通过清理空间、扩容磁盘、删除快照这些常规手段解决说它不小是因为处理不当确实可能丢失数据。我个人在实际操作中最深刻的体会是大多数黑屏问题都不是什么高深的技术故障而是基础维护没做到位。磁盘空间、内存分配、快照残留这些全是“平时多看一眼、多花一分钟”就能避免的坑。当你下次再遇到虚拟机黑屏别急着重装也别第一反应就去改什么复杂的内核参数——先从空间开始排查往往就是最简单的答案。
返回列表