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是initramfs(dracut生成)提供的一个内核参数,它的作用是让系统在切换到真正的根文件系统之前暂停,把你丢到一个临时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 crashkernel=1G-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 crashkernel=1G-4G:192M rhgb quiet rd.break第三步,按Ctrl+X或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 shell:
exit 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。
第三,如果你本来就开启了磁盘加密(LUKS),rd.break阶段先会要求输入磁盘解密密码。VMware虚拟机默认一般不开启LUKS,但如果你手动加密了,请提前准备好密钥。
第四,整个过程中虚拟机窗口里的鼠标可能被锁定在GRUB交互界面,按Ctrl+Alt可以在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 crashkernel=1G-4G:192M init=/bin/bash第二步,按Ctrl+X启动,你会看到一个bash-5.1#之类的shell提示符,此时你已经在真实的根文件系统里了,但如果不是rw挂载,需要先执行:
mount -o remount,rw /第三步,执行修改密码:
passwd root第四步,同样创建.autorelabel:
touch /.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:NewPass@2025" | chpasswd如果你觉得密码中含有特殊字符容易在Shell里被解释,建议用引号包裹用户名密码部分,比如上面这样。另一种更安全的方式是使用openssl生成密码哈希,再通过usermod写入:
PASS_HASH=$(openssl passwd -6 'NewPass@2025') usermod -p "$PASS_HASH" devops这里的-6表示生成SHA-512哈希,与RHEL 9默认密码哈希算法一致。为什么推荐这种?因为直接在命令行写明文密码会留在shell历史文件里,对于生产环境来说有安全风险。如果场景允许,最好在脚本中通过变量引用,或者干脆用chpasswd配合输入文件,比如:
echo "devops:NewPass@2025" > /tmp/passwd.txt chpasswd < /tmp/passwd.txt rm -f /tmp/passwd.txt写完记得清理临时文件。除了chpasswd,RHEL 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修改selinux=0临时关闭SELinux进入系统,再执行fixfiles -F relabel或者直接创建.autorelabel后重启。但临时关闭SELinux只是排查手段,千万别一直带着selinux=0跑生产系统。
5.3 VMware Workstation中GRUB交互的几个操作细节
VMware环境里做密码重置,有几个细节直接影响操作节奏。启动虚拟机时鼠标焦点要先进虚拟机,否则你按Shift是没有效果的。键盘一旦被虚拟机捕获,无法直接回到宿主机桌面,需要按Ctrl+Alt释放。在GRUB编辑界面,修改完启动参数后启动组合键要看提示,一般是Ctrl+X,有的版本也支持F10,如果按错没反应就多试一次。
如果你发现GRUB菜单总是超时而无法捕获,可以先把虚拟机开机画面暂停,方法是点一下VMware窗口后,立刻点击播放按钮旁边的暂停图标,让虚拟机暂停在启动初期,然后再点击继续,同时敲击Shift。这样可以扩大手动干预的窗口期。如果是VMware Workstation Pro,这个技巧百试百灵。
5.4 SELinux relabel特别慢或者看起来卡死了怎么办
创建.autorelabel后,启动时会看到屏幕上出现SELinux: Permissive或者*** Warning: SELinux relabel is required之类的信息,紧接着是大量文件被打标签的滚动日志。这个过程可能在VMware虚拟机里持续五到十分钟,具体看磁盘速度和文件数量。如果十几分钟还没有任何变化,先检查是不是分配的内存太小导致系统卡顿,而不要急着强制重启。
偶尔会遇到relabel过程中被手动重启导致中断的情况,下次开机又会重新要求relabel,这是正常的。只要文件系统没有损坏,耐心等待流程走完就不会有大问题。如果循环多次迟迟无法完成,那就考虑在GRUB中用autorelabel=0临时跳过,但这可能导致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,重启后可能并不报错,但密码实际还没生效。只有完成一次完整重启验证,才算真正把密码重置这一件事做扎实。