Linux Containers即就是Linux容器,是一个加强版的Chroot。容器可以提供轻量级的虚拟化,一遍隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。;
LXC主要依赖Linux内核的3种隔离机制(isolation infrastructure):
- Chroot 将应用隔离岛一个虚拟的私有root下
- Cgroups 实现资源控制,给每个用户实例可以按需提供其计算资源
- Namespaces 提供了隔离性,每个用户实例之间相互隔离,互不影响
Linux的3.12内核支持6 种Namespace:
- UTS:隔离进程的hostname
- IPC:进程间通信
- PID:隔离进程间的PID namespace,clone新建的进程PID namespace中PID从 1 开始
- NS:mount挂载点
- NET:网络访问,包括接口
- USER:将本地的虚拟user-id映射到真实的user-id
想要测试LXC的namespace隔离功能,可以使用clone函数,该函数的flag指定了要隔离的类型:
#include <sched.h>
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ... );
fn:子进程要执行的函数
child_stack:子进程的栈空间
flag:创建子进程的标志
arg:传给子进程的参数
namespace中对应前五种可以使用clone函数的flag激活,如下:
下边对每一种namespace进行实例验证。
UTS namespace
#define _GNU_SOURCE //功能测试宏,可以在程序中定义(必须程序开头),也可以在编译时指定 gcc -D_GNU_SOURCE 程序名