
VMware里装了RHEL 9的人多少都遇到过这种场景某天要登录虚拟机跑服务却发现root密码怎么都想不起来了或者运维交接时对方只留了一个普通用户而系统管理必须要root权限。我今天就把VMware虚拟机里RHEL 9重置root密码、修改用户密码这件事完整讲透包括两种主流重置方法、普通用户密码的各种改法以及实际操作中踩过的一堆坑。这篇内容不仅适用于RHEL 9对RHEL 8、AlmaLinux 9这类同源系统同样适用照着操作就能解决问题。1. 重置root密码前的预备动作快照与GRUB入口1.1 先判断你当前属于哪种情况动手之前先别急着钻进GRUB先想清楚你是哪种状态。是彻底忘了root密码、现在只能看到一个普通用户登录界面还是有普通用户的sudo权限只是在sudo时会输错root密码这两种情况的处理路径完全不一样。如果你有一个普通用户而且这个用户存在于sudo组里那你根本不需要去重置root密码直接在该用户下执行sudo passwd root输入你自己的用户密码后就能设置一个新的root密码。这是最轻量、最安全的方式。如果你是完全无法用任何账号进入系统或者只有普通用户且不在sudo组那就必须走虚拟机层面的重置流程。除此之外还有第三种情况你想改某个业务账号的密码但你的root密码还在这只需要登录root后执行一条passwd命令即可。后面我会专门讲普通用户密码的修改方式这里先集中处理root密码丢失的场景。1.2 VMware虚拟机操作基础把握进入GRUB菜单的时机重置root密码必须进GRUB菜单也就是系统启动时的引导界面。RHEL 9默认的GRUB菜单会显示几秒钟但如果你设置了超时很短或者系统启动太快很容易错过。在VMware Workstation里建议这么做先给虚拟机开机然后立刻用鼠标点击虚拟机内部窗口让键盘焦点进入虚拟机再持续按住Shift键或者连续快速敲击Esc键。对于BIOS/UEFI固件来说这两个键大概率能把GRUB菜单召唤出来。有一点特别容易被忽略如果你的虚拟机是UEFI方式启动GRUB菜单可能会藏在固件启动界面之后出现时间极短。你需要在开机后一瞬间就反复敲击Esc直到看到类似“Press any key to enter the menu”的提示再按任意键进入GRUB菜单。在VMware中如果错过了启动时机最简单的办法就是“虚拟机 - 电源 - 重新启动客户机”然后重新抢时间。1.3 动手之前先给虚拟机拍快照我强烈建议在重置任何一个系统密码之前先给虚拟机拍摄快照。为什么因为GRUB编辑参数的环节比较容易手误比如不小心删除了内核行的关键参数或者改动了root设备路径系统可能直接起不来。有快照兜底你最多浪费几分钟回滚不至于陷入“越修越坏”的被动局面。操作很简单虚拟机窗口右键 - 快照 - 拍摄快照。给快照起一个明确的名字比如“before-reset-root-password”如果可以勾选内存快照也可以选上。这样万一后续操作失败直接从快照恢复虚拟机还能回到当前状态。对于生产环境或重要实验环境这一步绝对不能省。2. 使用rd.break重置root密码的完整实操2.1 rd.break的原理为什么RHEL 9不能直接进单用户改密码RHEL 9已经全面使用systemd并且默认开启SELinux。老系统比如RHEL 6时代可以直接在GRUB里用single参数进入单用户模式改密码但RHEL 7开始这套办法变得很不稳定经常会遇到密码改完却无法登录、服务起不来等问题。根本原因有两个一是systemd的单用户模式不一定能拿到一个完整可写的根文件系统二是从initramfs环境直接修改/etc/shadow文件文件上的SELinux标签可能变得不正确而SELinux在正式启动后会拒绝使用这个文件。rd.break是initramfsdracut生成提供的一个内核参数它的作用是让系统在切换到真正的根文件系统之前暂停把你丢到一个临时shell环境中。此时真实根文件系统被挂载在/sysroot路径下你可以把这个目录重新挂载为可写再通过chroot /sysroot切进真实系统的根环境执行passwd命令修改root密码。整个过程避开了systemd和用户态的权限限制所以能够可靠重置root密码。2.2 一步一步操作rd.break重置root密码这里我按一次标准操作流程记录你在自己的虚拟机上跟着做就行。第一步重启虚拟机并进入GRUB菜单。选中默认的内核条目按e键进入编辑模式。这一步会看到GRUB启动配置里面有一行以linuxefi开头UEFI启动或linux开头BIOS启动的内核启动命令行内容类似linuxefi /boot/vmlinuz-5.14.0-503.22.1.el9.x86_64 root/dev/mapper/rhel-root ro crashkernel1G-4G:192M rhgb quiet第二步把光标移动到这行的末尾在quiet后面加一个空格然后输入rd.break。注意不要删除原有的参数也不要改动root部分。修改完大概是linuxefi /boot/vmlinuz-5.14.0-503.22.1.el9.x86_64 root/dev/mapper/rhel-root ro crashkernel1G-4G:192M rhgb quiet rd.break第三步按CtrlX或F10启动。系统会进入一个initramfs的shell提示符可能是#并出现switchroot相关日志。此时你就在临时根文件系统中了。第四步执行下面两条命令把真实根目录挂载为可写并切换进去mount -o remount,rw /sysroot chroot /sysroot注意这里必须操作/sysroot而不是/。因为在当前临时环境中/是内存中的临时根文件系统对真实系统没有任何影响。只有/sysroot才是你虚拟机磁盘上的真实根。如果不先执行mount -o remount,rw /sysroot后面passwd时会报“无法打开旧文件”之类的错误因为真实根只读。第五步在chroot环境中执行passwd root系统会提示输入两次新密码。RHEL 9默认使用密码复杂度策略新密码至少要8位并且可能要求包含字母和数字等。尽量设置一个满足复杂度要求的强密码避免改完以后策略不认。第六步创建一个SELinux自动重新标记标记文件touch /.autorelabel这一步非常关键。因为我们是在initramfs阶段直接修改了/etc/shadow文件上的SELinux上下文可能已经不对了。如果不创建.autorelabel系统重启后SELinux可能阻止登录模块读取shadow文件导致你密码改对了却依然无法登录。创建该文件后系统会在重启时自动对文件系统进行SELinux标签重打。第七步退出chroot环境再退出initramfs shellexit exit第二个exit后系统会继续启动并显示SELinux重新标记的进度。根据虚拟机磁盘性能和文件数量可能需要几分钟。等待它完成系统会继续引导进入登录界面。如果未自动进入你可以再重启一次。2.3 rd.break方法的注意事项和易错点这个方法我用过很多次有几点提醒一下第一不要在GRUB编辑时将ro改成rw后就忘掉rd.break。虽然也可以但rd.break流程更标准。我在实操中发现RHEL 9如果只改ro → rw而不加rd.break有时会进入一个奇怪的emergency模式反而不如rd.break干净。第二chroot /sysroot之后有些系统会因为没有正确设置PATH而找不到passwd命令但实际上通常都在/usr/bin/passwd直接输passwd即可。如果提示找不到就输入/usr/bin/passwd root。第三如果你本来就开启了磁盘加密LUKSrd.break阶段先会要求输入磁盘解密密码。VMware虚拟机默认一般不开启LUKS但如果你手动加密了请提前准备好密钥。第四整个过程中虚拟机窗口里的鼠标可能被锁定在GRUB交互界面按CtrlAlt可以在VMware里释放鼠标指针方便你在宿主机和虚拟机之间切换。3. init/bin/bash备用方案另一种重置root密码的路径3.1 传统单用户重置的基本思路init/bin/bash是另外一条经典的绕过路径。它的原理很简单不启动systemd直接让内核把/bin/bash作为第一个用户态进程运行。由于没有systemd介入你能拿到一个原始的root shell然后在这个shell里挂载根文件系统并修改密码。这个方法在RHEL 9上依然能工作但相比rd.break它有一些不确定性主要在于SELinux上下文的修复问题。所以如果你能用rd.break我建议优先用rd.break只有在rd.break不可用比如initramfs损坏的特殊情况下才考虑这个方法。3.2 操作步骤init/bin/bash重置root密码第一步和前面一样进入GRUB编辑模式找到linuxefi开头的那一行。把该行末尾的rhgb quiet删掉然后追加init/bin/bash。如果你不想手动挂载可以同时把该行开头的ro改成rw这样内核会把根文件系统直接挂载为可读写。改完大概是这样linuxefi /boot/vmlinuz-5.14.0-503.22.1.el9.x86_64 root/dev/mapper/rhel-root rw crashkernel1G-4G:192M init/bin/bash第二步按CtrlX启动你会看到一个bash-5.1#之类的shell提示符此时你已经在真实的根文件系统里了但如果不是rw挂载需要先执行mount -o remount,rw /第三步执行修改密码passwd root第四步同样创建.autorelabeltouch /.autorelabel第五步重启系统。由于没有systemd常规的reboot命令可能不完整可以执行exec /sbin/reboot -f或者在VMware菜单里发送“重新启动客户机”。重启后同样会进行SELinux re-label耐心等待即可。3.3 两种方法的对比我把两种方法放在一起对比下方便你决定用哪个对比项rd.break方法init/bin/bash方法原理在initramfs阶段中断启动chroot到系统根直接用bash代替systemd启动挂载方式需要手动 remount, rw /sysroot通过改ro为rw或手动remount /SELinux处理创建.autorelabel流程成熟同样需要.autorelabel但更易出现异常对RHEL 9兼容性官方推荐稳定性高兼容但非官方推荐适用场景大多数情况initramfs受损等特殊场景我这里建议日常维护优先选择rd.break因为它经过了Red Hat官方验证出问题的概率小。init/bin/bash虽然也能改但我遇到过几次在改完密码后因为没有正确执行SELinux relabel导致重启后用户登录直接被SELinux拦截最后还得再用rd.break修一遍属于绕远路。4. 修改普通用户密码交互式、脚本化与强制改密4.1 基础操作用passwd修改普通用户密码一旦你有root权限修改普通用户密码就非常简单了。比如要修改用户devops的密码root用户下执行passwd devops系统会两次提示输入新密码输入过程中不会回显这是正常现象。改完以后会提示“passwd所有的身份验证令牌已经成功更新。” 如果当前用户不是root但具备sudo权限可以这样sudo passwd devops如果你就是普通用户本人想修改自己的登录密码直接执行passwd这时系统会先询问当前密码再让你输入新密码。很多刚接触Linux的人会在这一步困惑“为什么没有让我输入新密码”其实是先要通过旧密码认证你确实是本人之后才更新密码这属于正常的安全策略。4.2 脚本化批量设置密码echo加chpasswd有时候你需要批量重置多个用户密码或者在一个自动化脚本里设置密码一个个敲passwd很麻烦。这时可以用chpasswd命令。它的工作方式是读取“用户名:密码”格式的输入流逐行更新用户密码。最简单的用法echo devops:NewPass2025 | chpasswd如果你觉得密码中含有特殊字符容易在Shell里被解释建议用引号包裹用户名密码部分比如上面这样。另一种更安全的方式是使用openssl生成密码哈希再通过usermod写入PASS_HASH$(openssl passwd -6 NewPass2025) usermod -p $PASS_HASH devops这里的-6表示生成SHA-512哈希与RHEL 9默认密码哈希算法一致。为什么推荐这种因为直接在命令行写明文密码会留在shell历史文件里对于生产环境来说有安全风险。如果场景允许最好在脚本中通过变量引用或者干脆用chpasswd配合输入文件比如echo devops:NewPass2025 /tmp/passwd.txt chpasswd /tmp/passwd.txt rm -f /tmp/passwd.txt写完记得清理临时文件。除了chpasswdRHEL 9的系统自带passwd并不支持--stdin参数所以别去用echo pass | passwd --stdin devops这种Debian系命令在RHEL里会报参数错误。4.3 强制用户下次登录时修改密码再分享一个运维中非常常用的需求给用户设置一个临时密码后要求他首次登录必须修改密码。使用chage命令可以做到chage -d 0 devops这个命令把用户的密码最后修改日期强制设为1970年1月1日也就是0。系统会认为密码已经过期用户下次登录时会被强制要求先设置一个新密码然后才能进入系统。如果你想设置密码有效期可以用chage -M 90 devops这代表密码最长使用90天必须更换。配合查看命令chage -l devops可以看到“Last password change”、“Password expires”等详细信息。这个方法特别适合企业环境里的定期轮换密码场景。4.4 锁定、解锁与密码状态检查有时候用户离开项目或者疑似账号被盗我们需要临时锁定账号。可以用usermod -L devops或者passwd -l devops两种方式都会在/etc/shadow中该用户密码哈希字段前加上!使密码失效。解锁则对应usermod -U devopspasswd -u devops检查用户密码状态优先级更高的是直接看/etc/shadow文件比如执行grep ^devops: /etc/shadow如果密码字段以!!开头说明该用户从创建起就没有设置过密码此时无法直接登录必须先设置密码。如果以!$6$...开头说明密码被锁定了需要解锁。这个判断技巧在排查“用户无法登录但密码看起来没错”的问题时非常有效。5. 密码重置常见问题与排查技巧实录5.1 遇到“su: 鉴定令牌操作错误”怎么办热词里有一条“设置root密码时su:鉴定令牌操作错误”我估计不少人都遇到过。这个报错出现有两个典型场景一是新装的系统从没给root设置过密码然后你执行su -想切到root输入密码后提示鉴定令牌操作错误二是在修改root密码后用新密码执行su依然报这个错。第一种情况最常见的原因是root密码根本没设置也就是说/etc/shadow中root密码字段是!!没有可验证的密码。解决办法很简单以普通用户身份或单用户模式设置root密码。如果你现在还能登录普通用户而且该用户在sudo组直接执行sudo passwd root第二种情况则要查PAM配置。先检查一下是不是之前误改了/etc/pam.d/system-auth或者/etc/pam.d/su如果加了额外的pam限制可能导致su无法正常认证。还有一个容易忽略的因素你设置的新密码可能没有满足系统密码复杂度策略导致密码本身没有更新成功。例如passwd提示“无效的密码密码少于8个字符”但有些版本还会显示“未对密码进行修改”。这时你需要重新设置一个满足策略的强密码。5.2 重置root密码后无法登录卡在SELinux重新标记如果你按照rd.break流程操作但忘了执行touch /.autorelabel重启后可能会发现root密码改对了却依旧无法登录甚至图形界面的登录窗口循环一圈又回到登录界面。另一个表现是成功登录后系统启动卡在SELinux相关服务或者服务起不来。这个问题的根源就在于SELinux上下文。我们的机器上直接从initramfs修改/etc/shadow如果不在根目录创建.autorelabel系统不会重新标记该文件的正确标签。SELinux保护策略会拒绝某些进程读取shadow文件进而导致认证失败。解决办法是再次进入rd.break手动执行touch /.autorelabel然后重启。如果你已经在系统里但无法登录也可以先重启到GRUB修改selinux0临时关闭SELinux进入系统再执行fixfiles -F relabel或者直接创建.autorelabel后重启。但临时关闭SELinux只是排查手段千万别一直带着selinux0跑生产系统。5.3 VMware Workstation中GRUB交互的几个操作细节VMware环境里做密码重置有几个细节直接影响操作节奏。启动虚拟机时鼠标焦点要先进虚拟机否则你按Shift是没有效果的。键盘一旦被虚拟机捕获无法直接回到宿主机桌面需要按CtrlAlt释放。在GRUB编辑界面修改完启动参数后启动组合键要看提示一般是CtrlX有的版本也支持F10如果按错没反应就多试一次。如果你发现GRUB菜单总是超时而无法捕获可以先把虚拟机开机画面暂停方法是点一下VMware窗口后立刻点击播放按钮旁边的暂停图标让虚拟机暂停在启动初期然后再点击继续同时敲击Shift。这样可以扩大手动干预的窗口期。如果是VMware Workstation Pro这个技巧百试百灵。5.4 SELinux relabel特别慢或者看起来卡死了怎么办创建.autorelabel后启动时会看到屏幕上出现SELinux: Permissive或者*** Warning: SELinux relabel is required之类的信息紧接着是大量文件被打标签的滚动日志。这个过程可能在VMware虚拟机里持续五到十分钟具体看磁盘速度和文件数量。如果十几分钟还没有任何变化先检查是不是分配的内存太小导致系统卡顿而不要急着强制重启。偶尔会遇到relabel过程中被手动重启导致中断的情况下次开机又会重新要求relabel这是正常的。只要文件系统没有损坏耐心等待流程走完就不会有大问题。如果循环多次迟迟无法完成那就考虑在GRUB中用autorelabel0临时跳过但这可能导致SELinux状态异常后续还是要手动修复。6. 实操心得与安全加固建议6.1 密码管理习惯比重置技巧更重要写到这里我想强调一点重置密码的技巧属于“兜底能力”真正要养成的是密码管理习惯。很多重置场景其实来源于密码管理混乱root密码贴在办公桌上、多个服务器共用一个密码、半年不换密码这些情况在真实运维中比比皆是。建议把系统密码统一放到密码管理工具里并且为不同环境设置不同密码。对于RHEL 9可以充分利用系统自带的chage -M设置密码有效期同时用passwd -w设定密码过期前提醒天数这样用户不会在毫无准备的情况下被强制改密减少忘记密码的概率。6.2 给虚拟机做快照是最低成本的保险我核心的经验是每次做系统级操作前都先拍快照。重置root密码、修改PAM配置、改变量、升级内核这些操作都可能产生连锁反应。在VMware Workstation中快照成本很低但收益极高。即使像重置密码这种看似简单的操作也可能因为SELinux或者GRUB参数修改引发启动异常快照是你最快的退路。同时建议保留多份快照不要覆盖之前稳定可用的版本尤其是“升级前”“配置前”这种节点。6.3 最后一个提醒重置后别忘了验证最后再分享一个我踩过好几次坑的经验重置root密码并成功登录后不要直接关掉窗口先做两件验证。第一用root登录执行sudo -i或者直接su -确认root的密码能正常切换到root身份。第二重启一次虚拟机确认系统在没有手动干预的情况下能正常进入登录界面且不需要重新relabel。因为rd.break流程里有些环境会自动触发relabel但如果你没有创建.autorelabel重启后可能并不报错但密码实际还没生效。只有完成一次完整重启验证才算真正把密码重置这一件事做扎实。