Linux 系统管理员在日常运维中,难免会遇到这样的情况:某天突然发现 root 密码失效,或者接手一台服务器却无人知晓 root 密码。此时不必急于重装系统——只要拥有物理控制台权限(如服务器机房的键盘屏幕、虚拟机的控制台、云服务器的 VNC 通道),就可以在 GRUB 引导阶段直接干预启动流程,成功重置密码。关键在于“参数是否正确”——错一个字符,救援环境就无法进入。

事实上,行业内长期流传着两套主流方案,分别适用于不同的发行版和场景。下面将详细介绍具体操作步骤,以及那些容易被忽略的细节——很多人正是在这一步出现失误。
rd.break 方案:CentOS 7/8、Rocky、Alma、openEuler 等 systemd+dracut 系统首选
这套方法在 RHEL 系新版上属于官方推荐方案,配合 SELinux 开启时也能稳定生效。常见的操作失误是:执行 passwd 之前忘记先 chroot /sysroot,导致报错 switch_root: cannot access /sysroot: No such file or directory;或者挂载前没有将 ro 改为 rw rd.break。
- 开机看到 GRUB 菜单后,按
e进入编辑模式,找到以linux16或linux开头的行 - 把行尾的
ro替换为rw rd.break(注意前后空格,写成rd.break=1不会被识别) - 按
Ctrl+x启动,等待进入switch_root:/#提示符 - 接下来依次输入:
mount -o remount,rw /sysrootchroot /sysrootpasswd roottouch /.autorelabel(SELinux 启用的情况下这一步必须执行,否则重启后密码不生效)exit(两次)
init=/bin/bash 方案:Ubuntu、Debian、Arch、Fedora 及老 CentOS 通用
这条路径更加直接,但风险也略高一些——它让 /bin/bash 直接成为 PID 1,整个根文件系统已经挂载并可写,操作失误的影响范围更大。适用于 Ubuntu 22.04/24.04 等系统,不过这些系统默认会隐藏 GRUB 菜单,需要在开机时按 Shift 或 Esc 才能呼出;部分云平台的 VNC 键盘映射可能存在异常,Ctrl+x 可能失灵,此时可以尝试 F10。
- 在 GRUB 编辑界面找到
linux行:把ro改为rw,并在行末尾加一个空格,然后追加init=/bin/bash - 按
Ctrl+x启动,直接进入sh-4.4#提示符(取决于 bash 版本可能略有不同) - 依次执行:
mount -o remount,rw /passwd roottouch /.autorelabel(Ubuntu 默认 SELinux 关闭,但如果你手动开启过,这一步仍不能省略)exec /sbin/init或exec /sbin/reboot -f
为什么改了密码却登录失败?重点检查这三处
很多人操作完成后发现仍然无法登录,不一定是方法不对,而是某些环境细节被忽略了。根据实践经验,最容易踩的坑是以下几个:
- 执行
passwd后没有看到password updated successfully的反馈?说明可能输入了非法字符(比如中文空格被混入),或者密码强度策略拦截了——CentOS 默认拒绝少于 8 位的密码,需要留意。 - 重启后仍然提示认证失败?大概率是漏掉了
touch /.autorelabel(SELinux 环境下必须执行),或者chroot之后没有exit就直接reboot,导致 initramfs 没有正常退出,密码根本没写入磁盘。 - Ubuntu 24.04 及更新版本开始使用
systemd-boot替代 GRUB?此时需要长按Space进入启动菜单,再按e编辑,参数写法与init=/bin/bash一致。
说到底,真正卡住人的往往不是“该怎么做”,而是“改哪一行”“空格是否对齐”“SELinux 到底是开是关”。一次成功的关键很简单:盯着那一行 linux 参数,逐字核对,不要凭记忆输入——很多时候多一个空格、少一个斜杠,结果就完全不同。
