chroot命令
- 命令描述
只有特权进程(Linux:具有CAP_SYS_CHROOT功能的进程)才可以调用chroot()。
此调用更改了路径名解析过程中的一个成分,并且不执行任何其他操作。
此调用不会更改当前工作目录,因此在调用之后' 。'可以在树的外面以' / '为根。特别是,超级用户可以通过以下方式逃离“ chroot监狱”:
mkdir foo; chroot foo; cd ..
此调用不会关闭打开的文件描述符,并且此类文件描述符可能允许访问chroot树之外的文件。
- 命令语法
- 命令实例
choot 即用于更改根目录
在经过 chroot 之后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件,因此它带来的好处大致有以下3个:
增加了系统的安全性,限制了用户的权力;
在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。这个一般是在登录 (login) 前使用 chroot,以此达到用户不能访问一些特定的文件。
建立一个与原系统隔离的系统目录结构,方便用户的开发;
使用 chroot 后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。
切换系统的根目录位置,引导 Linux 系统启动以及急救系统等。
chroot 的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始 RAM 磁盘 (initrd) 切换系统的根位置并执行真正的 init。另外,当系统出现一些问题时,我们也可以使用 chroot 来切换到一个临时的系统。
实例:通过 chroot 重新设置 root 密码
忘记了 root 密码该怎么办?接下来的 demo 将演示如何通过 chroot 命令重新设置 centos7 中被忘记了的 root 密码。
systemd 的管理机制中,rescure 模式和 emeryency 模式是无法直接取得 root 权限的,需要使用 root 密码才能进入 rescure 和 emeryency 环境。所以我们需要通过其他方式来设置 root 密码。我们可以为内核的启动指定 "rd.break" 参数,从而让系统在启动的早期停下来,此时我们可以通过使用 root 权限并结合 chroot 命令完成设置 root 密码的操作。下面我们一起来看具体的操作过程。
在系统启动过程中进入开机菜单时按下字母键 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 / xfs rw,relatime,attr2,inode64,noquota 0 0
该时间点的最大好处可以让你具有 root 权限!到这里就可以设置新的 root 密码了
首先像之前说过的,需要把 /sysroot 重新挂载为可读写的模式。命令如下:
switch_root:/# mount -o remount,rw /sysroot
接下来使用 chroot 命令把根目录切换到我们正常的环境中:
switch_root:/# chroot /sysroot
此时可以理解为:我们以 root 权限正常登录了,都到这里了,修改密码当然就很容易了吧!
用下面的命令为 root 用户设置新的密码:
sh-4.2# echo "www.linuxbaodian.com" | passwd --stdin root
当然也可以使用这种密文方式:
sh-4.2#passwd root
接下来就是处理 SELinux 相关的问题(如果原环境关闭了SELINUX,可以不考虑)。由于当前的环境中 SELinux 并未启动,所以我们对文件的修改可能造成文件的 context 不正确。为了确保开机时重新设定 SELinux context,必須在根目录下添加隐藏文件 .autorelabel:
sh-4.2# touch /.autorelabel
然后接着从 chroot 中退出,并重启系统:
sh-4.2# exit switch_root:/# reboot
最后使用www.linuxbaodian.com 作为新的root密码,登录系统。