在使用Docker的过程中,我们可以在任何目录执行这样的命令
# docker run -it busybox sh
/ # pwd
/
然后神奇的事情发生了,我们进入了容器后,就在容器的根目录下面了,上一秒我们还在主机的任意目录,下一秒怎么就跳转到容器里面的根目录呢?其实这里发生了chroot。
chroot即change root directory (更改root目录)。在 linux系统中,系统默认的目录结构都是以 `/`,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为 `/` 位置。通过chroot一方面可以增加了系统的安全性,限制了用户的权力;在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,从而增强了系统的安全性。其实是可以建立一个与原系统隔离的系统目录结构,方便用户的开发,使用chroot后,程序读取的是新根下的目录和文件,建立一个与原系统根下文件不相关的目录结构。在这个新的环境中,用户可以随意的调试程序。举个例子,我们先把busybox下载到”/root/ok“后,将”/root/ok“目录设置成根目录。如下:
# pwd
/root/ok
# sudo chroot . /busybox pwd
# /
上面的使用busybox是一个开源的命令行工具包,里面包含了一些常用的linux常用命令。可以看到我是用”/busybox“的,因为当前ok目录以及是根目录了,而且busybox的输出也显示当前目录是根目录。
上面只是通过busybox执行了pwd命令,如果是启动一个shell将会更有意思,如下:
# sudo chroot . /busybox sh
/ # ls
sh: ls: not found
/ # /busybox ls /
busybox
在新构建的根目录下,已经没有ls等工具了,只有一个busybox二进制,我们可以通过busybox的ls继续操作。
除了chroot以外linux还提供了另一个类似的命令pivot_root。格式如下:
# pivot_root new_root put_old
其中new_root是新的root目录,put_old则是老的根文件系统,这里有个限制就是这两个目录不属于同一个Mount Namespace,至于什么是Mount Namespace请参见之前的文章。所以,我们可以在容器里面使用pivot_root切换root目录。
# docker run -it -v /root/kkkk:/test --privileged=true busybox sh
# cd /test &&mkdir oldroot/
# pivot_root . oldroot/
pivot_root主要是把整个系统切换到一个新的root目录,而移除对之前root文件系统的依赖,这样你就能够umount原先的root文件系统。而chroot是针对某个进程的。如下图,pivot_root切换得更加彻底。
Docker里面正是利用了pivot_root在child进程(新的Mount Namespace)里面切换root目录,然后执行Chdir("/")切换到新的根目录下面。
页面更新:2024-03-06
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号