
虚拟机死循环重启教你一招轻松解决先描述一个很常见的场景早上打开虚拟机屏幕闪了几下刚看到系统Logo下一秒又重新回到开机界面像钻进了没有出口的环形道。你能听到风扇声能看见虚拟机的电源指示灯亮着但系统就是进不去。更让人上火的是前一天还好好的你也没改任何东西它就这样开始“作妖”了。我是做虚拟化运维的VMware Workstation、VirtualBox、还有那些跑在裸机上的虚拟化平台前前后后折腾了十多年。这类“死循环重启”问题我遇到过的次数多到都能写一本《虚拟机自救手册》了。说实话一开始遇到我也慌试过重装、试过恢复快照、甚至把整个虚拟磁盘删了重建后来才发现绝大多数情况下根本不用重装系统按套路排查下来半小时内基本就能救回来有些情况甚至几分钟就能搞定。这篇就把我的排查经验系统地拆开讲一讲。不管你是Windows还是Linux虚拟机不管你用的是VMware还是VirtualBox核心思路都是通用的。只要手头虚拟机出现过无限重启、卡在开机LOGO反复跳、或者系统更新完之后就像抽风一样拉起“重启—失败—再重启”的怪圈这篇内容都能帮你少走弯路。1. 分清症状死循环重启到底有哪两种面孔1.1 开机黑屏型引导阶段无限转圈第一种死循环是虚拟机连系统桌面都没进就一直在开机阶段打转。表现是黑屏上滚几行字然后闪回开机LOGO反复循环。这种问题通常出在引导层。对Windows来说可能是BCD引导配置损坏、磁盘分区表异常或者更新中断导致引导文件不完整。对Linux来说大概率是内核模块加载失败、/etc/fstab挂载出错或者显卡驱动在启动阶段就让整个会话崩溃。判断这种问题有一个很直观的技巧观察屏幕上的报错停留时间。如果每次都是刚跑完BIOS自检就又重启多半是硬件层面的虚拟设备配置冲突如果能进入到系统加载界面才重启那更像是系统内部的问题。1.2 系统更新怪圈型转一会儿就自动重启第二种死循环发生在系统更新阶段。你给虚拟机打了补丁重启之后屏幕上出现“正在配置更新请不要关闭计算机”然后进度条卡了一半紧接着自动重启又回到同一个界面如此往复。这类问题最经典的代表就是Windows Server 2012更新死循环。Windows Server 2012 R2在安装月度累积更新时会执行比较久如果磁盘空间紧张、权限有问题或者补丁本身与某个组件冲突更新程序会陷入“安装失败—回滚—再尝试”的死循环。关键是这个阶段你什么操作都做不了鼠标转圈屏幕提示别关机可它自己偏偏一直重启非常气人。1.3 为什么老系统最容易踩这个坑如果你细看网上一搜“虚拟机死循环重启”的求助帖十有八九都带着Windows Server 2012、Windows 7虚拟机、老Linux内核这类关键词。原因并不复杂老系统的更新机制没那么健壮而且网上流传的旧镜像文件往往还带着前一个装机者残留的配置问题。我下载过不少教学用的Windows Server 2012镜像本身解压就有文件损坏装完第一次更新就触发重启循环这种情况一点都不稀奇。所以先别急着怀疑虚拟化软件坏了这一步要做的是把问题定位准确然后对症下药。2. 快速保命出现死循环时的第一步抢救2.1 日志先行从vmware.log里挖第一手线索遇到死循环重启我建议你第一步先看日志而不是急着点击“重启虚拟机”按钮。为什么因为系统每次重启都会在日志里留下故障现场。你多重启一次现场就可能被覆盖一次。VMware Workstation的日志位置在虚拟机的安装目录下文件名是vmware.log。用记事本打开搜索Fault、error、reset这些关键词能看到是在哪一步触发了重启。VirtualBox的日志则在菜单栏里选中虚拟机点击“日志”标签能看到完整的启动记录。这些日志能帮你确认重启是虚拟硬件层面的强制复位还是系统内部的Blue Screen崩溃。Windows系统本身也会记录事件日志进入系统后用eventvwr.msc打开事件查看器重点看“事件ID 41Kernel-Power”和“事件ID 6006/6008”能告诉你上次关机是正常还是意外的。有一个特别容易被忽视的细节Windows事件查看器里的“BugCheck”事件后面一般跟着四个十六进制参数那个就是蓝屏的bugcheck code。拿这个code上网一搜往往比你看一整篇技术文档都管用。2.2 硬重置后的临时保命法关掉快速启动再说如果虚拟机彻底进不去系统只能硬重置。VMware里点“重新启动客户机”如果没用就“关闭电源”再开机。VirtualBox里则是点“重置”按钮。这一步操作完再开机你会发现一部分虚拟机其实能正常进系统了但如果你再次重启问题又会出现。这种情况尤其是Windows虚拟机八成和“快速启动”机制有关。快速启动是Windows 8之后默认开启的功能原理类似冬眠关机时并不真正退出内核而是把内存映像写入磁盘。这个机制在物理机上容易出问题在虚拟机上更容易出问题。虚拟磁盘的IO性能、快照机制、以及宿主机休眠状态都会导致快速启动恢复失败从而引发开机就重启的循环。解决办法很简单能进系统的话打开控制面板—电源选项—选择电源按钮的功能把“启用快速启动”取消勾选。如果已经进不去系统了在WinRE的修复模式下选择“命令提示符”执行一条命令powercfg /h off这条命令能彻底关闭休眠文件和快速启动功能。我处理过的很多Windows虚拟机关掉快速启动后“重启一次好一次关机再开又死”的现象就彻底消失了。2.3 从宿主机往虚拟机粘贴命令的几个门道在处理这些问题的时候你大概率需要在虚拟机的命令行窗口里输入一大堆命令。手动敲既慢又容易错能直接粘贴就粘贴。VMware如果已经安装并运行好open-vm-tools宿主机和客户机之间可以直接共享剪贴板文本复制粘贴顺滑得很。VirtualBox需要在虚拟机内安装增强功能包Guest Additions装好后也支持双向粘贴。但许多虚拟机死循环状态下桌面和网络都不通粘贴功能也指望不上。我的习惯是直接在Windows宿主机上把要用的命令写到一个txt文件里然后在虚拟机还在Windows恢复环境阶段用命令提示符把那段文件读出来type D:\cmd.txt如果连盘符都不确定先执行wmic logicaldisk get name列出所有盘符再逐个尝试。这个方法虽然土但确实是我在无数台虚拟机里验证过的地气做法。3. Windows Server 2012 更新死循环的专项处理3.1 症状与成因拆解不是所有“更新重启”都是同一种病Windows Server 2012更新死循环算是所有死循环问题里最有“知名度”的一个。我见过一台配置完全没问题的Server 2012虚拟机打完当月补丁后重启直接卡进“配置更新30%”的界面反反复复三天最后更新程序自己把补丁回滚了才消停。有时候甚至回滚都不行直接变成无限重启。遇到这种情况先按兵不动不要再反复点击重启按钮。每重启一次更新程序就多一次“重新尝试”的机会反而会让问题更顽固。正确的姿势是强制断电两次让系统进入自动修复WinRE模式。如果进不到WinRE就尝试在开机时按F8需要提前关闭快速启动或者在WinRE里打开命令提示符。进入命令提示符后先执行下面的命令把系统引导成安全模式bcdedit /set {default} safeboot minimal注意执行完别忘了重启。这一次重启就进入纯命令行风格的安全模式更新程序不会在安全模式下自动运行相当于给系统争取到了一段“不被继续折磨”的珍贵时间。3.2 标准修复三步走停服务、清缓存、离线修复安全模式进去后打开命令行依次执行这几条命令把Windows Update相关服务全部停掉net stop wuauserv net stop bits net stop cryptsvc然后进入Windows目录把SoftwareDistribution目录重命名这个目录是Windows更新缓存的存储位置。通常的做法是cd C:\Windows ren SoftwareDistribution SoftwareDistribution.bak ren System32\catroot2 System32\catroot2.bak重命名的好处是即便之前的缓存文件已经写坏了系统也会在下次更新时重新创建一份而不会去读坏数据。然后就轮到DISM出场了。如果这台虚拟机还能联网执行dism /online /cleanup-image /restorehealth如果网络不通可以挂载当初的安装ISO用里面的install.wim当修复源命令写法稍微复杂一点但核心参数不变dism /online /cleanup-image /restorehealth /source:wim:D:\sources\install.wim:1 /limitaccess最后把安全模式标记移除重启进入正常模式bcdedit /deletevalue {default} safeboot shutdown /r /t 0这套流程处理过很多更新死循环的虚拟机总体成功率在八成以上。之所以要“清缓存重建”是因为很多更新死循环的根源就是更新缓存的某个文件损坏更新程序一直去读、一直失败、一直重试。3.3 治本选项快照回滚与按批次打补丁如果你在更新之前做过系统快照snapshot)处理起来就更简单了直接回滚到更新前的状态然后再重新打补丁。但回滚前记得先导出一份更新日志否则你都不知道是哪个补丁惹的祸回滚完依然会踩同一个坑。从那次之后我养成了一个习惯任何Windows Server虚拟机打补丁前必拍快照。这个习惯看起来不起眼但关键时候比什么都好用。有一句话我想说给所有新手听快照不是给虚拟机“买保险”而是给你自己一个无限次“后悔”的机会。更新出问题、误删文件、系统崩溃只要有快照十分钟之内就能回到出事前的状态这种安全感是任何修复工具给不了的。打补丁的时候也别心急别一次性把当月补丁全部拉满。我建议先把补丁分两批第一批装“累积安全更新”和“关键更新”重启后稳定了再装其他非安全更新。分区隔离能显著减少补丁之间的相互干扰这个策略尤其在老系统上管用。4. 虚拟机环境特有坑配置、磁盘与驱动四大雷区4.1 CPU和内存给得太“好”反而容易重启死循环重启的锅并不总是软件更新的。我在处理虚拟机问题时发现不少虚拟机的死循环重启根源出在“配置太好”CPU核数给得过多内存给得太满。很多人潜意识里认为虚拟机性能越强越不容易出问题其实不然。虚拟机每一个虚拟CPU宿主机都要用线程去调度。如果你给Windows Server 2012分配了8个虚拟CPU但宿主机本身只有4核8线程那虚拟机的线程就会频繁抢占物理资源操作系统自己就会被拖出明显的卡顿感。更新程序加载大量线程时这种卡顿感会被放大轻则任务停止响应重则整个系统看门狗超时强制复位。我的经验是Windows Server 2012打更新的时候临时把虚拟CPU减到2—4核内存预留2—4GB就够了。更新完再把资源加回去。这招看起来反直觉但实测下来更新过程的稳定性好了不止一星半点。4.2 磁盘空间耗尽导致的“启动即重启”另一个极其容易被忽视的坑虚拟磁盘空间不足。Windows系统更新时需要释放临时文件、备份旧文件、写入新文件如果C盘只剩三五百兆更新程序写到一半空间不够了Windows会把已写入的文件清掉然后进入回滚状态。如果每种回滚路径也都需要空间系统直接死循环重启。所以我处理更新死循环时开机进系统后的第一件事一定是检查磁盘剩余空间。在安全模式下执行fsutil volume diskfree C:看到剩余空间少得可怜我会先把Windows临时文件清一清del /q /f /s %TEMP%\*.* cleanmgr /sagerun:1再不行就用VMware的“扩展磁盘”功能把虚拟磁盘容量调大。但这里有个坑扩展虚拟磁盘大小后你必须在客户机里用磁盘管理工具把新空间分配给你想要的分区不然系统是看不到那些空间的。Windows Server 2012上用diskpart能很顺手地搞定diskpart list volume select volume C extendextend命令会对相邻的未分配空间做扩容整个过程几十秒比重新迁移磁盘轻松多了。4.3 Linux内核模块与显卡驱动不兼容Linux虚拟机的死循环重启们最常见的诱因是内核升级后和显卡驱动模块不匹配。特别是Ubuntu虚拟机黑屏进不去桌面、启动循环重启这些情况基本都指向gdm或lightdm服务在启动时崩溃而背后往往是NVIDIA或AMD虚拟机显卡驱动加载失败系统在内核态直接panic重启。解决思路在GRUB菜单出现时按下键盘的e键在linux行末尾加上nomodeset参数然后按F10引导。这个参数会临时禁用图形驱动的模式设置让系统退回到基本的帧缓冲驱动大概率能进入命令行界面。进入系统后把损坏的显卡驱动卸载掉再重新安装对应内核版本的驱动问题通常就能解决。Linux内核日志是定位这类问题的最好工具。如果能进命令行执行journalctl -b -1来查看上一次启动-b -1代表倒数第一次的日志。如果是引导阶段崩溃你还能通过dmesg找到崩在哪一行。我处理过不少案子最后的结论都是“内核版本升级驱动没跟上”所以Linux系统更新之前我都会先去官方源确认新一轮内核能否顺利匹配现有驱动如果没有把握就先做快照再说。4.4 嵌套虚拟化与硬件加速选项误区还有一个容易被忽略的虚拟化环境特有坑VMware和VirtualBox默认都会开启硬件辅助虚拟化如VT-x/AMD-V。如果你的宿主机自身开启了Hyper-V、Windows沙盒等嵌套虚拟化功能同时虚拟机又想使用硬件加速这会触发深层冲突导致虚拟机开机后直接进入反复重启的循环。遇到了就打开虚拟机设置找到“虚拟化引擎”相关选项暂时禁用里面的“虚拟化Intel VT-x/EPT或AMD-V/RVI”勾选再尝试启动。我在一家同事的Windows宿主机上遇到过类似情况那次折腾了一下午最后发现就是嵌套虚拟化冲突。值得一说的是禁用硬件加速会降低一些运行性能但换来回的稳定性绝对值得。5. 死循环重启排查速查表与日常预防5.1 一张表搞定症状、根因、对策写到这里我把遇到过的死循环重启问题整理成一张速查表贴到下面方便大家对照排查。日常工作中遇到类似问题我会先在文档里先比一圈匹配上后再动手能少走很多弯路。常见症状最可能的根因推荐的处理手段开机黑屏反复横跳引导配置损坏或虚拟设备驱动冲突进WinRE修复引导bootrec /fixmbrbcdedit /rebuildbcd开机进一段后重启快速启动残留问题控制面板关闭快速启动或管理员cmd执行powercfg /h off更新进度条卡死自动重启Windows更新服务异常、缓存损坏停wuauserv/bits/cryptsvc重命名SoftwareDistributionDISM离线修复回滚Linux进入桌面即重启显卡驱动与内核不匹配GRUB启动项加nomodeset进入系统后重建驱动启动即报错重启虚拟磁盘空间不足查看剩余空间清理临时文件必要时扩展虚拟磁盘重启循环伴蓝屏蓝屏自动重启机制开启在系统属性-启动和故障恢复中取消“自动重新启动”这个表格看着简练但每一条背后都有实际案例支撑。如果你觉得当下问题和表格里某一行特别像照方抓药就行。5.2 我踩坑总结的日常预防清单说到底“死循环重启”最让人崩溃的地方是被动。与其等虚拟机抽风了才去救不如平时就做好防护。我从自己踩过的坑里总结了一些预防套路分享给大家关键时刻必拍快照任何系统更新、驱动升级、大版本迁移前必须拍一个干净状态的快照。这个习惯救过我太多回了。控制更新节奏生产用途的虚拟机尽量别开启自动更新手动分批更新一次只更新一部分重启验证后再进行下一批。定期检查磁盘余量Windows C盘和Linux根分区最好保留15%以上的剩余空间这是给系统和更新缓冲留出的安全边界。可以用宿主机定时任务跑一个磁盘空间检查脚本低于阈值就发告警。更新前先看日志Windows事件查看器里的错误日志和Linux的dmesg建议养成熟练查阅的习惯。日志不光是事后追责用的更是提前发现问题的最好参考。禁用不必要的自动重启Windows的“系统失败时自动重新启动”选项我是常年关掉的。它一自动重启你会连蓝屏代码都看不到诊断无从谈起。实际工作中我现在遇到虚拟机死循环重启第一反应不再是“完了又要重装系统”而是冷静地先回答三个问题是在哪个阶段重启的日志说了什么有没有快照可以回滚思路一清晰解决步骤自然就像流水线一样往下走这种解决掉麻烦的踏实感也算是这些年折腾虚拟机生涯里最大的收获之一了。