news 2026/10/5 3:12:55

RHEL忘记root密码?单用户模式与rd.break实操指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RHEL忘记root密码?单用户模式与rd.break实操指南

做运维的人,十个有九个都经历过那种“人在机房,密码想不起来”的窒息时刻。尤其是碰到老旧的 RHEL 6.9 服务器,手边没有文档、没有密码本,业务还在跑,重启窗口约到半夜三点,root 密码就这么凭空消失了。别急着拆硬盘,RHEL 系统从设计上就给管理员留了一条标准救援路径:通过单用户模式,或者 initramfs 阶段的中断机制,在控制台直接重置 root 密码。这篇文章把我这些年处理 RHEL 忘记密码找回的完整经验写清楚,重点覆盖 RHEL 6.x(含 6.9)和 RHEL 7/8/9 的差异,并附上一堆实操踩坑记录,适合系统管理员、运维工程师,也适合刚接手服务器想提前做准备的新手。

1. 找回RHEL密码前,先搞清楚三件事

1.1 找回密码的本质不是“破解”,而是“接管启动过程”

很多新手第一次听说“找回密码”时,脑子里想的可能是漏洞利用、暴力破解之类的操作。其实完全不是这回事。Linux 系统的密码认证核心在/etc/shadow文件里,里头存的是经过哈希处理的密码串,普通用户没有读取权限,root 也没法把这串哈希直接“还原”成明文密码。所以所谓找回密码,真正的操作路径是:通过系统启动期间的特殊模式,拿到一个等同于 root 的执行环境,然后调用passwd命令重新设置一个新密码。这不是绕过认证,而是利用系统设计时预留的本地控制台恢复机制。前提是你得有这台服务器的物理控制台或者虚拟化平台的控制台权限,否则一切都无从谈起。

这个理解很重要,因为它决定了排查方向。如果远程 SSH 还通着、本地又没有控制台,那么再牛的“找回密码”技巧也派不上用场;反过来,只要你手里有控制台,哪怕 SSH 完全不可用、root 密码彻底遗失,这台机器的系统层面也拦不住你。专业一点的说法是:Linux 信任的是“能碰控制台的人就是管理员”,密码只是登录环节的一道闸门,不是磁盘加密的钥匙。

1.2 RHEL 6.x 与 RHEL 7/8/9 的分水岭在哪里

很多人一搜资料就懵了,因为网上的教程写法完全不同。有的告诉你按e进 grub 菜单然后加single,有的告诉你加rd.break,还有的直接让你改init=/bin/sh。其实这些差异的根源只有一个:RHEL 6 和 RHEL 7 之后的启动流程不是一套东西。

对比项RHEL 6.x(含 6.9)RHEL 7/8/9
引导程序GRUB 第一代(GRUB Legacy)GRUB 2
初始化系统SysVinit / Upstartsystemd
内核启动参数直接由 grub.conf 管理由 grub.cfg 生成并传递
紧急模式机制单用户模式(runlevel 1)rd.break / emergency 模式
进入恢复环境后的根目录直接是/先到/sysroot,需 chroot

RHEL 6.9 是 RHEL 6 系列的收官版本,市面上到现在还有大量生产环境在运行。它的恢复方法就是经典的“单用户模式”。而 RHEL 7 开始换成 GRUB 2 和 systemd,单用户模式的玩法变了,更主流的做法是rd.break。所以后面我会把这两条路线分开讲,先讲老的,再讲新的,对照着看就不会乱。

2. RHEL 6.x(含 6.9)经典操作:单用户模式找回密码

2.1 进入 GRUB 菜单,给内核加一个“单用户”参数

RHEL 6.9 默认的启动倒计时只有 5 秒,所以第一步动作要快。在虚拟机控制台或物理服务器显示器前,重启主机,在看到 GRUB 菜单界面时迅速按任意键,让倒计时停下来。菜单里一般有几个内核条目,选择实际使用的那个内核行,按e进入编辑模式。注意,这里的e是编辑整条启动配置,不是 GRUB 2 的按e修内核命令行,但操作直觉是一样的。

进入编辑界面后,找到以kernel开头的那一行,它后面跟着一长串参数,类似/vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/mapper/vg_xxx-lv_root rd_NO_LUKS ...。把光标挪到这行末尾,添加一个单词single。老版本 GRUB 里,single、数字1、字母s效果基本等同,都表示以运行级别 1(单用户模式)启动;我习惯写single,语义最清晰,别的同事接手时一眼能看懂。改完之后按回车回到菜单,再按b启动。

这个模式启动后,系统不会拉起完整的图形界面和多用户服务,而是直接进入一个 root shell。因为是 console 登录,不需要密码。但要注意,单用户模式下的根文件系统挂载状态在不同发行版上不完全一样,有的版本自动挂载为读写,有的还是只读。保险起见,执行passwd之前,先手动挂载一下:

mount -o remount,rw /

如果真的处于只读状态,直接跑passwd root会报错,提示无法打开/etc/shadow。先 remount 再改密码都是正常操作,别慌。

2.2 重置 root 密码,以及那道“SELinux 后处理”

进入单用户模式的 root shell 后,直接敲:

passwd root

按提示输入两次新密码。这样系统会重新生成/etc/shadow里 root 对应的哈希串。这里我强烈建议用passwd命令,而不是手动vi /etc/shadow去改。passwd命令除了更新哈希值,还会处理文件权限、文件属主、甚至部分 SELinux 上下文,手动编辑器一旦弄错一行格式,轻则密码改失败,重则整个系统所有账户都登录不了。

密码改完后,RHEL 6 还有一个容易被忽略的坑:SELinux 上下文。如果你直接退出单用户模式重启,某些版本上会发现 root 密码明明改了,登录时却被拒绝,或者系统在启动阶段疯狂刷 SELinux 报错。这是因为/etc/shadow的 SELinux 标签在单用户模式下出现了异常。最简单的处理就是在重启前执行:

touch /.autorelabel

这行命令会在系统下次启动时强制对整个文件系统重新标注 SELinux 标签,虽然会延长首次启动时间(几百 GB 的盘可能要十几分钟),但能一次性把所有文件的上下文校正回来。如果系统原本就通过/etc/selinux/config把 SELinux 设成了disabled,那这一步可以跳过。改完密码、处理完标签,执行reboot,然后用新密码从控制台登录验证即可。

3. RHEL 7/8/9 找回密码:rd.break 与 init=/bin/sh

3.1 首选方案:rd.break 强制中断 initramfs

RHEL 7 之后的系统,启动流程被 systemd 接管,传统的single参数虽然还兼容,但在很多定制场景下不够可靠,更标准的做法是用rd.break。这个名字里的rd指 ramdisk(initramfs),含义是:在加载完 initramfs、真正切根到磁盘系统之前,强制停下来,进入一个临时 shell。

操作步骤也不复杂。重启后在 GRUB 2 菜单界面,选中内核条目按e进入编辑。找到以linux或linux16开头的那一行,这一行末尾通常有rhgb quiet,把它们后面或前面追加一个参数rd.break(加在末尾最简单)。按Ctrl+x或F10启动,系统会在 initramfs 阶段中断,出现一个提示符。

在这个提示符下,根文件系统还没有真正挂载好,但它已经被 initramfs 挂载到了/sysroot目录,而且是只读状态。所以接下来要做的就是重挂读写、chroot 进去:

mount -o remount,rw /sysroot chroot /sysroot passwd root touch /.autorelabel exit exit

这里有两个细节值得说清楚。第一,为什么需要chroot /sysroot?因为你现在所在的 shell 属于 initramfs 这个微系统,里面只有最基本的工具,直接跑passwd改的是临时环境里的 shadow,不是磁盘上真正的 shadow;只有 chroot 到/sysroot,才能像进入完整系统一样操作。第二,为什么还要touch /.autorelabel?和 RHEL 6 一样,RHEL 7 默认 SELinux 是 enforcing 状态,从 initramfs 里改密码会打乱/etc/shadow的上下文,不重标的话重启后登录可能直接被 SELinux 拒绝。连续输入两次exit,第一次退出 chroot,第二次继续让系统完成剩余的启动流程,最后正常进入登录界面。

3.2 备选方案:init=/bin/sh,什么时候用

rd.break在绝大多数情况下都好用,但如果你遇到的是某些特殊定制的内核或非常老的磁盘驱动,rd.break中断之后 chroot 不进去,可以换一条路:把内核参数里的rhgb quiet删掉,改成init=/bin/sh。这告诉内核,切根之后不要启动 systemd 的默认流程,直接拉起一个/bin/sh。

这种方式下,根文件系统的挂载时机更靠后,但同样默认是只读的。进入 shell 后先执行:

mount -o remount,rw / passwd root touch /.autorelabel sync reboot -f

注意最后的reboot -f。由于系统的正常初始化流程被跳过了,直接敲reboot可能不会干净地重启,加-f强制重启反而更省事。这个方法相比rd.break少了一层 chroot,但对新手来说反而更容易理解:我就是进入了一个 root shell,改密码,然后重启。缺点是它完全跳过了 systemd 的关停逻辑,不适合在生产系统上反复玩。

3.3 RHEL 8/9 特有的三个“新坑”

RHEL 8 和 RHEL 9 的整体操作和 RHEL 7 类似,但有几个版本特有的事项,我在实际处理中踩到过。

第一,密码策略更严格了。RHEL 8 开始默认启用passwd的复杂度检查(pwquality),如果你在 chroot 环境下设了一个过于简单的密码,比如123456,系统会直接拒绝。设置失败后别愣着,换一个至少包含大小写和数字、长度足够的新密码即可。

第二,RHEL 9 对内核参数做了更严格的校验,rd.break依然有效,但如果你同时保留了rhgb quiet之外的旧参数,可能启动时出现警告。无所谓,只要能看到断点提示符就说明参数传递成功。

第三,如果你给 root 和业务数据做了 LUKS 磁盘加密,那么上述所有操作的前提是你记得 LUKS 解密 passphrase。启动过程中系统会在 initramfs 阶段先问你 LUKS 密码,输入之后才会挂载加密根分区,之后的rd.break/chroot流程照常可用。如果 LUKS 密码也忘了,那就不是“找回密码”能解决的问题了,属于数据恢复范畴,复杂度完全不在一个量级。

4. 实操现场:一台 RHEL 6.9 老服务器的完整找回过程

4.1 现场情况记录

去年帮朋友处理过一次比较典型的故障:一台运行在 VMware 上的 RHEL 6.9 虚拟机,跑着内部报表系统,SSH 密钥登录原本是正常的,但某天管理员在做安全整改时重启了 sshd,之后发现 root 的密码文件丢失了,所有人都联系不上之前的负责人。业务系统不能停太久,重启窗口只有上午一小时。

我接手时先把网络拓扑确认了,确定这台机器可以通过 vSphere Web Console 直接看控制台,不需要去机房,这给后面操作省了大量时间。然后和业务方确认窗口:预计整个操作 5-10 分钟内完成,因为流程已经烂熟于心。

4.2 逐步操作实录

窗口开始后,我在控制台发送重启指令。RHEL 6.9 的 GRUB 倒计时出现时迅速按了下方向键,屏幕停在菜单界面。选中默认内核条目,按e,找到kernel那一行,在末尾补了single,回车后按b。

系统日志刷刷滚动,大约一分钟后出现#提示符,没有要求输入密码。我先敲了mount -o remount,rw /,确认根文件系统可写,然后直接执行:

[root@localhost /]# passwd root

输入两次新密码。这里有个小细节,控制台默认键盘布局是美式英语,如果新密码里带中文输入法容易出的特殊字符,可能在登录时打不出来,所以我在设置时特意避免了特殊符号,只用大小写字母加数字的组合。密码设置成功后,我没急着重启,而是执行了:

touch /.autorelabel

因为这台机器原来的 SELinux 是 enforcing 模式。之后输入reboot,系统开始重启。由于 autorelabel 是强制执行,重启过程中的启动时间明显变长,大约多花了五六分钟,这个现象正常。之后控制台出现登录界面,用新密码成功登录 root。整个找回过程加上等待 relabel,总耗时在 15 分钟以内,比窗口余量还富余不少。

4.3 登录后的必要收尾

密码找回只是第一步。我登录后做了几件收尾的事:

getenforce ls -l /etc/shadow tail -n 50 /var/log/secure

getenforce确认 SELinux 已经回到Enforcing并在正常运行;检查/etc/shadow权限没有变化;翻/var/log/secure是想确认重启前后有没有异常登录尝试,毕竟这次故障来得不明不白。同时和业务方确认,如果有其他账户密码也丢了,趁 root 权限在手里,直接passwd 用户名重新设置,别等到下次出事再折腾。

5. 常见问题与排查技巧实录

5.1 GRUB 也设了密码,导致根本改不了启动参数

这是找回密码场景里最尴尬的一种。RHEL 6 可以在/etc/grub.conf里设置password指令,RHEL 7 之后可以用grub2-setpassword给 GRUB 菜单加密码。一旦 GRUB 保护开了,进入编辑模式之前就会要求输入 GRUB 密码,而如果这个密码也丢了,上面讲的所有“改内核参数”的办法全部失效。

这种局面下的出路是:用安装光盘或救援镜像启动到 rescue 模式,挂载根分区,然后手工编辑/boot/grub/grub.conf或/boot/grub2/grub.cfg,把 GRUB 密码相关的行去掉或替换成你知道的哈希。RHEL 7 上可以用grub2-mkpasswd-pbkdf2生成新哈希,再用grub2-setpassword重新设置。如果机器在虚拟化平台上,也可以试试把启动盘挂到另一台同版本 Linux 上修改。但这一套操作比单纯改 root 密码复杂得多,所以我特别建议:GRUB 密码这类引导层凭据,一定要单独记录在团队的密码管理库里,不能只躺在某一个人的脑子里。

5.2 改了密码仍然登录失败,先查账户锁定状态

有些单位的服务器跑过安全基线检查,给 root 加过锁定策略。你辛辛苦苦进入单用户模式改完密码,结果重启后登录时提示Account is locked,那问题就出在/etc/shadow里 root 这一行的密码字段前缀。正常情况下root:$6$xxxx...,如果它变成了root:!!$6$xxxx...或者root:*$6$xxxx...,说明账户处于被锁状态,passwd命令直接设置密码不会自动解锁。

处理方式很简单,在单用户模式或 root shell 下执行:

passwd -u root

如果是因为账户过期(/etc/shadow中root行的第 8 字段有值),可以用chage -l root查看过期信息,再用usermod -e或chage -E -1清除过期时间。这类问题在找回密码的帖子里很少被提到,但在等保、SSL 合规改造过的机器上相当常见。

5.3 单用户模式进去后发现根目录是只读的

这个问题在 RHEL 6.9 上尤其多见。原因在于,单用户模式默认挂载根文件系统时,会沿用内核参数里的ro。如果没注意直接执行passwd,会报类似cannot lock /etc/passwd的错误。解决办法就是开写权限:

mount -o remount,rw /

执行完之后可以用touch /test快速验证是否能写入,能写再继续改密码。另外,如果在单用户模式下你做了其他操作,比如顺手改了/etc/fstab,重置回读写挂载一定在重启前再确认一次,避免把配置改坏了还开机失败。

5.4 云主机 / 虚拟机环境的特殊玩法

云上的机器和物理机不太一样。如果你用的是公有云厂商的标准镜像,绝大多数厂商控制台都提供“重置密码”功能,背后原理通常是卸载系统盘、挂到一台临时救援实例上修改 shadow 文件,然后再挂回来。这种情况下,你其实不需要手动进单用户模式,直接点控制台的重置密码按钮即可。

但要注意,云厂商的重置密码功能往往只对“支持镜像”有效,如果你用的是自己导入的 RHEL 6.9 自定义镜像,可能没有这个功能。这种时候我建议的路径是:用厂商控制台把系统盘作为数据盘挂到另一台同版本 RHEL 机器上,修改/etc/shadow后再卸载挂回。改 shadow 之前一定先备份:

cp /etc/shadow /etc/shadow.bak

手工修改时保持原有行格式,密码哈希可以用:

openssl passwd -6

或

python3 -c "import crypt; print(crypt.crypt('newpass', crypt.mksalt(crypt.METHOD_SHA512)))"

生成后再替换到 shadow 文件中。这种“挂盘改密”的方式不依赖启动菜单,遇到 GRUB 密码、启动参数损坏等极端情况反而是最稳的兜底方案。

6. 找回密码之后,建议给生产系统立几条规矩

经历过几次半夜找密码的折腾后,我在自己维护的系统上定了几条简单的规矩,分享出来当一个参考。第一条,任何服务器的 root 密码和 GRUB 密码,必须存放在团队共享的密码管理工具中,离职交接时强制轮换,不允许“只有某某知道”。第二条,生产环境能不开 root 远程登录就不开,日常操作全部走普通用户加 sudo,并开启 sudo 日志,这样即使 root 密码丢了,影响面也小很多。第三条,在任何 rescue 模式、单用户模式下执行过写操作之后,优先用touch /.autorelabel再重启,哪怕系统当前 SELinux 是 permissive,这个动作也能避免后续莫名其妙的文件标签异常。第四条,找一个非业务高峰时段主动做一次密码找回演练,把步骤文档标准化,真出事时照着文档执行,能把人为失误降到最低。

另外还有个小习惯值得提一下:在 RHEL 6.9 这种老版本上,grub.conf里的默认启动内核如果有多个,建议把常用内核调整到第一个,避免紧急情况下按错选项。别小看这些细节,我见过太多故障处理时因为启动到了旧内核,导致密码改成功了但系统服务起不来,最后又浪费一轮窗口的案例。每次改完密码,顺手确认uname -r和预期内核版本一致,是花十几秒就能避免大坑的好做法。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 3:12:40

光谱分布与辐射通量密度:从概念到时段实测全解读

每次拿到一份光谱数据,总有人会盯着表格问我:“这里的W/m/nm是什么意思?峰值波长又代表什么?为什么同一盏灯,早上测和傍晚测曲线长得不一样?”说实话,我刚接触光谱测量那几年也经常把这些概念搞…

作者头像 李华
网站建设 2026/10/5 3:11:57

RIP路由协议详解:华为eNSP三路由器动态路由配置实验全记录

做网络实验的朋友应该都有过这种体验:小网络里敲静态路由问题不大,三五条路由手一敲就完事,可设备一旦超过三台、网段上到七八个,静态路由表就成了灾难现场。这时候就该动态路由协议登场了。这篇要聊的,就是动态路由里…

作者头像 李华
网站建设 2026/10/5 3:10:07

FastDFS集群部署实战:从单机到高可用架构的完整指南

做分布式文件存储这几年,我经手过不少FastDFS项目,从最初单机跑测试环境,到后来给线上业务搭多节点集群,踩过的坑能写满一页纸。最近又帮一个团队从零搭了一套FastDFS集群,正好借这个机会把部署过程中的关键步骤、设计…

作者头像 李华
网站建设 2026/10/5 3:09:55

车载以太网交换芯片88Q5050实战:从时间同步到VLAN配置的完整指南

车载以太网今天已经算不上什么新词了,但真正亲手把车规级交换芯片调通、跑起来、扛住实车环境的人,依然比做应用层开发的少一大截。我印象里第一次把Marvell 88Q5050挂到域控制器背板上,是在一个智能驾驶项目的联调阶段,当时手边同…

作者头像 李华
网站建设 2026/10/5 3:09:22

ESP32 BOOT模式与自动下载电路:从GPIO0时序到一键烧录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/5 3:08:06

高通新平台传感器架构SEE深度解析:从SLPI到QMI的完整链路

1. 项目背景:为什么高通要重构sensor架构1.1 老架构留下的那笔烂账做高通平台传感器开发的工程师,对老一套Sensor Subsystem(也就是大家嘴里常说的SSP)应该都不陌生。早期平台在AP侧跑一个Sensor HAL,往上对接Android框…

作者头像 李华