
你是不是也有过这种抓狂的瞬间虚拟机里的项目明天就要演示结果开机发现密码忘了怎么试都不对系统直接卡在登录界面进不去。重装系统吧里面配置的环境、存的文档、部署好的服务全没了网上查了一圈教程倒是一大堆但要么写得云里雾里要么只给结论不给原理照着做还是进不去。这篇内容就是冲着“忘记虚拟机密码怎么办”这个具体问题来的目标是让你在最短时间内搞清楚几种靠谱的破局方案并且每一步都能自己动手复现。内容覆盖Linux和Windows两类虚拟机从最简单的单用户模式改密码到不借助原系统、直接离线操作磁盘文件的进阶方案再到各种改完依然进不去时的排查思路基本涵盖了虚拟机密码恢复的绝大多数场景。适合VMware Workstation、VirtualBox等桌面虚拟化工具的用户阅读也适合刚接触Linux想搞懂密码恢复机制的新手参考。1. 破局前的准备先搞清楚你的虚拟机是什么情况很多人上来就照着网上的教程敲命令结果敲了半天发现自己连虚拟机是什么系统、用的什么引导方式都没弄清楚。实际上虚拟机密码恢复和物理机不太一样最大的优势在于虚拟化层给了我们额外的操作空间比如可以随时挂载光盘镜像、可以随意添加临时硬盘、可以备份整个磁盘文件。这些操作在物理机上往往要拆机或者做启动盘在虚拟机上几下就完成了。1.1 先判断你遇到的是哪类密码问题我遇到过五花八门的“忘记密码”场景但归纳起来大概有这几类不妨先对照一下自己的情况纯粹忘记登录密码最常见的场景Linux系统卡在登录界面Windows系统提示密码错误能确认用户名没记错但密码就是进不去。密码过期导致无法登录很多企业虚拟机和学校实验环境会配置密码有效期策略比如强制90天必须改一次密码结果过期后登录时要求立即修改输入新密码又反复不满足策略最终卡住。root密码被改或者被锁Linux系统里平时用的普通账号还能登录但sudo时需要root密码而root密码已经忘了或者连续输错次数太多导致账户被锁定。系统启动过程中需要密码比如LUKS磁盘加密、BitLocker、TPM校验等环节需要密码这类情况相对特殊需要单独的解决思路。判断好具体属于哪种情况才能选择最匹配的恢复方式。比如只是普通登录密码问题直接进入单用户模式重置就行如果磁盘本身有加密那就要先考虑恢复密钥的问题。1.2 动手之前先把虚拟机“备份”了这条建议我真的会逢人就说在改密码之前先把虚拟机的磁盘文件复制一份或者在VMware里拍一个快照。原因很简单密码恢复过程中我们要触碰系统核心文件、修改内核启动参数操作失误导致系统无法启动的概率并不低。临时快照是关键中的关键VMware Workstation可以在虚拟机开机状态下直接创建快照如果改坏了马上恢复到之前的快照状态就行几秒钟的事。如果没有快照习惯也可以把虚拟机的整个目录复制一份到其他盘重点复制.vmdk磁盘文件前提是虚拟机处于关机状态下。我用过的最省事的办法是直接在VMware里右键虚拟机选择“管理—克隆”创建一个完整克隆作为保险。总之备份是破局的第一步千万不要跳过尤其是里面存了重要资料时这份备份可能是你唯一的后悔药。1.3 准备相应的工具和环境搞清楚系统类型之后按不同方案需要准备的工具大致是这些Linux类虚拟机只需进入GRUB启动菜单基本不需要额外工具但如果系统引导损坏则需要一个对应版本的Linux安装ISO镜像。Windows类虚拟机需要一个Windows PE启动镜像简称PE或者任意版本的原版Windows安装ISO也可以提前下载专用的密码重置工具ISO。通用辅助工具能正常运行的宿主机环境、VMware Workstation或VirtualBox最新的版本以及确认你的虚拟机处于关机状态操作过程中不要开机。这些工具不必一次备齐看自己选择哪条路线。我个人的建议是优先选最简单的方案比如Linux直接用GRUBWindows用PE工具快捷省事还不容易翻车。2. Linux虚拟机密码重置实战三条路线任你选Linux系统的密码恢复思路整体上比Windows要灵活许多因为系统的设计哲学就是允许你通过修改内核启动参数进入特殊模式。学会这个思路之后不管遇到CentOS、Ubuntu、Debian还是麒麟系统你都能举一反三。2.1 路线一GRUB引导菜单加参数进单用户模式这是Linux密码恢复最常规、最快速的方式适用于大多数GRUB2引导的系统。核心思路是开机时在GRUB菜单界面编辑启动项在内核命令行末尾加上“single”或者“init/bin/bash”之类的参数让系统不带完整图形环境启动从而绕过正常登录流程直接获得root权限。具体操作步骤如下第一步启动虚拟机看到GRUB引导菜单时按键盘上的“e”键进入编辑模式。如果你安装的是单系统GRUB菜单可能一闪而过可以在开机时持续按“Shift”键呼出菜单Ubuntu系或在VMware窗口内迅速点击画面并按键。第二步在编辑界面里找到以“linux”或“linux16”开头的那一行这行通常是内核启动参数所在位置。将光标移动到这行结尾在最后面加上一个空格然后输入“single”或者“init/bin/bash”。如果你想稳妥一些可以同时加上“rd.break”等参数比如CentOS 7/8系统还经常配合“rd.break”使用这样会让系统在切换到根文件系统之前停在一个shell环境里。第三步按下“CtrlX”或者“F10”启动系统。如果只是加了“single”系统会直接进入单用户模式此时直接敲“passwd root”就能设置新的root密码。如果加的是“init/bin/bash”进入的是bash交互环境要先执行“mount -o remount,rw /”把根文件系统挂载为可读写状态否则后续修改密码会提示“read-only file system”。第四步设置完新密码后输入“exec /sbin/init”或“reboot -f”重启系统用新密码登录即可。这里有个细节值得注意如果系统开启了SELinux某些情况下修改密码文件后还需要执行“touch /.autorelabel”来触发SELinux标签的重建否则下次登录可能异常。我现在用的CentOS 7环境里偶尔会遇到这个问题所以稳妥起见都会顺手执行一下。2.2 路线二用安装ISO的救援模式离线重置有些场景下GRUB菜单根本进不去比如引导文件配置错误、GRUB损坏、或者系统升级后菜单隐藏了。这时候单用户模式就不太好使了我们可以换一种思路用系统安装ISO的救援模式启动把虚拟机的原系统磁盘挂载起来离线修改密码文件。具体过程是这样的在VMware Workstation中选中虚拟机点击“编辑虚拟机设置”在光驱设备里加载对应的Linux安装ISO比如使用原版CentOS 7的ISO。启动虚拟机从光盘引导进入安装界面。安装界面不要选“Install”而是选择“Rescue a CentOS system”也就是救援模式。进入救援模式后系统会提示选择语言、键盘布局然后会去检测磁盘上的Linux系统并询问是否要挂载到“/mnt/sysimage”目录。选择“Continue”系统会将原系统挂载到这个目录。接下来进入shell环境执行“chroot /mnt/sysimage”这一步很关键相当于把当前终端的工作根目录切换到原系统之后你执行的“passwd root”就会直接作用于原系统的账户。在chroot环境里执行“passwd root”输入两遍新密码然后执行“exit”退出chroot环境再执行“reboot”重启系统。开机后直接用新密码登录即可。这个方案的优点是不依赖GRUB菜单只要光驱ISO能正常启动基本就能搞定。缺点是需要在安装镜像界面里找对选项偶尔会碰到系统检测不到Linux分区的情况那样的话还需要手动挂载LVM逻辑卷难度会稍高一些。但作为单用户模式失效时的备选方案还是很值得掌握的。2.3 路线三直接修改shadow文件清空密码字段如果系统里有多个密码需要重置或者你想绕开“passwd”命令对密码复杂度的检查可以直接修改系统的“/etc/shadow”文件。这个文件保存着用户密码的哈希值里面每个用户对应一行用冒号分隔成多个字段依次是用户名、密码哈希、最近修改时间、密码有效期参数等。操作的方法是在进入单用户模式或者救援模式后执行“vi /etc/shadow”找到root用户那一行把第二个字段即冒号之间的哈希值清空。清空后保存退出重启系统登录时root密码栏直接留空就能进入系统。进入之后再执行“passwd root”设置一个新密码。这个方法也有它的边界如果系统开启了SELinux或者PAM配置了“空密码禁止登录”的规则单纯的清空字段可能无法登录同时新版Ubuntu把部分用户密码迁移到了“/etc/shadow”绕不开的存储机制里不再像传统方式那样直观。总体而言这个方案适合应急但不建议作为常规首选。我更推荐用“passwd”命令因为它会自动更新密码哈希、密码修改时间等关联字段不容易留下隐患。2.4 Linux新老版本密码恢复差异速查不同Linux发行版和版本之间进入特殊模式的方法存在细微差别很多人照着教程失败就是因为这些差异没处理好。我整理了一个对照表方便大家根据自己的系统对号入座系统版本推荐启动参数进入后的状态注意事项CentOS/RHEL 6single直接进入单用户shell需要remount根分区可写CentOS/RHEL 7/8rd.break先进入switch_root环境需执行mount -o remount,rw /sysroot再chroot /sysrootCentOS/RHEL 9rd.break selinux0同上注意SELinux上下文刷新Ubuntu 16.04及以下recovery mode菜单选择root shell需手动remount rwUbuntu 18.04及以上init/bin/bash直接进入bash需remount /Debian系通用single或init/bin/bashroot shell系统提示符后直接改密码银河麒麟等国产系统与CentOS系类似取决于定制版本优先尝试单用户模式个别版本需要额外调整启动配置每次遇到新系统版本我的习惯是先看一眼GRUB配置里的默认内核行格式再决定加什么参数而不是盲目抄教程。在编辑内核参数时尽量保持其他参数不变只是在末尾追加这样翻车概率会低很多。3. Windows虚拟机密码忘记后的恢复操作Windows虚拟机忘记密码的恢复思路和Linux完全不同Windows不像Linux那样能轻松绕开登录验证本地账户密码存储在SAM数据库文件中直接加密保存在注册表里。但正因为虚拟机可以被离线操作我们可以把这个SAM文件拿来处理或者利用系统自带的辅助工具替换机制来达到重置密码的目的。3.1 准备一个能启动的Windows PE环境处理Windows虚拟机密码用得最普遍的工具是Windows PE。简单说Windows PE是一个轻量级的Windows预安装环境可以从U盘或者光盘启动通过它我们可以访问未启动系统的文件系统。对虚拟机来说不需要真的做U盘只需要准备一个PE的ISO镜像文件然后在VMware里把ISO挂载到虚拟光驱开机时从光盘启动即可。PE的获取方式一般是下载制作好的PE维护镜像或者自己用WinPE工具包选ISO格式最方便。我制作PE遇到过一个反向坑如果PE的架构和原系统不一致比如32位PE访问64位系统文件操作时经常报错建议直接准备64位的PE。3.2 用PE里的密码重置工具清除或修改密码成功从PE启动后你会进入一个带有图形界面的维护环境。接下来的关键操作是用工具加载虚拟机的本地系统注册表信息重置密码。目前常用的工具包括NTPWEdit、Active Password Changer等它们的使用思路很相似。以NTPWEdit为例打开后第一步选择“SAM”文件所在路径。原来系统的SAM文件位置一般在“C:\Windows\System32\config\SAM”在PE中盘符分配可能发生变化原本的C盘可能变成D盘需要根据你看到的系统目录去选择对应的盘符文件夹。第二步打开SAM文件后工具会列出系统中的本地用户列表选择你要重置密码的用户比如Administrator。然后点击“Change Password/清除密码”设置新密码或者直接留空保存修改。第三步退出PE重启虚拟机正常向导Windows登录时使用新密码即可。如果选择了清空密码直接按回车或者点击登录按钮即可进入。需要注意的是PE工具通常只对本地账号有效。如果虚拟机加入过域或者用户使用的是微软账户登录SAM文件里存储的并不是你日常登录的那个密码重置本地用户密码不一定能进入系统这种情况需要另想办法比如通过微软账户在线重置密码。3.3 备用方案利用“粘滞键”替换技巧重置密码这是一个非常经典的老方法但只适合特定场景。思路是Windows在未登录状态下按几次“Shift”键会触发“粘滞键”程序系统调用的是“C:\Windows\System32\sethc.exe”这个文件。如果我们用“cmd.exe”替换掉“sethc.exe”那么在登录界面按Shift键就能直接弹出命令提示符窗口并且拥有系统权限。实现这个替换动作还是需要PE环境。从PE启动后用命令提示符窗口执行以下操作逻辑找到原系统的“System32”目录把“sethc.exe”重命名成“sethc_bak.exe”再把“cmd.exe”复制一份改名为“sethc.exe”。完成后重启进入正常系统在登录界面连按五次Shift就能看到命令提示符输入“net user 用户名 新密码”即可重置密码。这个方法的好处是不需要额外下载密码工具坏处是如果原系统是64位替换的文件也必须是64位的cmd否则无法运行。而且新一代Windows会在系统完整性检查上更严格有时会拒绝异常修改文件。总体而言PE密码工具更直接粘滞键替换适合工具用不上时的备用方案。3.4 BitLocker加密的Windows虚拟机先解决解锁问题如果你的Windows虚拟机启用了BitLocker磁盘加密以上所有方法都会失效因为SAM文件本身是加密的PE工具和文件替换都无法触及。遇到这种情况先别急着重置密码优先回忆你是否有BitLocker恢复密钥一般是一串48位数字。有了恢复密钥启动时会自动进入恢复界面输入密钥后系统解锁然后才能按正常方式重置密码。如果没有恢复密钥虚拟机里的数据基本就只能当作不可恢复了BitLocker设计的目的就是防止未授权访问这也是为了信息安全考虑。所以我在给Windows虚拟机配置加密之前总会提醒一句恢复密钥要么打印出来、要么存到安全的密码管理器里千万不要只记在自己脑子里忘记密码时就是救命稻草。4. 密码重置失败的重灾区问题排查与避坑记录说实话密码重置最难受的不是敲命令那几分钟而是改完之后发现还是进不去又不知道问题出在哪。这一节唠一唠我踩过比较多的坑按场景分类写清楚大家对照排查就能省不少事。现象可能原因处理办法按e进不了GRUB编辑界面开机按早了或按晚了重启虚拟机持续按Shift或用鼠标点进窗口迅速按e内核参数加了single但还是进图形登录参数加错行加到了grub.cfg开头页确认加在linux/linux16开头的那一行执行passwd提示无法打开锁文件根文件系统是只读挂载先执行mount -o remount,rw /密码修改成功但重启后依然要求旧密码修改的是chroot环境里的密码重启后又回到原系统确认已经chroot到真实系统根目录或在恢复模式下修改后退出重启关机后虚拟机无法启动黑屏或kernel panic内核启动参数被改坏回到快照或备份恢复重新按正确参数操作LVM逻辑卷无法挂载系统使用了LVM恢复模式下先激活逻辑卷类似执行lvchange -ay再挂载SELinux上下文错误导致登录异常修改了shadow文件但没有重建SELinux标签在根目录touch /.autorelabel后重启UEFI引导虚拟机无法进GRUB引导方式特殊或启动顺序不对修改固件启动顺序或短时移除其他启动盘Windows PE无法识别磁盘缺少磁盘控制器驱动换用原版系统ISO的修复模式或者在VMware中调整磁盘控制器为IDEWindows登录重置后依然提示密码错误域账户或Microsoft账户与本地账户混淆使用本地账户名重置或者通过在线方式缓解这里面有两条是真的容易绊倒人的。第一是SELinux问题比如CentOS系统里修改了shadow文件但不刷新SELinux上下文重启后即使密码正确也会出现登录异常因为系统认为这个文件的安全上下文不对拒绝读取。第二是UEFI引导的虚拟机很多人不知道VMware虚拟机也能配置UEFI启动这类虚拟机进GRUB菜单的按键时机和方式与BIOS启动完全不同操作时容易错过。除了这些问题还有几个操作细节值得专门提一下尽量在虚拟机“关机”状态下修改配置和挂载ISO因为VMware在开机状态下对虚拟硬件的改动未必能完全生效而且可能误导你排错。密码重置完进入系统后建议第一时间检查用户状态、密码永不过期等设置有些系统会在密码过期状态下直接禁止登录重置完密码后要记得把过期标志清掉避免二次翻车。如果你是嵌入式Linux设备比如基于Linux的工控机、路由器等很多系统不启用标准GRUB引导而是使用bootloader自定义配置甚至需要串口终端进入uboot才能修改启动参数。这类设备的密码恢复思路虽然和虚拟机相似但入口完全不同要在uboot环境里操作普通虚拟机教程并不适用动手前建议先确认设备的启动引导方式。5. 养成几个好习惯尽量别再经历“破局”虚拟机和物理机不同它天生就支持快照、克隆等功能恢复起来比物理机轻快得多。但即便这样我们也不可能每次都靠重置密码来救场因为有些系统在重置过程中会把日志、密钥、加密配置都搅乱一遍。我自己的习惯是给密码上一道双保险。Linux虚拟机里如果平时经常需要sudo建议直接给当前用户配置sudo权限简化日常操作同时对root密码设置一个强密码并记录到密码管理器里。Windows虚拟机呢尽量使用密码策略相对宽松的本地账号做测试如果涉及到域账号登录建议用密码管理器生成随机密码避免“自己能记住的密码”反复在不同环境复用。另外快照一定要养成习惯。VMware Workstation在虚拟机关机状态下拍一个“clean”快照比什么恢复方案都强。我有一台用来做网络实验的CentOS虚拟机每次配置完关键服务之后都会拍一个快照遇到问题直接回滚连密码重置都不需要。毕竟快照恢复只需要几秒钟而一次完整的密码重置加系统配置重新校准可能要半小时。最后再分享一个小技巧如果你的虚拟机装的系统平时很少改动也可以把磁盘文件复制一份到移动硬盘或NAS上这叫“冷备份”。冷备份的好处是就算虚拟机文件损坏、快照丢失你还能把这份备份挂载起来重新注册一台虚拟机密码恢复的操作空间就大得多。我通常会在虚拟机创建完、配置完基础环境之后做一次完整复制之后每过一段时间再更新一次。说到底密码重置这种事技术方案再多也不如“有备无患”来得踏实。希望这些经验能帮你在遇到虚拟机密码问题时少走点弯路。