CentOS7忘记root密码怎么办

在新版的 systemd 的管理机制中,默认的 rescue 模式无法直接取得 root 权限。而且还需要使用 root 的密码才能够进入 rescure 环境。 在忘记了 root 密码的情况下,可以在开机过程中给内核传入 rd.break 来处理。

需要注意的是, rd.break 是在 Ram Disk 里面的操作系统状态,因此不能直接取得原来的 linux 系统操作环境。所以还需要 chroot 的支持。 由于 SELinux 的问题,可能还要加上某些特殊的流程才能顺利的修改 root 密码。

进入到开机画面,在可以开机的选单上按下 e 来进入编辑模式:

然后在 linux16 对应的核心配置项上加入 rd.break 参数:

改完之后按下 Crtl+ x 开始开机,开机完成后屏幕会出现如下的类似画面:

请注意,此时是在 RAM Disk 的环境,并不是原本的 Linux 环境, 因此根目录下的文件与原本的系统没有任何关系。而且系统应该被挂载到 /sysroot 目录下。因此,需要这样操作:

上述的流程中:

  • chroot /sysroot :代表将根目录 暂时 切换到 /sysroot 目录下。因此,/sysroot 将会被暂时作为根目录, 而这个目录其实就是最原先的系统根目录,从而就能够处理文件系统与相关的账号管理了。
  • touch /.autorelabel:在 rd.break 的 RAM Disk 环境下,系统是没有 SELinux 的,而刚刚使用 passwd 命令修改密码的时候更改了 /etc/shadow, 所以这个文件的 SELinux 安全上下文的特性将会被取消。如果你没有让系统于开机时自动恢复 SELinux 的安全上下文, 系统将产生无法登录的问题 (在 SELinux 为 Enforcing 的模式下)。加上 /.autorelabel 就是要让系统在开机的时候自动使用预设的 SELinux type 重新写入 SELinux 安全上下文到每个文件去。

除了上述的 rd.break 之外,在 linux16 的那一行,最后面不使用 rd.break 而是使用 init=/bin/bash ,同样不需要 root 密码而有 root 权限。但是无法完整地操作该系统,因为此时已经将 1 号 PID 改为 bash 了。

而且,同样的,要操作该系统还需要 remount 根目录才可以,否则无法更改文件系统:

1
2
3
mount -o remount,rw /
echo 'your_root_password' | passwd --stdin root
touch /.autorelabel

由于是最预设的 bash 环境,所以 PATH 只有 /bin ,也就无法执行 reboot 命令。同时, 由于没有 systemd 或者是 init 的存在,所以使用绝对路径来执行 reboot 命令时,系统也无法重新启动。此时只能按下机器上的 reset 按钮或者是强制关机后,才能再次开机!

所以,保险起见,建议使用 rd.break 来处理。

有钱任性,请我吃包辣条
0%