当前位置 主页 > 服务器问题 > Linux/apache问题 >

    linux chroot命令详解

    栏目:Linux/apache问题 时间:2019-10-10 08:15

    chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以 /,即以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为 / 位置。

    基本语法

    chroot NEWROOT [COMMAND [ARG]...]

    具体用法请参考本文的 demo。

    为什么要使用 chroot 命令

    增加了系统的安全性,限制了用户的权力:

    在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。一般会在用户登录前应用 chroot,把用户的访问能力控制在一定的范围之内。

    建立一个与原系统隔离的系统目录结构,方便用户的开发:

    使用 chroot 后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。

    切换系统的根目录位置,引导 Linux 系统启动以及急救系统等:

    chroot 的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始 RAM 磁盘 (initrd) 切换系统的根位置并执行真正的 init,本文的最后一个 demo 会详细的介绍这种用法。

    通过 chroot 运行 busybox 工具

    busybox 包含了丰富的工具,我们可以把这些工具放置在一个目录下,然后通过 chroot 构造出一个 mini 系统。简单起见我们直接使用 docker 的 busybox 镜像打包的文件系统。先在当前目录下创建一个目录 rootfs:

    $ mkdir rootfs

    然后把 busybox 镜像中的文件释放到这个目录中:

    $ (docker export $(docker create busybox) | tar -C rootfs -xvf -)

    通过 ls 命令查看 rootfs 文件夹下的内容:

    $ ls rootfs

    万事俱备,让我们开始吧!

    执行 chroot 后的 ls 命令

    $ sudo chroot rootfs /bin/ls

    虽然输出结果与刚才执行的 ls rootfs 命令形同,但是这次运行的命令却是 rootfs/bin/ls。

    运行 chroot 后的 pwd 命令

    $ sudo chroot rootfs /bin/pwd

    哈,pwd 命令真把 rootfs 目录当根目录了!

    不带命令执行 chroot

    $ sudo chroot rootfs

    这次出错了,因为找不到 /bin/bash。我们知道 busybox 中是不包含 bash 的,但是 chroot 命令为什么会找 bash 命令呢? 原来,如果不给 chroot 指定执行的命令,默认它会执行 '${SHELL} -i',而我的系统中 ${SHELL} 为 /bin/bash。

    既然 busybox 中没有 bash,我们只好指定 /bin/sh 来执行 shell 了。

    $ sudo chroot rootfs /bin/sh

    运行 sh 是没有问题的,并且我们打印出了当前进程的 PID。

    检查程序是否运行在 chroot 环境下

    虽然我们做了好几个实验,但是肯定会有朋友心存疑问,怎么能证明我们运行的命令就是在 chroot 目录后的路径中呢?