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

在经过 chroot 命令之后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件,因此它带来的好处大致有以下3个:

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

在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。这个一般是在登录 (login) 前使用 chroot,以此达到用户不能访问一些特定的文件。

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

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

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

chroot 的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始 RAM 磁盘 (initrd) 切换系统的根位置并执行真正的 init。另外,当系统出现一些问题时,我们也可以使用 chroot 来切换到一个临时的系统。

一个实际可操作例子,我们将用户根目录设置为/root/jail(操作时以root用户演示)

J=$HOME/jail
mkdir -p $J
mkdir -p $J/{bin,lib64,lib}
cd $J
cp -v /bin/{bash,ls} $J/bin
ldd /bin/bash

ldd /bin/bash输出结果:

      linux-vdso.so.1 =>  (0x00007fff8d987000)
    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00000032f7a00000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000032f6e00000)
    libc.so.6 => /lib64/libc.so.6 (0x00000032f7200000)
    /lib64/ld-linux-x86-64.so.2 (0x00000032f6a00000)

将所需的依赖库拷贝到我们新建目录下:

cp -v /lib64/libtinfo.so.5 /lib64/libdl.so.2 /lib64/libc.so.6 /lib64/ld-linux-x86-64.so.2 $J/lib64/

拷贝ls命令所需要的库:

[root jail]#ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007ffca0bc9000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f9cc64f4000)
    libcap.so.2 => /lib64/libcap.so.2 (0x00007f9cc62ef000)
    libacl.so.1 => /lib64/libacl.so.1 (0x00007f9cc60e6000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f9cc5d19000)
    libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f9cc5ab7000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f9cc58b3000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f9cc671b000)
    libattr.so.1 => /lib64/libattr.so.1 (0x00007f9cc56ae000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9cc5492000)

一个一个拷贝比较麻烦,我们可以使用如下shell语句拷贝依赖库带jail目录下
list="$(ldd /bin/ls | egrep -o '/lib.*\.[0-9]')"
for i in $list; do cp -v "$i" "${J}${i}"; done

使用chroot命令切换到新的根目录

chroot $J /bin/bash

然后执行如下命令,由于我们目录下只有lib bin lib64,因此只能显示ls /,其余均会提示文件不存在。

# ls /
# ls /etc/
# ls /var/

详细步骤参考chroot command Examples