LXC学习1

           虚拟化学习笔记1——LXC

 

早上办理入职后,下午凯哥给我们带来了任务,但是一大堆的新名词让我摸不着头脑,所以首先要熟悉虚拟化研发需要的名词,打好基础,于是第一天的工作从libvirt.org开始了,LXC就是今天学习的入口。

 

通过对API的阅读和上网查资料,对LXC有了自己的理解。

 

LXCLinux containers,是一种轻量级的虚拟化技术,是在Linux平台上基于容器的虚拟化技术。

 

    容器

容器虚拟化技术是一种应用层的虚拟化技术,不需要对硬件进行操作,不仅能够提供一个完全隔离的虚拟环境,而且可以实现对内核资源的共享,与全虚拟化相比,节省了资源的占用,速度也更快。

 

为了实现LXC虚拟化,必须要依靠Linux内核子系统CgroupNamespace

 

Cgroup:负责LXC的资源管理方面,从对单一的进程的物理资源控制,到实现操作系统层次的虚拟化。

 

Namespace:负责为LXC提供控制隔离方案。把主机上的系统资源分配到不同的Namespace中,不同container中的进程属于不同的Namespace,这样进程之间彼此透明,互不干扰,达到隔离的效果。

 

具体来说,就是在调用clone时设置flag。先分成三部分进行分析:进程、文件和网络。

 

进程隔离:利用PID NamespaceIPC Namespace,每新建一个进程就创建一个PID Namespace,而一个PID Namespace可以为进程提供一个独立的PID环境,不同的Namespace中的进程互不可见。一个IPC Namespace中有一组system V IPC object标示符,这组标示符只在该Namespace中可见,即在该Namespace中的进程相互之间可以实现通信,不同的Namespace中的进程则不能通信。这样就保证了不同Namespace进程的隔离。

 

文件隔离:每一个进程都存在于一个mount Namespacemount Namespace为进程提供了一个文件层次视图。为进程创建一个独立的目录空间。

 

网络隔离:利用Network NamespaceUTS Namespace。一个Network Namespace为进程提供一个完全独立的网络协议栈的视图,即提供了一个独立的网络环境。UTS Namespace则是一组被uname返回的标示符。clone出来的进程可以通过相关系统调用改变这些标识符,比如调用sethostname来改变该Namespacehostname。这一改变对Namespace内的所有进程可见。结合使用可以虚拟出一个有独立主机名和网络空间的网络环境。

 

把以上三个隔离结合起来使用,就可以虚拟出一个完全独立的进程运行环境,即一个container,而运行在container中的进程认为自己是直接运行在一个系统上的,所以一个container相当于一个虚拟机,但是虚拟机来说,更节省开销。

 

LXC是直接依靠Linux内核的相关特性来建立一个容器环境,通过CgroupNamespace这两个机制实现隔离,但是我觉得在这样的机制下,每个进程都属于不同的container,互相之间不可见也不可以通信,那么不同容器中的进程是否能互相迁移?如果不能通信,那么非内核资源是不是不能共享?占用的空间会不会更大?

 

2014.7.1621:50

猜你喜欢

转载自bilibili.iteye.com/blog/2092955