ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

虚拟机密码忘了?VMware Workstation 下 Linux/Windows 密码恢复全攻略

虚拟机密码忘了?VMware Workstation 下 Linux/Windows 密码恢复全攻略 搞虚拟机的朋友应该都有过这种经历创建环境的时候密码随手一敲想着“先装好再说”结果两个礼拜后打开控制台盯着登录框脑子一片空白。尤其是做测试、搭实验环境的时候一台两台三四台虚拟机密码全都不一样记性再好也扛不住这种折腾。这篇文章专门聊一件事虚拟机密码忘了之后怎么靠手里的管理权限把系统密码重置掉而不是灰溜溜地重装系统。内容覆盖最常见的 VMware Workstation 场景Linux 系和 Windows 系都会讲到包括 GRUB 引导参数进入救援模式、用 chntpw 离线重置 Windows 密码、快照回滚和虚拟磁盘直读这些省事的招。先说清楚这套方法只适用于你自己创建、自己拥有管理权的虚拟机任何未经授权的系统都不在这些操作的讨论范围内。1. 忘密码之后先别慌分清可重置、麻烦和彻底无解三种情况1.1 虚拟机比物理机好说话但也不是万能虚拟机和物理机有一个本质区别虚拟机的整个系统盘就是一个普通文件VMware 下是 vmdk 文件只要你有虚拟化平台的管理权限理论上就等于握着物理硬盘。物理机忘密码可能还要拆机、进 BIOS 折腾一堆虚拟机直接在管理界面挂个 ISO、加块磁盘就能操作。但“能操作”不等于“一定能重置”。我见过太多人一上来就照着网上的教程硬怼最后卡在某个加密环节进退两难。所以动手之前先花两分钟给情况分个类。1.2 三种情况的判断标准情况典型特征处理思路可重置Linux 系统盘未加密、GRUB 没设密码Windows 用的是本地账户、没开 BitLocker走正常重置流程半小时内解决麻烦但能救LUKS 全盘加密但记得加密密码BitLocker 开了但有恢复密钥GRUB 设了密码但还记得需要额外多走几步先解锁再重置彻底无解LUKS 密码、BitLocker 恢复密钥都没了虚拟化平台级加密且密钥丢失直接放弃数据格式化重装最快这个判断很关键。举个例子我有个朋友在 CentOS 7 虚拟机上把 root 密码忘了但他装系统时勾了 LUKS 全盘加密加密密码早就不记得。他照着文章改了 GRUB 参数结果系统卡在 LUKS 解锁界面白折腾一小时。后来想明白老老实实重装数据本来就没什么要紧的。1.3 动手之前先做一个保险动作无论你判断自己是哪种情况在动任何“修改系统”的步骤之前先把 vmdk 文件复制一份。不是说操作本身有多危险而是万一你在改 GRUB、改 shadow 文件的时候断电、操作失误、或者系统本来就存在坏道有个备份就能退回去重来。VMware Workstation 的操作很简单关闭虚拟机找到虚拟机目录下的.vmdk文件直接复制到另一个磁盘目录就行。占空间测试机系统盘一般就 20 到 60 GB拷一份完全能接受。花五分钟买一个“后悔药”比改坏了系统再哭划算得多。1.4 值不值得救也是成本问题纯测试机、装了系统就没动过、里面没有任何数据——这种场景我真的建议直接重装。很多人在这种机器上花两小时研究密码重置纯属沉没成本作怪。反过来如果是配好了数据库、装了开发环境、跑了半年的日志数据那才值得认真走一遍下面几条路。2. Linux 虚拟机用 GRUB 引导参数撬开 root 密码的实操步骤2.1 先理解原理启动链路里到底发生了什么Linux 的密码重置方法本质上都是同一条路让系统在启动早期把控制权交给你。了解这点之后命令就不是死记硬背了。正常启动流程是BIOS/UEFI → GRUB → 加载内核和 initramfs → initramfs 挂载真正的根文件系统 → 切换到系统根switch_root→ 启动 systemd。我们要做的事情是在 initramfs 工作到一半或者系统根挂载之后插入一个 shell。此时系统还没有进入完整的登录流程你拿到的是一个 root 权限的救援环境可以手动挂载磁盘、修改文件、重置密码。2.2 rd.breakCentOS/RHEL 7 最顺手的路子我自己最常用的就是rd.break它对 CentOS 7、8、9以及大量基于 RHEL 的发行版都好使也是目前网上教程里出现频率最高的方法。完整步骤如下在 VMware 控制台里重启虚拟机看到 GRUB 菜单时按e进入编辑模式。找到以linux也可能是linux16、linuxefi开头的那一行它一般很长包含内核路径和一堆参数。把光标移到这一行的行尾追加一个参数rd.break然后按CtrlX启动。系统会进入一个 emergency shell此时屏幕提示符看起来像switch_root:/#。依次执行下面这些命令# 查看当前挂载情况确认 /sysroot 存在 mount | grep sysroot # 真正的根文件系统此时以只读方式挂载在 /sysroot先重挂为可读写 mount -o remount,rw /sysroot # 切换到真正的根环境 chroot /sysroot # 修改 root 密码也可以换成其他用户名 passwd root # 如果系统开启了 SELinux这一步不能省 touch /.autorelabel # 退出 chroot再退出 shell系统会自动继续启动 exit exit这套流程的关键是理解/sysroot和/的区别。rd.break中断在 initramfs 阶段这时候你所在的根目录还是内存文件系统真正的系统盘被只读挂载在/sysroot下面。所以必须先重挂为可读写再chroot /sysroot你才能真正操作到系统里的 passwd、shadow 这些文件。2.3 老系统和 Debian 系init/bin/bash 与 rescue mode如果你手里的虚拟机是 CentOS 6、RHEL 6 这类老系统rd.break反而用不顺手。老一代内核没有这个参数更常见的是用init/bin/bash代替同样的方式进 GRUB 编辑界面。在linux行尾把原有的rhgb quiet删掉留着也行但加了容易看不清输出追加init/bin/bash。CtrlX启动后系统根会直接以只读方式挂载在/下不需要再chroot# 重挂根文件系统为可读写 mount -o remount,rw / # 直接改密码 passwd root # 同样建议处理 SELinux touch /.autorelabel # 回到登录流程 exec /sbin/initUbuntu、Debian 系的路数有点不一样。Ubuntu 的 GRUB 菜单里自带一个“Advanced options for Ubuntu”进入后选“Recovery mode”再选“root shell”就能获得一个 root 环境。进去第一件事也是重挂根mount -o rw,remount / passwd 用户名 touch /.autorelabel另外新版 Ubuntu18.04用 systemd如果想走手动路线也可以在 GRUB 的linux行尾部追加systemd.unitrescue.target效果类似。我把三种方式对比一下方便你对照自己手上的系统选方式适用系统进入后根挂载位置是否要 chroot我的心水程度rd.breakRHEL/CentOS 7/sysroot只读要最常用稳init/bin/bashRHEL/CentOS 6 及更老/只读不要老机器才用recovery mode / rescue.targetUbuntu/Debian 系/只读不要简单直接2.4 SELinux 和 PAM 策略改完密码不等于能登录这块是我最想提醒你的。很多人照着教程执行完passwd root重启后满心欢喜去登录结果密码怎么输都进不去或者 SSH 直接拒连于是怀疑教程有问题。大概率不是教程的问题而是你漏了 SELinux 的重新标记。SELinux 会给文件标注安全上下文。你在救援模式下用passwd改写的/etc/shadow文件的 SELinux 标签可能已经变了系统正常启动后因为标签不对直接拒绝读取。解决办法就是我在前面每一步里都写了的touch /.autorelabel。这个文件会在系统下次启动时触发一次全盘重新标记耐心等几分钟到十几分钟系统会自己重启或提示完成。如果你不想等全盘 relabel也可以在 chroot 环境里只修复 shadow 文件的标签restorecon -v /etc/shadow这样快很多前提是你的 chroot 环境里有restorecon命令。再提一个坑有些新版系统默认开启了密码复杂度策略PAM 的 pam_pwquality 模块你执行passwd root的时候输入一个类似123456的密码会被直接拒绝提示 BAD PASSWORD。这时候别慌要么输入一个包含大小写字母和数字的合格密码要么临时放宽策略# 编辑 pwquality 配置把最小长度调低或者注释掉策略 vi /etc/security/pwquality.conf顺带检查一下账户是不是过期了。测试机常年不开机加上某些镜像默认设置了密码时效就算密码改对了系统也会提示账户已过期。执行下面这个命令把账户期限放宽chage -M 99999 root我当年第一次操作就死在 SELinux 上密码改完没管 autorelabel重启后在控制台上看着登录提示符干瞪眼最后翻日志才明白怎么回事。所以你现在记住这条能少走两小时弯路。3. Windows 虚拟机离线重置 SAM 文件的完整链路3.1 原理先行本地账户密码为什么能离线重置Windows 的本地账户密码哈希存在注册表文件里路径是%WINDIR%\System32\config\SAM。只要你能在另一个系统环境里挂载这块 Windows 分区就可以用一个叫chntpw的开源小工具直接改写 SAM把密码清空或者改成你指定的值。这不依赖 Windows 本身是否正常运行也不需要什么“万能密码”本质上是利用“磁盘在手、规则由我”的离线操作思路。3.2 准备救援环境Linux Live ISO 或现成的 Linux 虚拟机chntpw 是 Linux 下的工具所以你需要一个 Linux 运行环境。有两种常见做法第一种给目标虚拟机的光驱挂一个 Linux Live ISO比如 SystemRescue、Ubuntu Desktop 的安装镜像都行然后让虚拟机从 CD 启动。VMware Workstation 里在虚拟机设置中找到 CD/DVD选择“Use ISO image file”启动时按Esc调出 Boot Menu 选光驱即可。第二种如果你宿主机上本来就有一台能用的 Linux 虚拟机直接把这台忘了密码的虚拟机的 vmdk 作为第二块磁盘加进去。具体操作关闭目标虚拟机 → 在现有 Linux 虚拟机的硬件设置里点“添加” → 选择“使用现有虚拟磁盘” → 指向目标 vmdk → 开机后用lsblk确认新盘是否出现。第二种方式我个人更推荐因为不用额外下载 ISO也不影响目标虚拟机原本的启动配置。3.3 chntpw 交互式操作的实际流程假设你已经进入了 Linux 环境并且 Windows 系统盘被识别为/dev/sda2具体分区号用lsblk或fdisk -l确认# 安装必要工具不同发行版包名略有差异 # Debian/Ubuntu 可直接安装 chntpw 和 ntfs-3g apt install chntpw ntfs-3g # 创建挂载点并挂载 Windows 分区 mkdir -p /mnt/win mount -t ntfs-3g /dev/sda2 /mnt/win # 查看 SAM 文件里有哪些用户 chntpw -l /mnt/win/Windows/System32/config/SAMchntpw -l会列出 Windows 账户信息包含账号名、RID 等。确认你要重置的账户名后执行chntpw -u Administrator /mnt/win/Windows/System32/config/SAM进入交互菜单后它一般会显示这个用户的详细信息并让你按回车继续接着出现操作选项Select: q - quit 1 - clear (blank) user password 2 - set (preset or given) user password 3 - promote user (put user in Administrators group) 4 - unlock and enable user account选1是清空密码选2是设置一个新密码具体菜单编号以你下载的 chntpw 版本为准看清说明再选。我自己的习惯是选择清空密码重启进 Windows 后用空密码登录再在系统里手动设置新密码。为什么因为 chntpw 写入密码哈希时用的是它自己实现的算法兼容性虽然没问题但直接在 Windows 图形界面里设置密码更省心。操作完成后卸载分区关掉救援环境正常启动虚拟机。别忘了如果 SAM 所在分区启用了快速启动或者 Windows 没有完全关机休眠文件残留可能出现文件被锁定的提示。在 Linux Live 环境下一般不会有这个困扰但如果加了挂载参数还报只读检查一下是不是分区被标记了dirty用ntfsfix /dev/sda2修一下再挂载。3.4 BitLocker 与 Microsoft 账户两个绕不开的边界BitLocker 是 Windows 离线重置最大的敌人。如果 Windows 系统盘开了 BitLocker那你看到的不是 NTFS 分区内容而是一堆看起来像乱码的加密数据SAM 文件根本读不出来。这时候唯一的出路是找回 BitLocker 恢复密钥——它通常保存在 Microsoft 账户里、AD 域环境里或者你自己打印/保存过的 txt 文件中。Microsoft 账户登录的情况也值得提醒。如果你在 Windows 10/11 上用的是微软账号而不是本地账户光改 SAM 里的本地哈希还不够。系统重启后可能要求你输入 PIN 或者联网校验微软密码或者 Windows Hello 直接把登录界面锁死。更稳的做法是重置本地 Administrator 账户后进去新建一个本地管理员账户然后切断在线账户绑定。顺便说一句Windows 11 的虚拟机会默认开启“设备加密”这本质上就是 BitLocker。如果你在 VMware 装 Windows 11 时开启了默认加密选项密码重置前先确认恢复密钥在哪。3.5 给 Windows 虚拟机再补一条逃生路WinPE NTPWEdit如果你对 Linux 命令不熟悉还有一条“图形化”路线下载一个 WinPE 镜像微 PE、优启通等给虚拟机光驱挂上启动进入 PE 环境打开内置的 NTPWEdit 工具界面里直接选择 SAM 文件、勾选要重置的用户、清空密码即可。它的原理和 chntpw 完全一样只是套了个图形外壳。我自己更喜欢 chntpw因为命令行可控性更强而且大部分 PE 镜像来源不明安全性要打个问号。4. 更省事的路径快照回滚与虚拟磁盘直读4.1 快照回滚效果最干净但有时限如果你在忘记密码之前打过快照那这是“后悔药”里的最优解。VMware 里操作很简单右键虚拟机 → 快照 → 还原到快照。快照的本质是把虚拟机的磁盘状态、内存状态、配置都定格在某个时间点。回滚之后系统会恢复到打快照那一刻的状态——密码是当时的密码文件也是当时的文件快照之后产生的所有变化全部消失。所以这个方案有两个适用条件一是有合适的快照二是你愿意接受快照之后的数据丢失。如果你昨天刚建好系统并打了快照今天就忘密码回滚几乎零成本但如果快照是三个月前打的你宁愿花半小时重置密码也不愿意丢掉三个月的数据。另外一个实用技巧如果快照时间点不够新但你又想保留最新磁盘数据可以先把当前状态克隆一份VMware 的克隆功能会做完整复制再去回滚快照。这样两边都不耽误只是磁盘占用会翻倍。4.2 把 vmdk 挂到另一个系统上直接操作没有快照也别急着走救援模式。我经常用的一招是把目标虚拟机的 vmdk 作为磁盘挂到另一台能用的虚拟机里直接操作。这比“改引导参数”更稳因为它完全不碰目标虚拟机的引导链也就不会出现 GRUB 配置改错、内核参数加歪这类风险。操作流程关闭目标 VM → 在一台健康的 Linux VM 上添加硬盘并选择已有磁盘 → 指定 vmdk 文件 → 启动后lsblk看到新盘 → 挂载分区。挂载之后你能干什么Linux 系统可以挂载根分区直接修改/etc/shadow或者 chroot 进去跑passwdWindows 系统可以挂载 C 盘把Windows/System32/config/SAM拿出来给 chntpw 处理。本质上和救援模式做的事一样但因为宿主系统是健康的你还可以顺手备份一些重要文件出来。挂载有两个细节要注意。第一目标虚拟机的 vmdk 不能被两个虚拟机同时使用VMware 会给磁盘文件加锁你先要把目标虚拟机关机。第二VMware 默认的 vmdk 可能是分多个文件存储的比如xxx-s001.vmdk这种分割虚拟磁盘添加磁盘时选择那个主描述文件metadata 文件即可VMware 会自动关联所有分片。4.3 DiskGenius 这类工具能帮上什么忙Windows 宿主机上不想装 Linux 虚拟机还可以用 DiskGenius 这类支持虚拟磁盘读写的工具。它能直接打开 vmdk 文件浏览分区里的目录结构甚至复制文件出来、修改部分文件内容。但我的建议是用 DiskGenius 来“看”和“救”数据可以用它直接改 SAM 或 shadow 文件就不太稳妥了。这类 Windows 图形工具对虚拟磁盘的写入支持没有 Linux 原生挂载来得可靠而且它本身也不是为密码重置设计的。真到了需要修改系统文件的程度还是老老实实走 Linux 流程要么挂载到现有 VM要么挂 Linux Live ISO 启动救援环境。5. 重置密码会失效的场景GRUB 密码、LUKS 与 BitLocker 这些硬边界5.1 GRUB 密码一旦设置前面所有花招都卡在门口GRUB 密码是大多数网贴不会提到的一个“隐藏关卡”。如果你的系统在安装时或者之后通过grub2-setpassword设置了 GRUB 密码那在 GRUB 菜单里按e编辑启动参数时系统会先要你输入 GRUB 用户名和密码输不对就进不去编辑界面。这种情况下rd.break、init/bin/bash、recovery mode 全都失效。因为它们的起点都是“修改引导参数”而你根本没有修改资格。如果你记得 GRUB 密码那只是多输一步的问题如果你连 GRUB 密码也忘了事情就麻烦了。理论上可以通过 Live 环境挂载系统盘重新安装 GRUB 或者清空用户配置但这属于另一套更复杂的操作而且容易把自己搞得更被动。所以我给虚拟测试机用户的建议是别给 GRUB 设置密码没有实际意义只会锁死自己。5.2 LUKS 全盘加密的链路逻辑Linux 安装时如果勾选了磁盘加密那系统盘整个被 LUKS 容器包住。启动流程会变成GRUB 加载 initramfs → initramfs 里的 cryptsetup 要求输入加密密码 → 解锁/dev/mapper/xxx→ 挂载真正的根文件系统。这对密码重置的影响分两种情况记得 LUKS 密码忘了系统用户密码没问题在rd.break进入的 shell 里先通过 cryptsetup 把加密卷解锁系统启动时输一次 LUKS 密码然后正常挂载/sysroot、chroot、改密码。忘了 LUKS 密码彻底没救。因为所有数据都在加密容器里没有钥匙任何文件都读不到包括/etc/shadow。这时候花时间研究重置技术毫无意义不如格式化重装。说实话虚拟机场景下 LUKS 并不常见因为虚拟化平台本身已经是一层隔离和安全边界大部分测试机压根没必要再套一层加密。但如果你的环境有安全要求必须加密务必把 LUKS 密码记在密码管理器里。5.3 BitLocker 与设备加密Windows 虚拟机这边对应的就是 BitLocker。前面说过SAM 文件被加密锁定chntpw 和 NTPWEdit 都读不出来。唯一的路是找到恢复密钥解锁分区再进行密码重置。需要特别留意的是Windows 10/11 的“设备加密”在很多预装环境里是默认开启的VMware 安装 Windows 11 时如果没有自定义关闭系统盘可能自动启用 BitLocker。所以排查思路应该是先看 Windows 分区在 Linux 下能不能正常挂载读取。如果能读直接重置密码如果不能读、报一堆 I/O 错误先别怀疑工具问题考虑 BitLocker 挡路了。5.4 平台级加密与授权边界最后一种硬边界是虚拟化平台本身加密比如 vSphere 的加密虚拟机和加密磁盘。这种加密发生在 hypervisor 层和客户机操作系统无关。磁盘里的数据在宿主机层面就已经密文存放了。如果平台密钥没有丢失你可以正常操作虚拟机如果密钥丢失那字符文件、SAM 文件、LUKS、BitLocker 全部无从谈起——你连 vmdk 解不开。这种情况的主角已经从“系统密码”变成了“密钥管理”已经不是靠几个命令能解决的事。到这里我必须再强调一遍以上所有方法成立的前提是你是这台虚拟机的合法管理员。虚拟机的存在本身、vmdk 文件的所有权、虚拟化平台的登录权限这些都是你操作权的来源。任何把这些方法用在他人系统上的行为都已经跨过了技术讨论的边界。6. 根治“忘密码”测试环境密码管理和快照习惯6.1 给每台虚拟机建立一份总台账排查完一圈之后你会发现与其每次忘密码都走一遍重置流程不如一开始就解决“为什么会忘”的问题。拿我自己来说现在每建一台虚拟机会立刻做两件事一是把主机名、系统版本、账户名、密码全部记进密码管理器我用的是 KeePass开源且本地存储二是设置一个统一的测试密码规则。测试机没必要学生产环境搞高强度随机密码。我的建议是同一批内网隔离的测试机共用一套相对复杂但统一的密码比如TestEnv#2024!这种级别。这是为了兼顾“方便记忆”和“基本安全”。虚拟机的网络通常是 NAT 隔离的外部根本访问不到没必要拿生产环境的复杂度标准来折腾自己。6.2 密码过期策略要么关掉要么加提醒热词里有个“linux密码过期提醒通知”搜索量非常高说明不少人都被密码过期坑过。企业服务器的密码过期策略是安全要求但自己玩的虚拟机默认也在做密码过期这就很烦了。我在测试机的密码管理上直接关闭过期策略# 将 root 账户的密码有效期设为无限 chage -M 99999 root # 查看账户过期信息 chage -l rootWindows 虚拟机也一样在本地安全策略里把“密码最长使用期限”设置为 0密码永不过期或者设一个很长的天数。如果你是管着一批 Linux 服务器的人不能一刀切关掉策略那就得考虑自动化提醒。最轻量的办法是写一个每天跑一次的 cron 脚本检查各用户距离密码到期还剩多少天低于 7 天就给运维邮箱发提醒。脚本核心就是一行chage -l加日期比较逻辑半小时就能写完。重点是别让“密码过期”和“忘记密码”叠加在一起变成事故。6.3 快照是比密码更可靠的“系统还原点”密码急救只是零头快照才是虚拟机的终极保命技能。我现在每次创建虚拟机装完系统立刻打一个“初始状态”快照配置好开发环境、部署完项目、验证通过再补一个“阶段完成”快照。后面密码忘了、系统崩了、软件装坏了直接回滚一分钟回血根本不用分析原因。很多人觉得快照占磁盘空间就一直不打这个观念得改改。快照只记录相对虚拟磁盘父文件的变化量不是完整复制整个磁盘。拿 VMware Workstation 来说你保留两到三个不同阶段的关键快照空间成本完全在可接受范围内。打快照的代价和重置密码的折腾相比简直不值一提。6.4 一个实用的“逃生舱”思路最后分享一个我长期使用的运维习惯在虚拟机里始终留一个独立的管理入口。Linux 虚拟机可以配置 SSH 公钥登录——密码忘了也不怕密钥还能进Windows 虚拟机可以在系统里创建一个隐藏的本地管理员账户专门给控制台应急用平时不动它。这套打法的思路是密码本身是身份认证的一种手段但不是唯一手段。只要你同时握有密钥、快照、密码管理器这几个“逃生舱”任何一条路断了都有另一条路兜底。重置密码的教程只是教你在某个场景下的补救手段真正成熟的运维状态是让“补救”这件事变得几乎不需要发生。从我自己的经验来说自从开始用密码管理器加快照组合拳之后已经好几年没再碰过“忘记虚拟机密码”这个急救流程了。希望这篇文章能帮你在下一台忘密码的虚拟机上少花一点冤枉时间。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进