mnt namespace 隔离的资源是什么?
mnt namesapce 隔离的资源是挂载点。不同的mnt namespace 之间是无法看见各自的挂载点信息的。
mnt 挂载点的作用
自己的理解:挂载点会影响进程所看见的文件视图列表
mnt namespace的实质
创建一个进程,使用独立的mnt namespace, 进程会复制父进程的 mount table (挂载点表),
进程在自己的mnt namespace 之中对挂载点进行修改,只会影响本身的 mount table。
mnt 功能实验
目的:使用mnt 来验证文件隔离的功能
步骤:
1:创建一个测试目录
mkdir -p /opt/test/test
2:创建一个进程,并分配一个独立的mount namespace
unshare -m /bin/bash
3:将tmpfs文件系统挂载到 /opt/test/test之中
mount -t tmpfs tmpfs /opt/test/test
4:进入 /opt/test/test目录,并创建一个文件
cd /opt/test/test; touch a.txt
5:重新建立一个终端连接,查看 /opt/test/test下的文件信息。
ls /opt/test/test
如果不存在 /opt/test/test/a.txt说明mount资源隔离 成功。
反之,失败。
问题
1: docker 文件系统资源隔离背后是如何实现的?
docker 不仅仅是用 mnt namespace 进行资源隔离,对于 mnt namespace 资源隔离所导致的
会复制父进程的mount table 信息的问题,采用pivot_root 系统调用来解决。
注意:启动一个容器后,可以使用lsns 命令,会发现,多了一些新的namespace
2: pivot_root 的作用
pivot_root 是由 Linux 提供的一种系统调用,它能够将一个 mount namespace 中的所有进程的根目录 和当前工作目录切换到一个新的目录。pivot_root 的主要用途是在系统启动时,先挂载一个临时的 rootfs 完成特定功能,然后再切换到真正的 rootfs。