对于许多服务器环境而言,CentOS 8 或 RHEL 8 是常见的系统选择。强健的 root 密码至关重要,但万一你忘记了这个最高权限的密码,系统访问也就随之被锁。别慌,本文将引导你完成在 CentOS 8 及 RHEL 8 系统上重置已遗忘的 root 密码的完整过程。
本教程同样适用于较早的 CentOS 7 和 CentOS 6 版本。请注意,为了避免潜在的 SELinux 上下文标签问题,我们不会启用其自动重新标记功能,这是一种更稳妥的做法。
步骤一:在启动时进入 GRUB 菜单
重启你的服务器或虚拟机。在系统启动初期,当 GRUB 2 启动菜单出现时(通常会列出可启动的内核版本),迅速按下键盘上的 e 键。这会进入启动参数的编辑界面,而不是直接启动系统。

步骤二:修改启动参数以进入应急模式
在打开的 GRUB 编辑界面中,使用键盘方向键找到以 linux 开头的那一行。在这行参数的末尾附近,定位到 rhgb quiet 这两个参数,并将它们替换为 rd.break enforcing=0。
rd.break:在内核启动后、切换到真实根文件系统之前暂停,进入一个临时的 initramfs 环境。
enforcing=0:临时将 SELinux 设置为宽容模式,避免在后续操作中因安全策略导致问题。

步骤三:以修改后的参数启动系统
修改完成后,直接按下 Ctrl + X 组合键(或按 F10,根据提示操作),系统将使用我们刚刚编辑的参数启动。

步骤四:重新挂载 /sysroot 为读写模式
系统会启动进入一个名为 “switch_root” 的紧急 Shell 环境。此时,真正的根文件系统 /sysroot 是以只读(ro)模式挂载的,我们无法修改其中的密码文件。首先,需要将其重新挂载为读写(rw)模式。
mount -o remount,rw /sysroot
注意:命令中的空格是关键,mount 和 -o 之间、rw 和 /sysroot 之间都必须有空格。执行后回车。
步骤五:切换根目录到 /sysroot
接下来,使用 chroot 命令将当前会话的根目录切换到 /sysroot,这样我们后续的操作就会直接作用于真实的系统文件。
chroot /sysroot
步骤六:使用 passwd 命令重置 root 密码
现在,我们已经身处真实的系统环境中。可以运行标准的 passwd 命令来修改 root 用户的密码了。
passwd root
步骤七:输入并确认新密码
执行命令后,系统会提示你输入新的密码。请注意,在输入过程中,光标不会移动,也不会显示任何字符(如星号),这是 Linux 终端的正常安全行为,只需正常键入你的新密码并回车即可。接着,系统会要求你再输入一次以确认。
密码需要满足一定的复杂性要求(通常至少8位),否则会收到警告。
步骤八:退出 chroot 环境
密码修改成功后,首先退出当前的 chroot 环境。
exit
步骤九:将 /sysroot 重新挂载为只读模式
出于安全考虑,在继续之前,我们需要将文件系统恢复为只读状态。
mount -o remount,ro /sysroot

步骤十:退出应急 Shell 并重启系统
再次执行 exit 命令,这次将退出应急 Shell。系统会自动继续启动流程并重启。
exit
步骤十一:使用新密码登录
系统重启后,在登录界面使用用户名 root 和你刚刚设置的新密码登录,即可重新获得系统的完全控制权。
步骤十二(可选但推荐):恢复 SELinux 上下文并重新启用强制模式
如果系统启用了 SELinux,为了确保安全策略的一致性,建议执行以下清理和恢复操作。
- 恢复
/etc/shadow 文件(存储加密密码)的默认 SELinux 安全上下文:
restorecon /etc/shadow
- 将
SELinux 模式从临时的宽容模式(enforcing=0)切换回默认的强制模式:
setenforce 1
至此,你已经安全地恢复了 CentOS 8 或 RHEL 8 系统上丢失的 root 密码。这个方法通过 initramfs 应急环境绕过了正常的身份验证,是管理员必须掌握的关键运维恢复技能之一。
如果在操作中遇到其他系统层面的难题,欢迎到 云栈社区 的相关板块与更多技术同行交流探讨。