Lxc实现与cgroup关系
LXC 是 Linux Container的缩写。Linux 容器技术是一种内核虚拟化技术,它提供了轻量级的虚拟化技术,可以在单一控制主机上同时提供多个虚拟环境(即容器)以隔离进程和资源,每个虚拟环境拥有自己的进程和独立的命名空间。在基于容器的虚拟化技术中,进程不再是个全局概念,而是从属于某个特定的容器。理想情况下,进程跟容器之间是动态关联的,进程可以在容器之间迁移。在基于容器的虚拟化技术中,容器既是资源容器,也是隔离的命名空间,它能有效地将由单个操作系统管理的资源划分到隔离的组中,以更好地在隔离的组之间平衡有冲突的资源的占用需求。
实现LXC两大技术之一是命名空间。基于容器的虚拟化技术主要通过隔离操作系统内核的对象(例如 PID、UID、系统共享内存、IPC、net等等)来完成安全性的隔离,具体就是运用Namespace名字空间将原来的全局对象(句柄、UID等)隔离到完全不同的名称空间里,不同虚拟机之间是完全不可见的,因此它们也不能访问到名称空间之外的对象。全局对象在每个虚拟机内本地化了,换句话说,全局的对象标记仅仅是在每个虚拟机内部全局。Namespace特性的具体使用方式就是在clone时加入相应的flag(NEWNS NEWPID等等)。LXC正是通过在clone时设定这些flag,为进程创建一个有独立PID,IPC,FS,Network,UTS空间的容器。一个容器就是一个虚拟的运行环境,对容器里的进程是透明的,它会以为自己是直接在一个系统上运行的。
实现LXC另一个技术是cgroups。LXC在资源管理方面依赖与内核的 Cgroups (Control Groups) 子系统,Cgroups 子系统是内核提供的一个基于进程组的资源管理的框架,可以为特定的进程组限定可以使用的资源。
linux内核提供了cgroups控制组(control groups)的功能,最初由google的工程师提出,后来被整合进Linux内核。cgroups适用于多种应用场景,从单个进程的资源控制,到实现操作系统层次的虚拟化提供了以下功能:
1、限制进程组可以使用的资源数量(Resource limiting )。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发OOM(out of memory)。
2、进程组的优先级控制(Prioritization )。比如:可以使用cpu子系统为某个进程组分配特定cpu share。
3、记录进程组使用的资源数量(Accounting )。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间。
4、进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。
5、进程组控制(Control)。比如:使用freezer子系统可以将进程组挂起和恢复。
下面介绍lxc常用的管理接口:
1、lxc-start 创建容器,并在容器中执行给定命令
2、lxc-kill发送信号给容器中的第一个用户进程(容器内部进程号为2的进程)
3、lxc-cgroup用于获取或调整与cgroup相关的参数
简单介绍下命令用法:
lxc-start -n name [-f config_file] [-cconsole_file] [-d] [-s KEY=VAL] [command]
-d 将容器当做守护进程执行
-f 后面跟配置文件
-c 指定一个文件作为容器console的输出,如果不指定,将输出到终端
-s 指定配置
例如:
lxc-start -n foo1 -f ./lxc-cfg -d /bin/bash
这里所说的配置文件提供了cgroups、提供单独的网络、根目录空间等,以P4080DS单板为例的配置文件如下,具体含义有时机再进行分析。
lxc.utsname= foo23
lxc.network.type= macvlan
lxc.network.macvlan.mode= vepa
lxc.network.flags= up
lxc.network.link= br0
lxc.network.name= eth0
lxc.network.ipv4= 192.168.0.23
lxc.network.type= macvlan
lxc.network.macvlan.mode= vepa
lxc.network.flags= up
lxc.network.link= br0
lxc.network.name= eth1
lxc.network.ipv4= 192.168.128.23
lxc.tty= 1