1、Linux proc 文件系统介绍
/proc/N PID 的进程信息<br>/proc/N/cmdline 进程启动命令<br>/proc/N/cwd 链接到进程当前工作目录<br>/proc/N/environ 进程环境变量列表<br>/proc/N/exe 链接到进程的执行命令文件<br>/proc/N/fd 包含进程相关的所有文件描述符<br>/proc/N/maps 与进程相关的内存映射信息<br>/proc/N/mem 指代进程持有的内存,不可读<br>/proc/N/root 链接到进程的根目录<br>/proc/N/stat 进程的状态<br>/proc/N/statm 进程使用的内存状态<br>/proc/N/status 进程状态信息,比 stat/statm 更具可读性<br>/proc/self/ 链接到当前正在运行的进程
2、实现Run命令, 类似 docker run -it busybox [command]
1、使用 /proc/self/exe 调用自身进初始化行命名空间clone,挂载必要的proc 等
2、使用linux exec技术, 它的作用是执行filename对应的程序。它<br>会覆盖当前进程的镜像、数据、堆械等信息;相当于替代当其父进程的内容<br>
3、资源限制 cgroups
已知知识点<br>
1、cgroup hierarchy 中的节点,用于管理进程和 subsystem 的控制关系。<br>2、subsystem 作用于 hierarchy 上的 cgroup节点,并控制节点中进程的资源占用。<br>3、hierarchy 将 cgroup 通过树状结构串起来,并通过虚拟文件系统的方式暴露给用户。
大致实现,如memory<br>
1、 找到memory系统的 hierarchy /sys/fs/cgroup/memory/ ,建立自己进程名字的目录, 如 /sys/fs/cgroup/memory/mydocker<br>
2、设置memory.limit_in_bytes 数值
3、将自己的pid 加入到目录下的tasks 文件中,即可生效限制memory
4、管道技术
1、为什么需要使用管道技术?
主要是为了command 参数的传输,如果用户输入一个很长的参数(超过4K)或者特殊字符则可能传参失败;<br>
2、如何使用管道技术?
1、一个进程默认会有三个文件描述符,分别是标准输入、标准输出、标准错误。这<br>是子进程创建的时候就会默认带着的,其实还有一个外带的文件描述符第四个文件描述符;一般用于传送本进程的参数;
2、原理:本进程会拥有该文件描述符的写管道,其启动的子进程会拥有该描述符的读管道,那么子进程只需打开自己的第3索引文件描述符(即第四个文件描述符号,索引从0开始计算)就可以获取到读管道,从而读取其参数;