
忘了虚拟机密码这件事干运维和开发的基本都经历过。虚拟机密码重置听起来是个小操作真到自己被锁在门外的时候脑子里全是完蛋又要重装系统了。其实绝大多数情况下虚拟机里的系统密码都是可以救回来的而且办法比物理机多得多关键是你得知道从哪下手。这篇东西就是写给被困在登录界面、正在搜怎么重置虚拟机密码的人无论你用的是VMware Workstation、VirtualBox还是装的是Ubuntu、CentOS、Windows甚至是麒麟系统思路都通用。我在实际处理过几十次这种紧急救援之后最大的感受是虚拟机密码重置拼的从来不是技术高低而是你有没有在动手之前想清楚这个虚拟机的磁盘我到底能不能碰、怎么碰。只要记住这一条主线后面的所有操作都很顺。1. 先理清思路为什么虚拟机密码重置比物理机简单1.1 虚拟机环境的特殊之处物理机上忘记密码麻烦在于你很难在系统启动前插入一段自己的代码进去。虚拟机完全不一样本质上它只是宿主机上的几个文件你拥有宿主机的完全控制权就等于拥有了虚拟机的一切。你可以调整它的启动顺序、挂一个新的ISO光盘、甚至直接把虚拟磁盘拆下来挂到另一台系统里修改这些操作在物理机上要麻烦得多。所以遇到忘记密码第一反应不应该是重装系统而是先问自己这个虚拟机的磁盘文件vmdk、vdi、vhd或者qcow2还在不在只要磁盘文件还在、没被加密破坏密码就一定能重置。哪怕系统完全启动不了通过救援模式也一样能改。另一个容易被忽略的点是虚拟机里的BIOS/UEFI是虚拟的启动过程比物理机更容易干预。你在物理机上开机狂按F2可能因为手速不够错过窗口在虚拟机里完全可以通过配置延长BIOS启动等待时间甚至可以配置成先从光驱启动。这些细节都是虚拟机独有的优势不利用就太亏了。1.2 动手之前先管住这三件事很多人一上来就照着网上的教程开机狂按Shift进GRUB结果操作到一半发现系统盘是只读的或者改完密码重启后系统直接进不去。我踩过太多次这种教程只写了一半的坑。正式开始之前你只需要确认三件事先做快照或备份虚拟磁盘。这一步看起来多余但实际上是整个救援过程的安全网。改坏GRUB配置、误删文件、SELinux策略异常都可能让系统彻底起不来。有了快照大不了回滚重来。准备一个可用的系统安装ISO。比如Ubuntu的Live CD、Windows安装盘、CentOS的安装镜像。它不一定用来重装系统很多时候是借它的修复模式或命令行环境。我建议宿主机上常年放一个最小的Linux Live ISO几十MB的也行关键时刻能救命。关闭虚拟机的启动时连接软驱/没有意义的USB设备。这不是必须的但实测在安装介质启动时多余的设备有时候会干扰启动顺序判断让你误判成引导坏了。干净的环境排查问题会快很多。1.3 分清场景忘的是系统密码还是业务系统密码还有一个容易被搞混的问题。搜虚拟机 密码 重置的时候经常会看到有人问Elasticsearch密码忘了怎么办、Artifactory密码忘了怎么办。这里要先明确一个边界虚拟机密码重置说的是操作系统登录密码不是跑在虚拟机里的某个软件的账号密码。如果忘的是业务系统的密码你要做的也不是重置整个虚拟机而是进到系统后按业务系统自己的方式恢复。比如Jira、GitLab、Elasticsearch都有各自的密码重置命令。千万别一上来就把操作系统密码改了那解决不了业务密码的问题反而可能因为弱口令引发别的麻烦。我的习惯是先分清需要重置的是哪一层再动手这样能省下大量时间。2. Linux虚拟机密码重置单用户和rd.break两条主流路径2.1 Ubuntu/Debian系grub加参数进入root shellLinux系的虚拟机最常见的就是Ubuntu和CentOS。先说Ubuntu这条线整体操作逻辑是修改GRUB启动参数让内核在启动时直接带一个init/bin/bash跳过正常的初始化流程直接给你一个root shell。具体步骤是这样的开机后在GRUB菜单界面选中要启动的内核那一行按e进入编辑模式。找到以linux开头的那一行通常在后面可以找到ro quiet splash这样的参数把ro改成rw然后在行尾追加init/bin/bash。按CtrlX或F10启动。正常情况下你会直接掉进一个bash shell。因为刚才把根分区改成了读写挂载直接执行passwd 用户名按提示输入两遍新密码就行了。如果提示只读先执行mount -o remount,rw /再执行passwd。输入exec /sbin/init或直接reboot -f重启。这里有个关键细节为什么要把ro改成rw因为很多教程省略了这一步默认根分区是只读挂载你执行passwd会直接报错新手往往卡在这一步不知道怎么办。另一个容易忽略的是如果你用的是Ubuntu 18.04以上的版本有的内核参数是systemd.unitrescue.target或者breakpremount也可以进入救援环境但用init/bin/bash最直接因为它绕过了systemd逻辑最简单。2.2 CentOS/RHEL系rd.break和autorelabel的坑CentOS和RHEL系的老版本可以用单用户模式single但从CentOS 7开始最稳定的办法是用rd.break参数打断启动流程进入initramfs的紧急shell。操作和Ubuntu类似在GRUB编辑界面找到linux16或linux开头的那一行。在行尾追加rd.break按CtrlX启动。系统会停在类似switch_root:/#的提示符下。此时真正的根文件系统挂载在/sysroot而且是只读的。执行mount -o remount,rw /sysroot chroot /sysroot在chroot环境里执行passwd root或者passwd 你的用户名改完密码退出。重要如果你的系统开启了SELinux默认就是enforcing建议执行touch /.autorelabel。这样下次启动时系统会对整个文件系统重新打SELinux标签否则你可能改完密码重启后发现系统依旧登录不了甚至出现各种权限异常。输入exit退出chroot再输入exit或reboot -f重启。rd.break的原理是内核在切换到真实根文件系统之前先停下来给你一个shell。这时候SELinux策略还没有完全加载所以你能读写/etc/shadow。但正因为不完整直接改完密码后文件上的SELinux安全上下文可能是错的autorelabel就是用来纠正这个问题的。2.3 麒麟系统和其他国产Linux的异同热搜词里经常出现麒麟系统重置密码银河麒麟、中标麒麟这类国产系统底层基本是CentOS或Ubuntu的衍生所以思路完全一样。如果麒麟是基于CentOS/RHEL的服务器版本用rd.break记得处理SELinux。如果麒麟是基于Ubuntu/Debian的桌面版用init/bin/bash或recovery模式就行。实测下来麒麟桌面版有个小差异它的GRUB菜单默认隐藏了详细启动参数你需要在GRUB界面按e之前先按Esc或空格把菜单完整展开。有的一版麒麟甚至默认启动了GRUB的安全启动校验修改内核参数时会提示无法验证签名这时候需要在BIOS里临时关闭Secure Boot再操作改完再开回来。2.4 修改密码的三个细节passwd、chpasswd与直接编辑shadow很多人不知道Linux重置密码除了passwd还有几个变体各有各的适用场景passwd 用户名交互式修改最安全适合在shell环境里用。echo 用户名:新密码 | chpasswd非交互式适合脚本和批量操作但命令会出现在shell历史里建议用完后清一下。直接编辑/etc/shadow这是最后的办法。如果系统密码字段是!或*开头表示账户被锁定了。你可以在知道另一台机器密码哈希的情况下把shadow文件里的哈希值复制过来。不过这个操作有风险改错一个字符账户就废了我一般只在特殊情况才用。另外如果你用init/bin/bash进入系统后发现连root账户本身都是锁定的也别慌先passwd root设一个新密码然后用passwd -u root解锁或者用passwd 普通用户名改日常账号。3. Windows虚拟机密码重置离线恢复环境粘贴键替换3.1 进入WinRE的三种方式Windows虚拟机的密码重置思路完全不同因为Windows没有一个像Linux那样可以直接修改密码哈希的简单入口。最常用的办法是利用系统自带的Windows恢复环境WinRE里的命令提示符把无障碍工具替换成cmd从而实现重置密码。但这里有个经典的误区很多教程写的是在登录界面按Shift重启进入恢复环境。问题是你连密码都不知道按Shift重启也只能走到输入密码那一步根本点不到重启按钮。所以正确的做法是绕过一个入口直接在虚拟机里用安装介质启动。三种进WinRE的方式方式一最推荐把同一个Windows版本的安装ISO挂载到虚拟机光驱开机让光驱优先启动在安装界面左下角选择修复计算机然后依次进入疑难解答 高级选项 命令提示符。方式二开机时连续强制断电在VMware里就是关闭/启动电源两次以上系统会自动进入正在自动修复界面再走到高级选项的命令提示符。方式三如果你能进另一个系统比如VMware里装了双系统可以直接在另一个系统里对Windows分区执行部分命令但复杂程度高不如前两种。3.2 用命令提示符替换utilman.exe的完整操作进入到WinRE的命令提示符后你的目标是找到Windows系统所在的盘符。这里有个很容易踩坑的点在恢复环境里C盘不一定是你原来的C盘。因为WinRE可能占用了D盘或更高的盘符真正的系统分区可能是D盘甚至E盘。先执行这个命令确认diskpart list volume exit看清楚哪一卷的卷标是System、容量是你虚拟机系统盘的大小那就是Windows分区。假设它是D:下面这串就是核心操作D: cd Windows\System32 copy utilman.exe utilman.exe.bak copy cmd.exe utilman.exe注意执行copy时可能会提示另一个程序正在使用此文件这是因为当前命令提示符本身就跑在System32里但通常可以正常覆盖如果报错换一个80G5G的方式其实可以先把cmd.exe复制到别处再覆盖。稳妥的做法是copy D:\Windows\System32\utilman.exe D:\Windows\System32\utilman.exe.bak copy /y D:\Windows\System32\cmd.exe D:\Windows\System32\utilman.exe然后关闭命令提示符重启虚拟机。这次正常进入Windows登录界面点击右下角的轻松使用图标也就是utilman.exe会弹出cmd窗口。在cmd里执行net user先列出所有用户确认你的用户名然后net user 你的用户名 新密码或者直接用管理员权限把某用户加入管理员组net localgroup administrators 你的用户名 /add改完后重启正常输入新密码登录再回来把utilman.exe.bak恢复回去不然这个后门会一直留在系统里安全上有隐患。3.3 没有安装介质时的第三方工具方案如果你手头没有对应的Windows安装ISO还有一个方案是用第三方离线密码重置工具比如Lazesoft Recovery Suite Home。这类工具免费版就够用可以生成一个可启动的ISO挂载到虚拟机光驱上启动后选择要重置密码的系统它支持直接读取SAM数据库并修改密码。我试过一次用Lazesoft重置一台Windows Server 2019虚拟机整个流程不到十分钟。需要注意几点工具生成的ISO要在虚拟机的启动顺序里排在硬盘之前。重置密码本质上是操作系统的安全机制所以杀毒软件在PE环境里可能不会拦截但某些系统补丁会拒绝旧版本工具进入尽量下新版。操作完成后把ISO卸载掉避免下次开机又从光驱启动。3.4 Windows的盘符和权限注意事项Windows密码重置过程中最容易翻车的就是盘符混乱。我见过好几个人在WinRE里直接执行cd C:\Windows\System32结果改了半天都提示找不到文件最后发现真实系统在D盘。另一个细节是如果Windows系统分区启用了BitLocker加密那你在WinRE里根本看不到文件内容恢复环境会提示需要密钥。这时候走无代码方法就无效了你得先解决BitLocker恢复密钥的问题。这个在物理机上一样但虚拟机里经常被人忽略因为很多人觉得虚拟机里没这么复杂。4. 虚拟机平台自带的特殊手段与辅助工具4.1 VMware WorkstationBIOS延迟、VMX配置和启动顺序VMware Workstation是我个人用得最多的虚拟机平台它有几个物理机没有的后门级便利操作。首先改启动顺序不一定要手速。在虚拟机开机的一瞬间窗口上会显示一个提示按F2进BIOS、按F12选启动设备。如果你手速不够或者虚拟机启动太快根本没看到可以修改VMX配置文件在虚拟机名.vmx里加一行bios.bootDelay 5000单位是毫秒这里表示延长5秒的BIOS启动时间。这样你就有充足的时间按F2进BIOS设置把光驱或者ISO启动盘调到第一位。其次是VMware的启动时强制按键。如果连键盘焦点都来不及切进虚拟机窗口可以在虚拟机窗口上右键选择电源 打开电源时捕获键盘或者在VMware Workstation里选择编辑 首选项 输入设置光标未进入窗口时也把按键发给虚拟机。这些细节平时没人提但关键时刻非常管用。4.2 VirtualBox启动菜单和其他快捷键VirtualBox和VMware的快捷键略有差异。开机时快速按F12会弹出临时启动设备菜单这里的Optical表示光驱选中它就能从ISO启动。如果按F12没反应可以在设置里的系统 启动顺序中把光驱拖到第一位。VirtualBox还有一个挺实用的功能它可以在不加ISO的情况下通过设备 共享文件夹或虚拟光驱动态加载镜像不需要重启。而且VirtualBox对老克隆虚拟机的密码重置支持也不错我试过把Windows XP虚拟机的VHD直挂到另一台VirtualBox虚拟机上读取SAM操作不算复杂。4.3 直接把虚拟磁盘挂到宿主机上改密码这是虚拟机相比物理机的终极杀招把虚拟磁盘当“移动硬盘”接到另一个系统上去改密码。如果你的宿主机是Linux并且安装有libguestfs工具可以对VMDK、qcow2等格式的虚拟磁盘直接操作。比如重置一台Linux虚拟机的root密码最简单的方式是virt-customize -a /path/to/disk.vmdk --root-password password:NewPass123这个过程不需要启动虚拟机直接改动磁盘镜像里的shadow文件。实测下来对大文件也能稳定工作而且比手工进GRUB快得多。如果没有virt-customize也可以用guestfish交互式修改或者用guestmount把虚拟磁盘挂载到本地目录里然后像操作普通文件一样去改/etc/shadow。这里要提醒一点虚拟磁盘在挂载前务必确保虚拟机处于关机状态否则文件系统会有不一致甚至损坏磁盘。4.4 快照回滚最偷懒但最稳妥的做法如果虚拟机在密码忘记之前创建过快照那这可能是最省事的方法了。在VMware Workstation里直接选择快照 转到快照VirtualBox里则是在复制/快照界面选中快照后恢复。快照回滚的代价是该快照之后对虚拟机的所有更改都会丢失。比如你忘了密码之前已经装了一堆软件、改了一些配置文件回滚之后这些都没了。所以它适合密码刚忘系统基本没动过的场景而不适合跑了好几个月的生产虚拟机。我的建议是把快照当成最后一个保底手段而不是首选。因为用GRUB或WinRE改密码5到10分钟内就能搞定而且不丢数据。快照回滚是真的很急、不愿意折腾时的兜底方案。5. 常见问题排查与避坑实录5.1 grub菜单一闪而过进不去很多人照着教程重启发现GRUB菜单一闪而过根本来不及按e。这通常是因为GRUB超时时间设置得太短或者系统默认隐藏了菜单。解决办法很简单在GRUB出现之前快速反复按ShiftBIOS模式或EscUEFI模式能强行把菜单叫出来。如果这招无效直接重启在VMware配置里把启动时间延长前面说的bios.bootDelay或者用方向键锁定。还有一个办法是事先修改GRUB配置文件里的GRUB_TIMEOUT5但你已经进不去系统了这个办法只能在能进系统的前提下提前配置。5.2 SELinux导致重置后仍然登录不了这是CentOS/RHEL系重置密码最常见的翻车点。你可能明明执行了passwd也提示成功了但重启后登录界面依然报错或者输入密码后直接闪回登录界面。原因就是SELinux的文件上下文没更新。所以前面特别强调rd.break模式下修改完密码后一定要touch /.autorelabel如果已经重启并发现登录不上了也没关系重新走一遍rd.break然后执行touch /.autorelabel再重启。系统会在下次启动时重新打标签整个过程可能多花几分钟但一步到位。5.3 磁盘LUKS加密时该怎么办如果你的Linux虚拟机在安装系统时开启了磁盘加密LUKS那情况会稍微复杂一点。rd.break之后你仍然需要输入LUKS密码才能解锁根分区。如果你连LUKS密码也忘了那就不是单纯重置系统密码能解决的而是要先解决解密密钥的问题。在虚拟机场景下有几个思路如果有LUKS备份密钥文件用Live CD启动并挂载时指定密钥文件如果密钥存在TPM或外部Keyfile里从宿主机拷贝回来最不济就只能放弃加密层的完整恢复看有没有快照可以回滚。这里要多说一句真到这一步资料能不能保住取决于备份而不是技术。平时给虚拟机做加密时一定把恢复密钥另外存一份。5.4 密码重置之后发现系统时间或策略异常重置完密码正常登录后有个容易被忽略的问题系统时间有可能停在很久以前导致证书校验、Kerberos认证、Windows域登录都异常。这在虚拟机里特别常见因为虚拟机时间跑的是宿主机时间如果你改密码时把虚拟机挂起太久时间可能落后很多。处理方式很简单登录后同步一次时间Windows里用w32tm /resyncLinux里用timedatectl set-ntp true。如果是Windows域环境还需要考虑密码是否已过期、是否触发锁定策略。有几次我在重置密码后系统还是提示需要改密码或账号被锁这时候用管理员身份执行net user 用户名 /active:yes就能解开。5.5 问题速查表现象可能原因处理方法GRUB界面进不去超时太短/隐藏菜单狂按Shift或Esc或修改bios.bootDelaypasswd提示只读文件根分区以ro挂载执行mount -o remount,rw /CentOS改完密码登录不了SELinux上下文异常执行touch /.autorelabel后重启Windows下net user执行不了替换文件路径/盘符错误用diskpart确认系统盘符确认utilman.exe路径Windows提示另一个程序正在使用此文件文件被占用先复制到临时目录再覆盖或用cmd /c命令磁盘加密场景无法修改shadowLUKS密码丢失先解决LUKS密钥需要额外备份手段密码重置后无法登录密码策略锁定用net user或chage解除锁定检查账号active状态虚拟机启动进入ISO而不是硬盘启动顺序未恢复完成后卸载ISO或调整硬盘启动顺序我个人的习惯是每次给虚拟机做完密码重置都会顺手做两件事第一在虚拟机管理界面再打一个快照标签写上密码已重置日期第二把这次用到的ISO从光驱里卸掉恢复原来的启动顺序。这两个动作看似简单但能避免你下次开机又是一顿手忙脚乱。最后再分享一个小技巧如果你经常需要管理一堆虚拟机与其每次忘记密码后临时去重置不如提前准备一套标准化的运维镜像。比如统一开启GRUB的救援菜单入口配置好SSH密钥登录Windows虚拟机提前启用内置Administrator并设置复杂度较低的初始密码。等到真正需要紧急重置的时候你会发现整套流程其实都是在跟时间赛跑而提前的那一点点准备就是最大的底气。