namespace
一种资源隔离方案,linux在创建进程时可以使用fork或clone,前者采用写时复制父进程的资源,而后者可以与父进程进行共享部分资源。
在调用clone时,通过传入的flag参数,可以控制哪些资源可以共享,哪些资源会被隔离。这些flag参数就是namespace系统调用参数,目前有六种namespace提供不同的隔离。对于隔离的资源,两个进程内的修改互不影响。(隔离的部分会写时复制,其他部分保持共享)
对于clone调用,会执行参数中的fn函数作为新进程的逻辑,fn函数的返回值即为返回code。
系统调用API
| clone | 创建新进程,根据系统调用参数判断哪种namespace被创建 |
|---|---|
| unshare | 将进程从某个namespace中移除 |
| setns | 将进程加入到某个namespace中 |
系统调用参数
| mount | CLONE_NEWNS | 隔离文件系统挂载点视图,namespace中mount对外界无感 |
|---|---|---|
| uts | CLONE_NEWUTS | 隔离hostname |
| ipc | CLONE_NEWIPC | 隔离system v ipc和 POSIX message queues |
| pid | CLONE_NEWPID | 隔离进程id |
| network | CLONE_NEWNET | 隔离网络和端口 |
| user | CLONE_NEWUSER | 隔离用户和用户组id,如普通用户可在namespace中成root |
cgroups
一种资源分配、限制方案
- 可以限制一个进程能够使用多少资源,如cpu、内存、网络、磁盘等
- cgroup级别监视资源限制控制
- 可以用命令控制一个cgroup中的所有的进程的状态,如frozen, stopped, or restarted
cgroup可以继承,形成树级继承控制方式,子节点受父节点的限制
参考文献: What Are Namespaces and cgroups, and How Do They Work clone(2) — Linux manual page
