https://cloud.tencent.com/developer/article/2129136
https://www.cnblogs.com/ExMan/p/14665154.html (**)
https://www.cnblogs.com/luoxn28/p/12182586.html
目录
一、namespace技术发展史
https://blog.csdn.net/yuelai_217/article/details/132664238
二、namespace命令
1.查看当前进程所有的namespace
ls -l /proc/self/ns/
通过比对namespace的id就知道进程当前处于哪些namespace下。
2.创建或者加入namespace
Linux对Namespace的操作,主要是通过clone、setns和unshare这3个系统调用来完成的,clone创建新进程时,接收一个叫flags的参数,这些flag包括CLONE_NEWNS、CLONE_NEWIPC、CLONE_NEWUTS、CLONE_NEWNET(Mount namespace)、CLONE_NEWPID和CLONE_NEWUSER,用于创建新的namespace,这样clone创建出来新进程之后就属于新的namespace了,后续新进程创建的进程默认属于同一namespace。
如果想要给已存在进程设置新的namespace,可通过unshare函数(long unshare(unsigned long flags))完成设置,其入参flags表示新的namespace。当想要给已存在进程设置已存在的namespace,可通过setns函数(int setns(int fd, int nstype))来完成设置,每个进程在procfs目录(/proc/进程ID/ns)下存储其相关的namespace信息,可找到已存在的namesapce,然后通过setns设置即可:
- unshare命令实战
https://juejin.cn/post/6987564689606180900
https://zhuanlan.zhihu.com/p/614728214 (unshare命令封装)
三、namespace分类
https://zhuanlan.zhihu.com/p/520309169
1.CLONE_NEWNS
https://blog.csdn.net/weixin_33494995/article/details/116717946
注意Mount Namespace对应CLONE_NEWNS,因为历史原因命名不一致。
https://blog.csdn.net/weixin_40108561/article/details/125523491
https://www.cnblogs.com/Benjious/p/14856849.html
重点1
-
新创建的容器会直接继承宿主机的各个挂载点 .
-
在新的进程中执行 mount 命令, mount 的效果才会生效 .这就是 Mount Namespace 跟其他 Namespace 的使用略有不同的地方:它对容器进程视图的改变,一定是伴随着挂载操作(mount)才能生效。
-
不难想到,我们可以在容器进程启动之前重新挂载它的整个根目录“/”。而由于 Mount Namespace 的存在,这个挂载对宿主机不可见,所以容器进程就可以在里面随便折腾了。
如果mnt命名空间里没有mount,直接操作,等于是在修改宿主机的文件系统。
重点2-隔离文件系统
我们使用namespace mount 创建了一个与主机文件系统隔离的容器进程,但是此时容器内的目录挂载是继承了主机目录挂载的。我们首先要将root 文件系统挂载到一个新的目录中。
通过mount无法实现rootfs的切换,因为我们无法使所有的进程停止使用当前rootfs 。当我们使用umount 卸载当前rootfs挂载后,进程已经无法正常提供mount操作支持我们挂载新的rootfs 。但是可以采用另一个系统调用:pivot_root
四、namespace交互工具nsenter
nsenter即ns enter之意
https://blog.csdn.net/IOT_AI/article/details/137592170
https://blog.csdn.net/hezuijiudexiaobai/article/details/130495974
源码下载:apt-get source util-linux
0 条评论