systemd 的管理机制中,rescure 模式和 emeryency 模式是没法直接取得 root 权限的,须要使用 root 密码才能进入 rescure 和 emeryency 环境。因此咱们须要经过其余方式来设置 root 密码。咱们能够为内核的启动指定 "rd.break" 参数,从而让系统在启动的早期停下来,此时咱们能够经过使用 root 权限并结合 chroot 命令完成设置 root 密码的操做。
下面咱们一块儿来看具体的操做过程。node
在系统启动过程当中进入开机菜单时按下字母键 e 进程开机菜单的编辑模式:linux
这就是系统的开机菜单,按下 e 后进入编辑界面:
centos
找到以 "linux16 /vmlinuz-" 开头的行。若是默认没有看到该行,须要按向下键把它滚动出来。
而后定位到该行结尾处,输入一个空格和字符串 "rd.break",以下图所示:app
接着按下 ctrl + x 以该设置继续启动,启动过程当中操做系统会停下来,这是系统启动过程当中的一个很是早的时间点:ide
因此系统的根目录还挂载在 RAM disk 上(就是内存中的一个文件系统),咱们能够经过 mount 命令检查系统当前挂载的文件系统,下面是咱们比较关心的两条:操作系统
上图中 mount 命令输出的第一行说明此时的根目录在一个 RAM disk 中, 即 rootfs。
图中输出的第二行说明咱们的文件系统此时被挂载到了 /sysroot 目录,而且是只读的模式:code
/dev/mapper/centos-root on /sysroot type xfs (ro,relatime,attr2,inode64,noquota)
而在咱们正常登录系统的状况下,系统根目录的挂载状况以下:blog
/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
该时间点的最大优点是咱们具备 root 权限!因此让咱们开始设置新的 root 密码吧。进程
先经过下面的命令把 /sysroot 从新挂载为可读写的模式:内存
switch_root:/# mount -o remount,rw /sysroot
而后用下面 chroot 命令把根目录切换到咱们原来的环境中:
switch_root:/# chroot /sysroot
用下面的命令为 root 用户设置新的密码:
sh-4.2# echo "new_root_pw" | passwd --stdin root
接下来还要处理 SELinux 相关的问题。因为当前的环境中 SELinux 并未启动,因此咱们对文件的修改可能形成文件的 context 不正确。为了确保开机时从新设定 SELinux context,必須在根目录下添加隐藏文件 .autorelabel:
sh-4.2# touch .autorelabel
最后从 chroot 中退出,并重启系统:
sh-4.2# exit switch_root:/# reboot