linux container (LXC)内核知识碎记
linux namespace资源隔离
在linux内核中一共有下面六种namespace
namespace | 系统调用参数 | 隔离内容 |
---|---|---|
UTS | CLONE_NEWUTS | 主机名与域名 |
IPC | CLONE_NEWIPC | 信号量、消息队列和贡享内存 |
PID | CLONE_NEWPID | 进程编号 |
NETWORK | CLONE_NEWNET | 网络设备、网络栈 |
Mount | CLONE_NEWNS | 挂载点(文件系统) |
USER | CLONE_NEWUSER | 用户和用户组 |
在linux 3.8以后的内核版本中,就对这六种namespace有了全面支持,还提供了相关的api函数,一共有四种方式进行namespace API操作。
- 通过clone()在创建新进程时创建namespace
int clone(int (*child_func)(void * args),void *child_stack,int flags,void * arg);
//clone()实际上是linux系统调用fork()的一种更通用的实现方式,他可以通过flags来控制使用了多少功能,一共有20多种CLONE_*标志位来控制clone进程的方方面面。
/**
四个参数说明:
child_func 传入子进程运行的程序主函数
child_stack 子进程使用栈空间的大小
flags 表示使用了哪些CLONE_*标志位。
args 用于传入主函数的参数.
*/
- 查看/proc/[pid]/ns文件
从linux内核3.8起,用户就可以通过查看/proc/[pid]/ns文件下看到指向不同namespace号的文件,如果两个进程的编号相同,就说明他们在同一个namespace下。/proc/[pid]/ns里设置这些link的目的还有一个就是,一旦上述link文件被打开,只要打开的文件描述符在,那么就算该namespace下所有的进程都已经结束,这个namespace也会存在,这样后续