The Man Who's Walking
“There are few things more pathetic than those who have lost their curiosity and sense of adventure, and who no longer care to learn.”

chroot的使用和理解

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

为何使用 chroot

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

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

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

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

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

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

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

chroot 使用

虽然不是很完美,不过也算试验成功,更多等以后再折腾~

我想要做的是,把根目录设置为 test 目录

[root@VM_0_3_centos test]# chroot .
chroot: failed to run command ‘/bin/bash’: No such file or directory


一开始会报错,是因为切换根目录无法找到默认 shell - bash,所以我们只需要按照原样拷贝 /bin/bashtest/bin 下。

[root@VM_0_3_centos test]# cp /bin/bash bin/


仍然报错,是因为我们没有解决 bash 的依赖问题,用 ldd 检查依赖

[root@VM_0_3_centos test]# ldd bin/bash 
        linux-vdso.so.1 =>  (0x00007ffd8b3d7000)
        libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fc5eecc3000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fc5eeabf000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fc5ee6f1000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fc5eeeed000)


然后按照相同的目录结构复制即可。

注意:linux-vdso.so 中的 VDSO 就是Virtual Dynamic Shared Object,就是内核提供的虚拟的.so,这个.so文件不在磁盘上,而是在内核里头。内核把包含某 .so 的内存页在程序启动的时候映射入其内存空间,对应的程序就可以当普通的 .so 来使用里头的函数,所以无需复制。

复制完后,test/lib64 下应该是这样子的:

[root@VM_0_3_centos test]# ls lib64/
ld-linux-x86-64.so.2  libc.so.6  libdl.so.2  libtinfo.so.5


最后我们使用 chroot 即可:

[root@VM_0_3_centos test]# chroot .
bash-4.2# ls
bash: ls: command not found
bash: history: /root/.bash_history: cannot create: No such file or directory


我们使用 exit 可以退出位于新根的 shell,然后回到原来的 shell。

参考资料

  1. 理解 chroot
  2. chroot: failed to run command `/bin/bash': No such file or directory
Share

发表评论