ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

虚拟机密码忘记不用重装:Linux/Windows密码重置完整指南

虚拟机密码忘记不用重装:Linux/Windows密码重置完整指南 干运维这些年半夜被电话叫醒的紧急事件里密码遗忘至少占了三分之一。尤其跑在VMware、VirtualBox这类虚拟化平台上的业务系统一旦登录密码丢了很多人第一反应就是格式化重装其实大可不必。虚拟机本质上就是几个存放在宿主机磁盘里的文件相比物理机板在机柜里拆不了硬盘、拔不了电池虚拟机的抢救空间要大得多密码重置这件事也远没有想象中困难。这篇指南就是把“虚拟机密码重置”这件事讲透。无论你用的是VMware Workstation、VirtualBox还是vCenter里管理的ESXi虚拟机无论系统是Ubuntu、CentOS、麒麟还是Windows都有对应的重置思路和实操步骤。我会把原理、命令、坑点一次性说清楚适合刚入行的运维新人也适合那些已经踩过几次坑、想系统梳理一遍的老手。1. 为什么虚拟机重置密码比物理机轻松得多1.1 虚拟机的本质是“一个文件夹”很多人习惯把虚拟机当成一台完整的电脑其实从宿主机角度看一台虚拟机就是磁盘上的一个目录VMware的虚拟机是vmname.vmdk、vmname.vmx这组文件VirtualBox是.vdi和.vboxHyper-V是.vhdx。既然虚拟磁盘是文件就意味着可以做物理机做不到的三件事随时打快照、随时复制一份、随时用外部介质引导。密码重置之所以能顺利进行靠的正是“系统启动过程中存在可干预缝隙”这件事。物理机上你也能通过单用户模式重置Linux密码但难点在于数据中心的服务器没有本地显示器、键盘远程控制卡IPMI/iDRAC不一定开通操作起来相当被动。虚拟机不一样你在VMware Workstation里点一下“打开控制台”就等于同时拿到了显示器、键盘和电源按钮还可以直接修改虚拟机的启动磁盘顺序、挂载一个ISO镜像。抢救效率高出一大截。另外虚拟机平台本身还提供快照功能。重置密码前如果虚拟机还能开机先打一个快照是最稳的操作。一旦重置过程中把系统搞崩了回退快照几秒钟就能恢复原状。这种容错能力是物理机完全给不了的也是我强烈建议虚拟机环境优先选择重置而不是重装的核心原因。1.2 三大重置路径与选型逻辑虚拟机密码重置常用路径有三条具体用哪条取决于系统和故障状态。第一条是Linux系的“单用户模式”或“紧急模式”。通过修改GRUB引导参数让内核跳过完整的系统初始化直接进入一个带Shell的最小环境在这个环境里执行passwd命令即可重设密码。它的前提是你能进入GRUB菜单适合那些还没有彻底损坏、只是密码丢失的系统。第二条是借助外部启动盘。Windows系统用WinPELinux系统用Live CD/USB。把ISO镜像挂载到虚拟光驱将虚拟机启动顺序调整为光驱优先然后从外部介质引导直接操作原系统的密码存储文件。它的适用范围最广不管系统能不能正常引导只要虚拟磁盘文件没有损坏这条路基本都能走通。第三条是“离线修改配置文件”。这条主要用于应用层密码重置比如你成功进入系统了但登录Artifactory时发现admin密码也忘了。这时候要修改的是应用自身的用户数据库或哈希文件跟操作系统的passwd机制已经没关系。选型逻辑并不复杂能进GRUB就优先单用户模式这条路最快不用额外准备镜像进不去GRUB或者系统引导损坏就用外部启动盘如果是应用层密码问题就直接跳到第三条。2. Linux虚拟机密码重置三步走2.1 Ubuntu/Debian 系GRUB 单用户模式重置Ubuntu和Debian系的虚拟机重置密码最常用的就是给内核追加init/bin/bash参数让系统启动后直接进入一个bash Shell。打个比方这相当于汽车打不着火你把发动机盖打开不经过正常点火流程直接手动把曲轴转起来就为了打开车门拿钥匙。具体操作如下。第一步重启虚拟机。在VMware或VirtualBox里重启的同时连续按Shift键BIOS引导的机器多按ShiftUEFI引导的需要按得早一点、频繁一点会出现GRUB菜单。如果错过了GRUB菜单也没关系重启再试一次虚拟机控制台的键盘输入响应基本是即时的比物理机好抓。第二步在GRUB菜单里选中第一条通常写着“Ubuntu”或“Advanced options for Ubuntu”按下e键进入编辑模式。这时会看到一堆引导参数找到以linux开头的那一行这个行通常长这样linux /boot/vmlinuz-xxx-generic rootUUID... ro quiet splash第三步把这行里的ro改成rw然后在行尾追加init/bin/bash。改完后按CtrlX或F10启动。ro改成rw的目的是让根文件系统以读写模式挂载否则后面执行passwd时会提示“Authentication token manipulation error”也就是无法写入密码文件。启动后你会得到一个root(none):/#之类的Shell这时直接执行passwd 用户名比如要重置root密码就执行passwd root输入两次新密码。如果系统提示passwd: password updated successfully说明已经成功。最后输入exec /sbin/init或者直接reboot -f重启系统用新密码登录就行。这里有个容易被忽略的细节有些虚拟机在UEFI模式下GRUB菜单里找不到linux开头的那一行而是linuxefi开头千万别纠结名字逻辑完全一样照改即可。另外Ubuntu默认没有启用SELinux所以不需要执行后面CentOS章节提到的touch /.autorelabel但如果你的Ubuntu服务器手动装过SELinux最好还是多做这一步。2.2 CentOS/RHEL 系rd.break 与 SELinux 处理CentOS、RHEL这类基于RHEL体系的系统重置密码有另一套更稳的路径rd.break。这个参数会让系统在启动早期停下来进入一个临时的switch_root环境同样可以做密码修改。操作步骤如下。先进入GRUB菜单方法同Ubuntu。找到以linux16老版本或linuxefiUEFI、新版本开头的那一行在行尾追加参数rd.break按CtrlX启动系统会停在switch_root:/#提示符。这个环境和正常系统完全隔离根文件系统此时挂载在/sysroot目录下而且默认是只读的。所以第一步要重新挂载为可写mount -o remount,rw /sysroot然后进入真实的根目录环境chroot /sysroot这时执行passwd root设置完新密码后还有一步非常关键执行touch /.autorelabel这一步是为了告诉SELinux下次启动时重新标记文件安全上下文。CentOS和RHEL默认开启SELinux如果你跳过了这一步重置完密码重启后极有可能遇到认证失败、无法登录的窘境到时候你会以为是密码没改对其实是被SELinux拦截了。autorelabel的过程可能需要几分钟虚拟机配置低的话时间更长耐心等它跑完。翻车概率最高的就是这个环节。我见过不少同事重置完密码后卡在登录界面journalctl -xe一看全是SELinux报错最后只能再进入rd.break环境补做一次relabel白白多折腾两轮。2.3 麒麟系统等国产 Linux 的注意点现在国产化环境用得越来越多银河麒麟、中标麒麟、统信UOS这类系统的密码重置需求也频繁出现。麒麟系统本质上脱胎于Linux内核桌面版Kylin Desktop偏向Debian/Ubuntu体系服务器版Kylin Server更接近RHEL/CentOS的体系。所以重置方法完全可以参照前面两小节关键点在于辨别版本。如果是麒麟桌面版优先尝试Ubuntu的init/bin/bash方案。但有一点要注意麒麟桌面版默认禁用了root登录如果你重置的是普通用户密码记住passwd 用户名后半部分要改成实际用户名如果重置的是root密码还要检查/etc/ssh/sshd_config里是否允许root远程登录这里是“能否本地登录”和“能否SSH登录”两回事本地控制台登录root一般不受限制。如果是麒麟服务器版rd.break方案更稳妥步骤和CentOS完全一致。需要注意麒麟的安全组件比如kylinsec、secadm这些安全策略会在密码策略上做额外限制重置的密码如果太简单可能被系统策略直接拒绝尽量设置符合复杂度要求的强密码大小写字母加数字加符号。另外麒麟系统的GRUB引导菜单在某些版本中默认隐藏了开机时同样要快速按Shift或Esc。如果一直进不去GRUB可以在虚拟机设置里调整引导方式关闭“快速启动”或者直接在VMware的VMX文件里加一行bios.bootDelay 5000把启动延迟调到5秒给操作留足时间。3. Windows 虚拟机密码重置两种常用方案3.1 WinPE 挂载镜像离线改密码Windows虚拟机密码重置最通用、最不容易出岔子的方案是用WinPE启动盘。WinPE是微软官方维护的最小Windows环境主要用途就是系统维护和恢复在虚拟机里用极其合适。操作分三步。第一步准备一个WinPE的ISO镜像。可以自己用Windows ADK制作也可以下载微PE、优启通这类第三方PE。考虑到虚拟机里没有无线网卡、打印机这些外设需求PE体积不用大能进入命令行就行。第二步在虚拟机设置里把WinPE ISO挂载到虚拟光驱并调整引导顺序为光驱优先。不同虚拟化平台操作略有差别VMware Workstation在“打开电源时进入固件”里设置VirtualBox在“存储”界面挂载ISO后重启按F12选择光驱引导。第三步进入WinPE后找到密码修改工具。图形化的推荐NTPWEdit这款工具很小直接读取C:\Windows\System32\config\SAM文件列出所有本地用户勾选用户后输入新密码即可。命令行方式也可以用reg load配合net user操作但步骤繁琐不如图形工具直观。NTPWEdit使用时有几个容易踩的坑。一是SAM文件路径必须是系统盘里的Windows\System32\config\SAM不要在PE的临时目录找。二是修改完密码后必须点击“写入”按钮否则只改了内存里的缓存重启还是一样。三是如果虚拟机系统盘启用了BitLocker加密PE里根本看不到系统分区内容NTPWEdit直接搜不到SAM文件这种情况必须先找到BitLocker恢复密钥在PE里解锁磁盘后再改密码。3.2 登录界面 sethc 替换大法第二种Windows方案是替换系统的粘滞键程序sethc.exe。Windows登录界面连续按五次Shift会弹出一个对话框这个动作实际调用的是sethc.exe。而这个程序在登录界面是以系统最高权限运行的如果我们把它替换成cmd.exe意味着在登录界面就能呼出一个SYSTEM权限的命令行直接执行net user修改密码。具体操作如下。同样先用WinPE启动虚拟机。进入命令行界面后先备份原文件rename C:\Windows\System32\sethc.exe sethc.exe.bak copy /y C:\Windows\System32\cmd.exe C:\Windows\System32\sethc.exe如果提示权限不足需要先修改文件的所有者和权限takeown /f C:\Windows\System32\sethc.exe icacls C:\Windows\System32\sethc.exe /grant Administrators:F替换完成后正常启动虚拟机来到登录界面连续按五次Shift就会弹出命令提示符。这时执行net user列出的账户名中找到你要重置的那个账户然后执行net user Administrator 新密码看到“命令成功完成”就说明已经生效。换登录密码登录即可。这个方法比NTPWEdit省事但要注意两点第一Win10 1903以后的版本对系统关键文件做过更严格的保护替换前务必用takeown和icacls拿到完全控制权限否则copy会失败第二改完密码后出于安全审计考虑建议把sethc.exe恢复回原版毕竟生产环境中留着一个“登录界面就是管理员命令行”的后门很不稳妥。顺便提一句utilman.exe屏幕键盘快捷键“WinU”也可以替换原理一样。如果Shift五次被系统策略禁用了就用utilman这条路。4. 应用层密码重置以 Artifactory 为例4.1 为什么系统密码重置还不够虚拟机密码重置并不局限于操作系统登录。我实际工作中遇到最多的是“系统密码搞定了一个结果应用层又卡住了”。典型场景你费了半天劲用单用户模式重置了Linux的root密码成功登录后发现里面那套JFrog Artifactory的admin密码也早就忘了用root权限什么都做不了业务操作。这时的重置对象已经从操作系统换成了应用自身。Artifactory的管理员信息存储在Access服务后端的数据库里操作系统层面的passwd对它根本没有作用。你得直接把用户密码字段从数据库里改掉或者通过某种方式引导应用信任一个新账号。这也能解释为什么很多运维觉得这类应用密码重置头疼应用通常有自己独立的用户体系认证逻辑和操作系统隔离。不过思路万变不离其宗——既然应用把密码存在数据库里我们就去数据库改。4.2 绕过 Admin 死锁的两种做法Artifactory重置admin密码前提是你能访问到它背后的数据库。Artifactory用户数据默认存储在自带的内嵌Derby数据库或者你在安装时改成了PostgreSQL。无论是哪种操作流程都类似。第一步停止Artifactory服务避免在修改过程中被应用回写覆盖。通常执行systemctl stop artifactory第二步连接数据库查看用户表。表名不同版本略有差异常见的是access_users。psql -U artifactory -d artifactorySELECT * FROM access_users WHERE username admin;找到password字段后需要把它替换成新版密码的bcrypt哈希。用htpasswd生成htpasswd -bnBC 10 你的新密码 | tr -d :\n命令输出结果形如$2a$10$...这就是Artifactory能识别的密码哈希。然后执行更新UPDATE access_users SET password 上面的哈希值 WHERE username admin;如果是Derby数据库连接语法略有不同但核心的UPDATE语句结构一致。操作前一定要备份数据库文件这是铁律。第三步启动Artifactory用新密码登录admin。如果登录后看到权限异常多半是数据库更新时把其他字段也碰了回滚备份重来即可。如果数据库方案不方便操作还有一条路在Artifactory安装目录下找var/etc/access里的配置文件有些版本支持通过配置引导一个未初始化状态相当于恢复出厂。但这条路副作用大相当于把整个Access服务重置所有本地用户都会丢失。不到万不得已我不建议用它数据库定点修改才是相对精准的恢复方式。5. 常见问题速查与避坑实录5.1 重置过程中最常见的6个坑密码重置的流程不难但现实中翻车点密集。我把这些年踩过的坑按现象整理成一张速查表方便你排查。现象可能原因解决办法重启时进不了GRUB菜单引导时间太短按键时机错过修改VMX文件加bios.bootDelay或启动前用虚拟机固件菜单强制进引导passwd提示“Authentication token manipulation error”根文件系统仍是只读模式确认已经把ro改为rw或者手动执行mount -o remount,rw /CentOS重置后依然无法登录SELinux未重新标记文件上下文重新进入rd.break环境执行touch /.autorelabel并等它跑完Windows的PE里看不到C盘系统盘启用BitLocker加密提供恢复密钥解锁磁盘没有密钥基本无解替换sethc后连续按Shift没反应替换失败或系统策略禁用了粘滞键重新进PE检查sethc.exe和cmd.exe是否同名换个utilman.exe路径VMware启动虚拟机蓝屏虚拟化平台未开启VT-x或虚拟机配置不兼容进入宿主机BIOS开启Intel VT-x检查VMware版本和虚拟机硬件兼容性提示无法启用虚拟机平台虚拟机平台服务未启动或Hyper-V与VMware冲突启动相关Windows服务如果装了Hyper-V又装了VMware二选一表格里最后两行容易让人误以为和密码无关但其实关系很大。虚拟机平台服务异常时你可能连控制台都打不开重置操作根本无从谈起VMware里启动Linux虚拟机蓝屏也可能是CPU虚拟化没开系统引导异常同样没法到达GRUB界面。5.2 虚拟机加密、快照与备份意识讲到密码重置我特别想强调“虚拟机加密”这个隐藏杀手。如果你在虚拟机平台上启用了类似“加密整个VM”的功能比如VMware的Encrypted VM那么虚拟磁盘文件是经过平台级加密的。这种情况下前面讲的单用户模式、WinPE、替换sethc、直接改数据库哈希全部会碰壁因为平台不会把解密后的磁盘暴露给外部工具。虚拟机加密本身是一种安全加固但在密码遗忘的场景里它会变成一道锁死所有救援通道的墙。遇到这种虚拟机重置密码前必须先通过平台界面解除加密或者准备好加密密钥和恢复文档。另外强烈建议养成的习惯是任何一次密码重置操作前只要条件允许先打快照。VMware里在虚拟机右键菜单点“快照-拍摄快照”VirtualBox里“生成备份”Hyper-V里“检查点”都很快。打快照的意义不只是“能回滚”更在于让你在操作时心态平和。密码重置这种低风险操作如果因为系统文件损坏需要反复尝试快照是唯一的后悔药。我个人的习惯是在交付新虚拟机前就设置好密码并把密码记录到内部密码管理工具里。虚拟机批量克隆时所有克隆节点的密码都一样后续再通过配置管理工具批量改密。这样即便某个节点密码遗忘也有迹可循、有策可用不至于所有节点全部变成“孤儿”一台台去重置重置到第三台你就知道有多痛苦了。这些都是实操换来的教训。密码重置本身不算什么高深技术但它考验的是你对系统启动链路、认证机制和虚拟化平台特性的综合理解。把这个环节吃透以后再遇到“密码忘了”这种事你就能先喝口茶再打开控制台从容不迫地把它处理完。
RELATED READING

延伸阅读

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