在系统启动过程中进入开机菜单时按下字母键 e 进程开机菜单的编辑模式:

这就是系统的开机菜单,按下 e 后进入编辑界面:

找到以 "linux16 /vmlinuz-" 开头的行。如果默认没有看到该行,需要按向下键把它滚动出来。
然后定位到该行结尾处,输入一个空格和字符串 "rd.break",如下图所示:

接着按下 ctrl + x 以该设置继续启动,启动过程中操作系统会停下来,这是系统启动过程中的一个非常早的时间点:

所以系统的根目录还挂载在 RAM disk 上(就是内存中的一个文件系统),我们可以通过 mount 命令检查系统当前挂载的文件系统,下面是我们比较关心的两条:

上图中 mount 命令输出的第一行说明此时的根目录在一个 RAM disk 中, 即 rootfs。
图中输出的第二行说明我们的文件系统此时被挂载到了 /sysroot 目录,并且是只读的模式:
/dev/mapper/centos-root on /sysroot type xfs (ro,relatime,attr2,inode64,noquota)
而在我们正常登陆系统的情况下,系统根目录的挂载情况如下:
/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 权限登录了原来的系统,修改密码就很容易了!用下面的命令为 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
重新进入登陆界面时就可以使用刚才设置的密码以 root 登陆了!
总结
chroot 是一个很有意思的命令,我们可以用它来简单的实现文件系统的隔离。但在一个容器技术繁荣的时代,用 chroot 来进行资源的隔离实在是 low 了点。所以 chroot 的主要用途还是集中在系统救援、维护等一些特殊的场景中。








