Bonky Zhu
If someone is able to show me that what I think or do is not right, I will happily change, for I seek the truth, by which no one was ever truly harmed. It is the person who continues in his self-deception and ignorance who is harmed.

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

You may also like...

发表评论