手把手教你进入救援模式重置密码,附带SELinux关键一步
场景说明
作为运维人员或Linux学习者,忘记root密码是迟早会遇到的问题。别慌,Linux提供了完善的密码重置机制——核心思路是进入单用户/救援模式,跳过密码验证,然后重新设置密码。
⚠️ 物理机/虚拟机操作:以下操作需要物理接触服务器或通过虚拟机控制台(VNC/iDRAC/IPMI)执行,不能通过SSH远程操作(因为要重启系统,SSH连接会断开)。云服务器请使用云厂商提供的控制台VNC功能连接。
第一篇:RHEL系(CentOS / Rocky Linux / AlmaLinux / RHEL)
方法一:rd.break救援模式(CentOS 7+/RHEL 7+ 主流方法)
第一步:开机进入GRUB编辑
- 重启系统
- 出现GRUB引导菜单时,快速按
e 进入内核参数编辑界面 - 菜单通常一闪而过,建议开机时不停按
e 或 不停按 ↓ 方向键暂停菜单
💡 GRUB是什么? GRUB(Grand Unified Bootloader)是Linux系统启动时的引导程序,负责加载内核并启动系统。在GRUB界面按 e 可以临时编辑启动参数(重启后恢复,不会永久修改)。
┌──────────────────────────────────────────────────────┐│ CentOS Linux (3.10.0-957.el7.x86_64) 7.6.1810 ││ CentOS Linux (0-rescue-xxxxxxxxxxxxxxxxxxxx) ││ ││ 使用 ↑/↓ 选择条目,按 e 编辑,按 c 进入命令行 │└──────────────────────────────────────────────────────┘
第二步:编辑内核参数
- 找到以
linux 或 linuxefi 开头的内核行
修改前:
linux /vmlinuz-3.10.0-957.el7.x86_64 root=/dev/mapper/centos-root ro rhgb quiet
修改后:
linux /vmlinuz-3.10.0-957.el7.x86_64 root=/dev/mapper/centos-root ro rhgb quiet rd.break
第三步:命令行重置密码
进入后会出现 switch_root:/# 提示符,依次执行以下命令:
# 1. 将 /sysroot 挂载为可读写(默认是只读)mount -o remount,rw /sysroot# 2. 切换到真实系统环境chroot /sysroot# 提示符变为 sh-4.4# 表示已进入真实系统(也有可能没有变)# 3. 修改root密码passwd root# 输入两次新密码(密码复杂度不够会有告警,但可以强制设置)# 4. ⚠️ 关键步骤:SELinux 自动重标记# 如果不做这一步,重启后SELinux会拦截登录!!!touch /.autorelabel# 5. 退出 chroot 环境exit# 6. 重新挂载为只读mount -o remount,ro /sysroot# 7. 退出并重启exit
系统会自动重启,开机时会执行SELinux重标记(开机时间会变长,耐心等待!)
方法二:init=/bin/bash 单用户模式(备用方案)
如果 rd.break 方式不生效(某些老硬件/特殊环境),可以尝试这个方法:
操作步骤
# 直接进入 root shell(无需密码!) # 确认根分区已挂载为可读写(因为加了 rw 参数) mount -o remount,rw /# 修改密码passwd root# ⚠️ SELinux标记(同样重要!)touch /.autorelabel# 正常启动系统exec /sbin/init
第二篇:Debian系(Ubuntu / Debian)
🎯 Ubuntu方法论:Ubuntu默认没有SELinux,不需要 /.autorelabel 步骤,也不用 rd.break。两种方法任选其一即可。
方法一:GRUB恢复模式(最简单,推荐桌面/服务器)
第一步:调出GRUB菜单
重启机器,开机瞬间:
出现GNU GRUB菜单后松手。
┌──────────────────────────────────────────────────────┐ │ Ubuntu │ │ Advanced options for Ubuntu │ │ Memory test (memtest86+) │ │ │ │ 使用 ↑/↓ 选择条目,按 e 编辑,按 Enter 启动 │ └──────────────────────────────────────────────────────┘
第二步:进入恢复模式
- 选择
Advanced options for Ubuntu 回车 - 选中带
(recovery mode) 的内核,回车 - 在恢复菜单选择:
root - Drop to root shell prompt
┌──────────────────────────────────────────────────────┐│ Recovery Menu (recovery mode) ││ ││ resume - 正常启动 ││ clean - 清理临时文件 ││ dpkg - 修复损坏的软件包 ││ fsck - 检查文件系统 ││ grub - 更新GRUB引导 ││ network - 启用网络 ││ root - Drop to root shell prompt ←选择这个││ system-summary - 系统摘要 │└──────────────────────────────────────────────────────┘
第三步:挂载可读写、重置密码
进入root命令行后依次输入:
# 根分区默认只读,先改成读写mount -o rw,remount /# 重置普通用户密码(把 ubuntu 换成你的登录用户名)passwd ubuntu# 输入两次新密码,提示密码太短忽略警告即可
💡 Ubuntu特殊说明:Ubuntu默认禁用root登录,日常使用 sudo 提权。因此重置普通用户密码即可(通常是安装时创建的用户)。如果你确实需要启用root登录,执行 passwd root 并设置密码后,还需修改SSH配置允许root登录。
第四步:重启生效
# 切回只读再重启mount -o ro,remount /exec /sbin/init
系统正常启动,用新密码登录。
方法二:GRUB直接单用户shell(云服务器VNC常用)
操作步骤
- GRUB菜单选中Ubuntu默认内核,按
e 编辑启动参数 - 把行里的
ro 改成 rw,行尾添加 init=/bin/bash
修改前:
linux /boot/vmlinuz-xxx root=UUID=xxx ro quiet splash
修改后:
linux /boot/vmlinuz-xxx root=UUID=xxx rw quiet splash init=/bin/bash
三、RHEL系 vs Ubuntu 重置密码核心区别
| | |
|---|
| 救援模式关键字 | rd.break | recovery mode / init=/bin/bash |
| SELinux处理 | | |
| 根分区挂载 | /sysroot | / |
| 重置对象 | passwd root | passwd 普通用户 |
| 默认root登录 | | |
四、常见报错与解决方案
报错1:Authentication token manipulation error
passwd: Authentication token manipulation error
原因:文件系统是只读状态,无法写入新密码
解决方案:
RHEL系:
mount -o remount,rw /sysrootchroot /sysrootpasswd root
Ubuntu:
mount -o rw,remount /passwd ubuntu
报错2:改完密码重启后登录失败(RHEL系)
原因:SELinux拦截了登录请求(密码正确但无法登录)
解决方案:
- 在
chroot /sysroot 环境下一定要执行:
报错3:GRUB菜单一闪而过,看不到
解决方案:
- Ubuntu BIOS模式:开机时不停按
Shift - 云服务器:使用云厂商的控制台VNC连接,在控制台界面中操作
💡 虚拟机用户提示:VMware中开机后立即用鼠标点击黑屏区域,然后快速按对应按键,确保键盘输入被虚拟机捕获。
五、为什么RHEL系要有 /.autorelabel 这一步?
SELinux(Security-Enhanced Linux)会给每个文件打上安全上下文标签(类似于文件的“身份证”)。当你通过救援模式修改了 /etc/shadow(密码文件)时,这个文件的SELinux标签可能与当前策略不一致。
- 有
/.autorelabel → 下次开机时系统会自动扫描并修正所有文件的SELinux标签 → 登录正常 - 没有
/.autorelabel → SELinux策略和文件标签不一致,拒绝登录 → 进不去系统
🎯 记住:RHEL系无论用哪种方法,修改密码后一定要执行 touch /.autorelabel!Ubuntu用户直接跳过这步。
六、云服务器特别提醒
💡 强烈建议:云服务器优先使用云厂商提供的**「重置密码」**功能,远比手动进GRUB更安全、更方便!
七、完整操作速查卡片
RHEL系(CentOS/Rocky/RHEL)— rd.break 方式(推荐)
# GRUB界面按 e,在 linux 行尾加 rd.break # Ctrl+X 启动mount -o remount,rw /sysrootchroot /sysrootpasswd roottouch /.autorelabel# ⚠️ RHEL系绝对不能忘!exitmount -o remount,ro /sysrootexit
RHEL系— init=/bin/bash 方式(备用)
# GRUB界面按 e,在 linux 行尾加 rw init=/bin/bash# Ctrl+X 启动mount -o remount,rw /passwd roottouch /.autorelabel# ⚠️ RHEL系绝对不能忘!exec /sbin/init
Ubuntu — recovery mode 方式(推荐)
# GRUB界面选择 Advanced options → recovery mode → rootmount -o rw,remount /passwd ubunt# 或 passwd rootmount -o ro,remount /exec /sbin/init
Ubuntu — init=/bin/bash 方式(备用)
# GRUB界面按 e,linux 行把 ro 改成 rw,行尾加 init=/bin/bash# Ctrl+X 启动passwd ubuntu# 或 passwd rootexec /sbin/init
八、快速对比总结表
| | |
|---|
| GRUB按键 | | Shift |
| 内核参数 | | recovery mode 或 init=/bin/bash |
| 挂载命令 | mount -o remount,rw /sysroot | mount -o rw,remount / |
| 切换环境 | chroot /sysroot | |
| SELinux重标记 | | |
| 重置密码 | passwd root | passwd 用户名 |
| 重启 | exit | exec /sbin/init |
📌