在日常运维中,难免会遇到这种情况:
服务器是自己的,机房/控制台也能进,但就是 root 密码忘了。
在 CentOS 7 中,可以通过修改 Grub 启动参数、进入特殊模式来重置 root 密码,而不是重装系统。
注意:
该方法适用于 物理机、KVM/VMware 等虚拟机,前提是你有控制台(VNC/虚机控制台/IDRAC/iLO 等)权限。对于云服务器(如阿里云、腾讯云、AWS 等),一般有各自的控制台重置密码/救援模式,不必定完全一样。
下面以 CentOS 7.x 为例,完整演示忘记 root 密码后的重置步骤。
一、重启服务器,进入 Grub 引导菜单
- 重启服务器:
- <BASH>
- reboot
- 或在控制台上直接点击重启(如果完全登不进去,就只能通过云控制台或远控面板强制重启)。
- 在系统开机引导时,当出现 Grub 菜单界面(一般会显示 CentOS Linux 的启动选项)时,
用键盘选中默认启动项(一般已经高亮),按下键盘上的:
e 键(edit,编辑启动参数) - 如果系统直接“闪过”进入启动界面,看不到菜单:
- 可以在启动初期按 Esc 或 Shift,让 Grub 菜单显示出来。
- 或在虚拟机设置里开启显示引导菜单。
二、在 Grub 中修改启动参数
进入编辑界面后:
- 找到一行以 linux16 开头的内容,类似:
- <TEXT>
- linux16 /vmlinuz-3.10.0-957.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rhgb quiet LANG=en_US.UTF-8
- 在这一行里做两个关键修改:
- 把里面的 ro(只读)改为 rw(读写)。
- 在这一行的末尾添加:
- <TEXT>
- init=/sysroot/bin/sh
- 常见写法示例(只要参数顺序大致正常即可):
- <TEXT>
- linux16 /vmlinuz-3.10.0-957.el7.x86_64 root=/dev/mapper/centos-root rw init=/sysroot/bin/sh
- 说明:
- rw:允许根文件系统读写,这样才能修改密码文件。
- init=/sysroot/bin/sh:使用 /sysroot/bin/sh 作为 init 程序,系统会直接进入一个 shell,而不是正常启动。
- 修改完成后,不要按 Enter,而是按:
Ctrl + X
让系统按当前修改后的参数启动。
三、进入救援 shell 环境并切 root 环境
如果操作正确,系统不会正常启动,而是进入一个简易的命令行界面,类似:
<TEXT>
sh-4.2#
此时的根目录实际上挂载在 /sysroot 下,我们需要 chroot 进去:
- 切换到真实系统根目录环境:
- <BASH>
- chroot /sysroot
- 确认根目录是读写挂载(一般上一步 rw 已经生效,可以再执行一遍):
- <BASH>
- mount -o remount,rw /
此时你已经等同于进入了原系统的 root 环境。
四、执行 root 密码重置
在 chroot 环境中,直接使用 passwd 命令修改 root 密码:
<BASH>
passwd root
按提示输入两次新密码,例如:
<TEXT>
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
看到 updated successfully 即说明密码重置成功。
五、处理 SELinux(超级关键,别跳过)
CentOS 7 默认 SELinux 多数为 enforcing,我们刚才是以特殊方式启动系统并修改了 shadow 等文件,如果 不处理 SELinux 标签,很容易出现:
- 重启后 root 无法登录
- /bin/bash 或其它关键文件提示权限错误
为避免这类情况,强烈提议多做一步:让系统重启后自动重新打 SELinux 标签:
<BASH>
touch /.autorelabel
这个文件的作用是:系统下次正常启动时,自动对整个系统文件做一次 SELinux relabel(视磁盘大小,时间可能比较久)。
六、退出 chroot 并重启系统
- 退出 chroot 环境:
- <BASH>
- exit
- 再退出一次救援 shell(如果还在),或直接重启:
- <BASH>
- reboot -f
- -f 表明强制重启,不走正常关机流程。
七、首次启动的 SELinux relabel 过程(可能会比较慢)
如果你刚才做了 touch /.autorelabel,在系统正常启动时,可能会看到类似:
<TEXT>
*** Warning -- SELinux relabel is required. ***
这是正常现象,说明系统正在重新打标签:
- 期间磁盘会有大量 IO,耗时视磁盘大小与文件数量而定,少则几分钟,多则几十分钟。
- 不要以为系统卡死了就强制重启,耐心等待完成。
完成后系统会自动重启一次,然后就可以用新的 root 密码正常登录了。
八、登录验证
系统恢复正常启动后:
- 在控制台/SSH 中使用新密码登录:
- <TEXT>
- Username: root Password: <你刚才设置的新密码>
- 成功登录后提议立刻做几件事:确认系统时间、服务是否正常:
- <BASH>
- date systemctl status sshd
- 如果是生产环境,提议检查下关键业务服务状态。
- 提议配置 SSH 公钥登录,减少对密码的依赖。
九、常见问题与排查
1. Grub 编辑后启动还是正常进入系统,没有进入 shell?
可能问题:
- 没有正确按 Ctrl + X,而是用的其他键。
- 启动项不是当前使用的那一项。
- 修改的不是 linux16 那一行。
提议重启再来一次,注意检查:
- 是否的确 把 ro 改成了 rw;
- 是否完整写了:init=/sysroot/bin/sh。
2. 忘记执行touch /.autorelabel,重启后 root 无法登录?
表现为:
- 密码输入正确,但登录失败;
- 或某些命令提示权限问题。
再按照本文流程重新进一次救援模式, chroot /sysroot 后补上:
<BASH>
touch /.autorelabel
exit
reboot -f
等待 SELinux relabel 完成。
3. 云服务器(阿里云、腾讯云、AWS)无法通过 Grub 重置 root 密码?
许多云厂商会对 Grub 做额外保护,或者通过快照/系统盘挂载到其他实例来修改密码。
这时提议:
- 查阅对应云厂商的官方文档,搜索“重置实例密码”或“系统盘挂载恢复”;
- 或用“救援模式”(Rescue Mode),把系统盘挂载到救援系统中修改 /etc/shadow。
收藏了,感谢分享