LXC简介:
LXC是Linux containers的简称,是一种基于容器的操作系统层级的虚拟化技术。
LXC在资源管理方面依赖与Linux内核的cgroups子系统,cgroups子系统是Linux内核提供的一个基于进程组的资源管理的框架,可以为特定的进程组限定可以使用的资源。
LXC在隔离控制方面依赖于Linux内核的namespace特性,具体而言就是在clone时加入相应的flag(NEWNS NEWPID等等)。
LXC对比传统VM:
相比传统虚拟化,LXC有着高效的资源利用率。
LXC有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心 CPU 本地运行指令,而不需要任何专门的解释机制。因此,LXC有着更好的执行效率。
资源隔离之Cgroup:
Cgroup在LXC中扮演的角色是资源隔离。后面会专门讲解Cgroup。
Cgroup的控制用子系统划分。
Cgroup的子系统:
cpu — 这个子系统可以限制CPU使用。
memory — 这个子系统设定 cgroup 中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。
cpuset — 这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。
cpuacct — 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告。
blkio — 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。
devices — 这个子系统可允许或者拒绝 cgroup 中的任务访问设备。
虚拟化之namespace(名字命名空间)
为何说namespace提供了虚拟化呢,因为正是它让在cgroup中的程序觉得在一个传统的物理机上运行。
Lnux现有的namespace有6种:uts, pid, ipc, mnt, net和user。通过clone函数的flag位设置。
Linux Namespaces机制本身就是为了实现container based virtualizaiton开发的。它提供了一套轻量级、高效率的系统资源隔离方案。
clone函数的flag位:
CLONE_NEWPID:会创建一个新的PID Namespace,clone出来的新进程将成为Namespace里的第一个进程。一个PID Namespace为进程提供了一个独立的PID环境,PID Namespace内的PID将从1开始,在Namespace内调用fork,vfork或clone都将产生一个在该Namespace内独立的PID。但是在宿主机依然能看到原始的PID。
CLONE_NEWIPC:会创建一个新的IPC Namespace,clone出来的进程将成为Namespace里的第一个进程,通信空间的隔离。
同时指定CLONE_NEWPID和CLONE_NEWIPC,这样新创建的Namespace既是一个独立的PID空间又是一个独立的IPC空间。不同Namespace的进程彼此不可见,也不能互相通信,这样就实现进程间的隔离。
CLONE_NEWNS:会创建一个新的mount Namespace。每个进程都存在于一个mount Namespace里面,mount Namespace为进程提供了一个文件层次视图。
CLONE_NEWNET:会创建一个新的Network Namespace。一个Network Namespace为进程提供了一个完全独立的网络协议栈的视图。
CLONE_NEWUTS:会创建一个新的UTS Namespace。UTS命名空间包含了运行内核的名称、版本、底层体系结构类型等信息。
以上所有clone flag都可以一起使用,为进程提供了一个独立的运行环境。LXC正是通过在clone时设定这些flag,为进程创建一个有独立PID,IPC,FS,Network,UTS空间的container。一个container就是一个虚拟的运行环境,对container里的进程是透明的,它会以为自己是直接在一个系统上运行的。
转载请注明:旅途@KryptosX » LXC(Linux containers)的组成