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