ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

虚拟机密码忘了不用重装:主流平台密码重置实战指南

虚拟机密码忘了不用重装:主流平台密码重置实战指南 前两天有个朋友给我打电话说他的 Windows 虚拟机进不去了密码怎么输都是错里面还跑着给客户演示用的环境。他第一反应是删掉虚拟机重新装一个我赶紧劝住了。虚拟机这东西密码丢了真的没必要重装——快照、ISO、启动参数这些资源都是现成的重置密码的成本远比你想象的低。这篇文章我就把自己这些年折腾虚拟机密码重置的经验整成一份清单覆盖 VMware Workstation、vSphere、VirtualBox 这些常见平台也覆盖 Windows、Linux、UOS、银河麒麟这些常见客户机系统。不管你是刚入行的运维还是被测试环境密码坑过的开发者都能在这里找到能直接抄的作业。1. 场景分析为什么虚拟机密码重置是刚需1.1 谁会在什么地方卡住先说几个我实际遇到过的场景你大概率也碰上过。第一是接手旧环境。公司里虚拟机数量一多交接文档跟不上上一任管理员设置的密码可能只存在于他的脑子里。我接过一台 CentOS 7文档里写的是 root/123456实际登录却永远提示 Authentication failure打电话一问人家早忘了什么时候改过。第二是模板克隆导致的密码冲突。很多人用模板批量创建虚拟机模板里的密码是统一的创建完之后又忘了改结果几台机器同时要登录密码却对不上。更麻烦的是一旦开了 SSH 密钥登录你连密码错误提示都见不到直接被拒。第三是测试环境的密码定期轮换。很多公司有安全策略要求密码每 90 天必须改一次测试环境的虚拟机没人维护改完密码也没有记录。三个月后你想登录看一眼服务状态密码早就不知道飞哪去了。第四是快照回滚导致的密码失效。虚拟机最方便的地方是随时可以回滚快照但如果你把系统回滚到几周前的状态那时候的密码和现在可能完全不同。很多人回滚完才发现系统倒是正常启动了密码却不是自己记得的那一个。这些场景都有一个共同特点虚拟机本身没有坏系统能启动数据都在只是密码丢了。这时候直接重装等于把数据库、中间件、网卡配置、软件激活状态全部重新折腾一遍时间成本和风险都太高。重置密码才是性价比最高的方案。1.2 虚拟机密码重置和物理机到底差在哪同样是密码重置虚拟机比物理机多出了好几条“后悔路”。物理机上你只能拆硬盘、用 PE、短接主板运气不好还得找专业工具操作过程中一个失误就是数据全毁。虚拟机的优势在于三个层面。一是可逆性强。操作前做一个快照重置失败随时回滚相当于给整个操作上了保险。我在给客户机重置密码前一定会先确认快照已经拍好哪怕这台虚拟机只是临时测试用的我也会拍一个因为手滑的风险谁都没法预测。二是操作途径多。虚拟机可以随意挂载 ISO、修改启动参数、调整引导顺序甚至可以编辑虚拟机的 .vmx 配置来绕过某些限制。比如在 VMware Workstation 里你可以临时把硬盘控制器改成 IDE 模式也可以用虚拟光驱加载一个 PE 镜像整个过程不会影响宿主机。三是控制台更灵活。vSphere、Workstation、VirtualBox 都有远程控制台哪怕客户机蓝屏、黑屏你也能看到引导过程。物理机上如果显示器坏了或者没有 VGA 接口这套流程走不通虚拟机里只要坐在这台宿主机前就能操作。但这不等于说虚拟机密码重置一定能成功。有两个因素会让难度直线上升一个是客户机磁盘加密比如 Linux 的 LUKS 和 Windows 的 BitLocker这种状态下即使你修改了密码文件系统启动时磁盘解密那一步还是会卡住你另一个是虚拟化平台本身不可用比如 vCenter 挂了虚拟机注册信息丢失那你得先修复平台再谈密码。所以做任何操作之前先评估一下能不能直接访问客户机的磁盘文件这是最关键的一道判断题。2. 重置前的准备工作与关键判断2.1 先搞清楚你的平台和客户机系统很多人上来就问“虚拟机密码怎么重置”其实这个问题得拆成两半你的虚拟化平台是什么客户机系统是什么。平台决定你怎么引导、怎么挂载工具盘客户机系统决定你要改哪个文件、走哪条重置路径。先看平台。VMware Workstation 的操作入口在“虚拟机设置”里可以挂载 ISO、调整启动顺序、管理快照。VirtualBox 在“设置 - 存储”里挂载光驱在“控制”菜单里管理快照。vSphere 则是在虚拟机编辑界面的“CD/DVD 驱动器”里挂载 ISO然后从 Web 控制台或 vSphere Client 里操作。Hyper-V 的方向不一样它通过“虚拟机连接”窗口里的“媒体”菜单挂载 ISO而且需要在“设置 - 固件”里把启动顺序改成从 DVD 启动。再看客户机系统。不同系统的处理方式差异非常大我整理了一张选型表方便你直接对号入座。客户机系统推荐重置方式核心工具/命令CentOS / RHEL 7-9rd.break 或 init/bin/bashpasswd、chrootUbuntu / Debianrecovery 模式或 live CDmount、passwdWindows 10/11 / ServerPE 离线改密码或 utilman 替换NTPWEdit、cmdUOS / 银河麒麟单用户模式或 live CDpasswd、mount判断客户机系统的方法很简单登录界面或者系统启动画面一般就能看出来。如果你实在看不出来就看虚拟机的配置文件名或者磁盘分区结构Linux 一般是 ext4、xfs 分区Windows 一般有 NTFS 分区和一个系统保留分区。2.2 快照最便宜的安全绳我见过太多人跳过快照直接去改密码改坏了又来找我救场。实际上在虚拟机上做个快照成本几乎为零但作用却是兜底的。快照的原理是保存虚拟机在某一时刻的磁盘状态和内存状态。做快照之后你再去折腾密码哪怕把 GRUB 配置改得面目全非把 SAM 文件清空了也可以一键回到快照时的状态。这点跟物理机完全不同物理机上做系统备份往往要走一整趟备份流程虚拟机上只需要鼠标点几下。做快照要注意几个细节。第一最好在虚拟机关机状态下做快照这样快照的内容干净可控。如果虚拟机正在运行VMware 也会生成“内存快照”回滚时会恢复内存状态反而可能把一些缓存或者未保存的数据带回来容易搞出诡异问题。第二快照命名要写清楚比如“重置密码前-2024-01-15”不要一堆快照全叫“Snapshot 1”否则回滚的时候你根本不知道自己在哪。第三对于极其重要的环境建议在快照之外再复制一份虚拟磁盘文件到别的目录VMware 的 vmdk、VirtualBox 的 vdi、Hyper-V 的 vhdx 都可以在关机状态下完整复制这算双保险。我个人的习惯是重置密码前做一个快照重置成功后立刻再做一个新快照命名为“密码已重置-日期”这样后续如果要回滚也能准确找到重要时间点。3. 主流方案一Linux 系虚拟机密码重置实战3.1 CentOS / RHEL 7 系列 rd.break 重置法CentOS 和 RHEL 7 系列是我在生产环境里遇到最多的客户机系统。重置密码最稳的方式是rd.break原理是在内核启动阶段打断正常的启动流程进入一个临时的维护 shell。具体步骤是这样的。开机进入 GRUB 菜单把光标移到你要启动的内核那一行按e键进入编辑模式。找到以linux或linux16开头的那一行注意不是menuentry那行在这一行的末尾加上rd.break然后按Ctrlx或者F10启动。系统会进入一个类似switch_root:/#的提示符。到了这个提示符之后依次执行下面几条命令mount -o remount,rw /sysroot chroot /sysroot passwd root touch /.autorelabel exit reboot这里每一步都值得解释清楚。mount -o remount,rw /sysroot是把系统根目录由只读改为可写因为rd.break阶段/sysroot默认是只读挂载不改成可写后面passwd会直接报错说“只读文件系统”。chroot /sysroot是切换到实际的系统根目录此时你能看到正常的/etc、/home、/var这些目录结构passwd root修改的才是真实系统里的密码。touch /.autorelabel这一步很多人容易漏掉。CentOS 7 默认开启了 SELinux密码文件/etc/shadow有 SELinux 上下文标记。你手动用passwd改了文件上下文可能不对重启后系统会卡在 SELinux 标签校验的地方或者表现成密码明明改了却登录不进去。touch /.autorelabel的作用是让系统在下次启动时重新给文件系统打一遍 SELinux 标签等于做一次“安全上下文校准”。如果你的系统里 SELinux 已经被关掉了那这一步可以跳过。但如果你不确定我建议永远加上多花一点重启时间总比再被卡一回强。实际操作中容易踩的坑有三个。一是找错了行把rd.break加到了menuentry那一行结果只是给启动项起了个名字完全没有效果。二是加了参数但没保存GRUB 编辑模式下的改动是临时的重启之后会自动恢复默认启动项所以流程走对了一次成功但下次开机密码还是不对这种情况你只能再走一遍流程。三是 Passwd 修改成功后重启又提示登录失败多半是 SELinux 的问题这时候可以先在启动项里加enforcing0进入系统再手动restorecon -v /etc/shadow修复上下文。3.2 Ubuntu / Debian 的 recovery 模式与单用户模式Ubuntu 和 Debian 系的重置思路跟 CentOS 不一样它们没有rd.break那种专门的中断机制一般用 recovery 模式也就是引导菜单里的“恢复模式”。开机时按住Shift键BIOS 启动模式或者连续按Esc键UEFI 启动模式进入 GRUB 菜单选择“Advanced options for Ubuntu”或者 Ubuntu 的高级选项然后选带(recovery mode)的那一项。进入 recovery 菜单后选择“root - Drop to root shell”。在这个 shell 里先执行mount -o remount,rw /因为 recovery 模式的根分区可能也是只读的。然后直接执行passwd 用户名比如passwd ubuntu或者passwd root。如果根分区是 LVM 逻辑卷recovery 模式一般已经自动挂载好了你直接用就行不需要手动处理逻辑卷激活。但如果进了 shell 发现根目录是空的就要手动执行vgchange -ay激活卷组再挂载。还有一点容易被忽略如果 Ubuntu 启用了全盘加密LUKS开机时系统会先要你输入磁盘解密的密码你在这一步就被卡住了后面 recovery 模式的入口根本到不了。这种情况靠重置系统密码是没办法的只能找回当初设置的全盘加密口令。所以说给虚拟机做全盘加密之前一定要想清楚数据安全等级和运维便利性是有冲突的。除了 recovery 模式还有一个备选方案在 GRUB 编辑界面找到linux那一行在末尾加上init/bin/bash然后启动。这种方式的原理是让内核直接启动到一个 bash shell不经过 systemd 初始化流程。但有个坑init/bin/bash进入后/proc、/sys、/dev这些虚拟文件系统都没有挂载某些命令可能无法正常工作你得手动挂载mount -o remount,rw / mount -t proc proc /proc mount -t sysfs sys /sys mount -t devtmpfs dev /dev然后再执行passwd 用户名。这个方案不如 recovery 模式顺手我一般只用在 recovery 模式进不去的情况下。4. 主流方案二Windows 系虚拟机密码重置实战4.1 用 PE 工具盘离线修改 SAM 数据库Windows 的密码存储在 SAM 数据库文件里路径是系统盘Windows\System32\config\SAM。PE 工具盘方案的核心思路就是在 Windows 还没启动的时候用一个独立的 PE 环境直接去修改 SAM 文件改完之后重启系统密码就变了。操作步骤不复杂。先把 PE 镜像放到虚拟机光驱里开机引导到 PE。PE 的选择很宽松微 PE、通用 PE 都行只要是 x64 架构、能识别常见磁盘控制器的版本就好。进入 PE 后打开 NTPWEdit 这个工具选择 Windows 安装目录工具会自动解析 SAM 文件列出本机所有用户账号。选目标用户点击“更改密码”可以不填新密码直接清空密码也可以直接填入新密码保存退出。这里有个关键点如果客户机开启了 BitLocker 整盘加密PE 工具读取 SAM 文件时会得到一堆乱码因为整个 NTFS 分区的内容都是密文必须先在 PE 里输入 BitLocker 恢复密钥解锁磁盘。虚拟机场景下 BitLocker 用得不多但一旦遇到就是个超级大坑。所以平时部署 Windows 虚拟机时恢复密钥一定要导出保存到安全位置。我还试过在 Linux 宿主机上直接挂载 vmdk/vdi 虚拟磁盘再用chntpw工具做离线修改也能实现同样的效果。但这种方式需要宿主机安装 qemu-nbd 工具还要处理磁盘格式转换操作链路比较长适合应急不适合日常推荐。4.2 utilman 替换技巧另一个 Windows 密码重置思路是利用系统自带的“轻松使用”按钮把它的可执行程序替换成命令提示符。Windows 登录界面右下角有个“轻松使用”图标点击后会以 SYSTEM 权限启动utilman.exe。如果我们把utilman.exe换成cmd.exe点击这个图标时弹出的就是一个 SYSTEM 权限的命令行在命令行里执行net user 用户名 新密码就能改掉任何用户的密码。具体操作我用 Windows 安装镜像来举例。挂载 Windows 安装 ISO进入安装界面后按ShiftF10打开命令行。在这个命令行里找到客户机的系统盘通常情况下在 PE 环境里盘符会变成 D 或 E你需要切到实际安装 Windows 的那个盘。假设是 D 盘执行d: cd Windows\System32 ren utilman.exe utilman.exe.bak copy cmd.exe utilman.exe完成后重启系统进入登录界面点击“轻松使用”按钮弹出的就是命令提示符。执行net user 用户名 新密码比如net user Administrator Pssw0rd123重启就能用新密码登录了。这个方法的原理很简单登录界面下的所有按钮都是 SYSTEM 权限进程替换 exe 之后相当于白白拿到一个管理员命令入口。而且利用方式非常隐蔽默认的系统防护一般不会拦你。但我必须提醒你这个方案有一个安全副作用重置完密码之后一定要把utilman.exe恢复回来否则下次任何人在登录界面点一下“轻松使用”按钮就直接获得了 SYSTEM 权限命令行等于给系统留了一个后门。恢复方法还是用 PE 进入系统把utilman.exe.bak改回utilman.exe就行。另外要注意 32 位和 64 位的区别。64 位 Windows 系统里的System32目录放的是 64 位程序如果你在 32 位 PE 环境下执行这个替换cmd.exe会被重定向到SysWOW64目录复制过去的可能是 32 位 cmd放到 64 位系统的System32里会静默失败。所以建议直接用 64 位 PE并且复制前用where cmd.exe确认路径。5. 国产系统与特色场景UOS、银河麒麟怎么处理5.1 UOS 重置密码的操作细节UOS 是基于 Debian 的国产 Linux 系统密码重置思路和 Ubuntu 很接近但有几个差异点要注意。首先UOS 默认的 root 账号是禁用的日常登录用的是普通管理员账号。所以重置目标一般是普通用户比如uos而不是 root。如果服务端启用了 root 远程登录那你才需要重置 root 的密码。操作上开机进入 GRUB 菜单按e编辑启动项找到linux那一行在末尾加上init/bin/bash或者single启动后进入单用户 shell。这时候先执行mount -o remount,rw /再执行passwd 用户名。如果你不确定系统上有哪些用户可以先看/home目录ls /home另外UOS 的 GNU/Linux 用户管理有个特色功能叫“保险箱”和“归档”如果系统里的账号处于归档状态重置密码后登录可能仍然失败。这时候需要进入系统后检查用户目录下是否存在类似.es这样的隐藏目录有的话需要在图形界面的“账户管理”里先解除归档。我在虚拟机上遇到过一两次这种情况命令行重置密码后账号还是无法登录最终都是通过图形界面处理掉的。所以 UOS 系统的问题偶尔要有“命令行 图形界面”两条腿走路的准备。5.2 银河麒麟虚拟机的密码恢复思路银河麒麟的情况稍微复杂一点因为麒麟 V10 有多个版本有的基于 CentOS 生态有的基于 Debian 生态。你要先用cat /etc/os-release看一下系统分支再决定用哪套重置方法。如果是 CentOS/RHEL 分支直接套用rd.break方案跟 CentOS 7 的操作几乎一样。如果是 Debian 分支则使用init/bin/bash或者 recovery 模式。麒麟系统还有一个特殊性部分版本默认开启了安全启动和强制访问控制机制。在 VMware 虚拟机里如果安全启动开启GRUB 编辑启动项时添加的内核参数可能被校验拦下来导致你明明加了rd.break却还是正常启动进系统。解决思路是在虚拟机设置里关闭“安全启动”选项或者在 GRUB 编辑时先关闭 secure boot 校验。我在一台麒麟 V10 虚拟机上实测过一开始加了rd.break毫无反应后来才意识到是安全启动把参数过滤掉了。关掉安全启动之后操作流程跟 CentOS 基本一致。这里还有个细节麒麟的/etc/shadow和部分关键文件可能有完整性校验如果你用 PE 工具离线改 SAM 这种思路是行不通的必须走单用户模式因为单用户模式修改时系统本身会在重启后重新校验上下文。6. 常见问题与排查技巧实录6.1 重启后无法进入系统、蓝屏、卡在 GRUB这是重置密码过程中最让人崩溃的一类问题。我整理了几种常见现象和排查方向。现象可能原因排查/解决思路开机直接黑屏内核参数加错、GRUB 配置损坏恢复快照用 live CD 挂载后执行grub2-mkconfig重建引导卡在 SELinux 相关报错没做/.autorelabel或上下文不完整启动项加enforcing0先进入系统再执行restorecon -Rv /蓝屏不断重启Windows 系统文件被替换后驱动问题用 PE 启动恢复被替换的utilman.exe或回滚快照虚拟机平台本身蓝屏宿主机的 VT-x/AMD-V 未开启进宿主机 BIOS 开启虚拟化选项后重试排查时我的经验是优先回滚快照。如果你做了快照说明操作起点是已知正常状态快速回滚过去远比在错误的引导环境里修复来得快。如果没有快照再考虑 live CD 挂载修复。6.2 重置后密码生效但登录不了图形界面这种情况我遇到过不少次。命令行下passwd确实成功重置了重启后输入新密码图形登录界面却在转圈后跳回登录页像是不认这个密码似的。常见原因有三个账号被锁定、密码过期策略生效、PAM 模块锁定。先用命令行登录可以切到 CtrlAltF2 试试 tty然后在终端里检查账号状态passwd -S 用户名 chage -l 用户名如果是密码过期执行chage -M 99999 用户名取消过期时间或者直接再设一次密码。如果是 PAM 的pam_faillock锁定了账号可以执行faillock --user 用户名 --reset在 CentOS 上可能是pam_tally2 --user 用户名 --reset。改完这些再尝试图形界面登录基本都能解决。另外还有一个很隐蔽的原因你改的是 root 密码但图形登录界面默认是普通用户登录你输入 root 账户和密码界面却提示认证失败。这不是密码问题而是显示管理器默认不允许 root 登录。确认一下你要登录的账号到底是谁。6.3 快照回滚后密码还是不对快照回滚本身很强大但它救不了所有场景。我见过几次这样的操作虚拟机进不去了用户判断是密码问题回滚到一天前的快照结果密码还是不正确最后发现那个快照本身就是在密码已经被改掉之后才拍的。所以回滚之前一定要看一眼快照的拍摄时间最好是能确认“这个快照状态下的密码是什么”。如果快照时间和密码变更时间不明确那回滚可能白做。还有一种可能是虚拟机的系统时间没有同步。Linux 账号体系里有 Kerberos、AD 域环境下系统时间偏差过大会导致域账号验证失败你以为密码不对实际是时间戳对不上。虚拟机关机时间长RTC 时间漂移就会比较明显。处理方法是先重置密码再强制同步时间timedatectl set-ntp true systemctl restart systemd-timesyncd如果是 AD 域环境还可以检查klist和票据状态。6.4 常用操作速查表最后把几个高频场景的命令整理成一张表方便你收藏。场景核心命令/操作CentOS / RHEL 重置 rootrd.break→mount -o remount,rw /sysroot→chroot /sysroot→passwd root→touch /.autorelabelUbuntu / Debian 重置用户recovery 模式 →mount -o remount,rw /→passwd 用户名Windows 重置用户PE NTPWEdit或utilman.exe替换后net user 用户名 新密码解除账号锁定faillock --user 用户名 --reset或pam_tally2 --user 用户名 --reset修复 SELinux 上下文restorecon -Rv /或启动项加enforcing0重建 GRUB 引导live CD 挂载后grub2-mkconfig -o /boot/grub2/grub.cfg我个人在实际操作中的体会是虚拟机密码重置这件事80% 的精力应该花在操作前的判断和操作后的验证上而不是中间那几步命令。判断包括确认客户机系统分支、确认安全启动状态、确认是否磁盘加密验证包括尝试登录、查看 SELinux 状态、检查时间同步。中间的命令翻来覆去就那么几条真正容易出问题的地方全在边界条件。最后再分享一个小技巧每次重置完密码顺手把虚拟机内的 SSH 密钥重新生成一次或者把新密码写进服务器密码清单再打一个新快照。这样下一次再遇到密码问题你至少知道自己手上哪个快照是干净的。还有虚拟机里敲密码之前先看一眼 Caps Lock 和输入法状态我就干过在虚拟机控制台里因为输入法切了中文而输错密码的事白白多折腾了二十分钟。
返回列表