Docker内核技术原理(十二) root目录怎么就发生了切换

在使用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内核技术原理(十二) root目录怎么就发生了切换

Docker里面正是利用了pivot_root在child进程(新的Mount Namespace)里面切换root目录,然后执行Chdir("/")切换到新的根目录下面。

展开阅读全文

页面更新:2024-03-06

标签:目录   工具包   根目录   文件系统   内核   容器   安全性   进程   权力   命令   原理   位置   结构   文件   程序   用户   系统   技术   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top