LXC容器相关论文笔记

段赫.基于LXC容器资源优化的研究与实现.2016

一、绪论

容器虚拟化技术

传统虚拟化技术,实现一个虚拟机就意味着需要消耗了硬件资源来在底层系统上虚拟一个新的操作系统,所以除了传统模拟硬件的虚拟化技术,另一种方式更适合一个云平台,就是以LXC(Linux container)和Docker为代表的基于容器的软件虚拟化。

使用容器能够直接利用底层宿主机的操作系统,通过分割与隔离将系统资源划分到不同的组中,通过这种直接分组的方式解决各个容器间的资源争夺,从而平衡了使用虚拟化后对资源需求产生的冲突,同时对容器内的应用来说,其感觉不到虚拟化平台的存在,可以直接使用共享的底层资源如同直接在主机系统上运行一样。

使用容器虚拟化技术也避免了某些传统的如XEN等的虚拟手段在靠半虚拟化实现时,更换新的适合平台的系统调用而产生的问题。容器可以使你的应用在不同的Linux发行版之间迁移。

但容器的隔离性无法达到虚拟机的水平,不完全的隔离隐含着安全问题。

Linux container(LXC)是主流的内核虚拟化技术,它在Limux平台上借由内核提供的Namespace和Cgroups实现,它们分别实现了容器进程的沙盒隔离以及资源限制。

国内外研究现状

目前被广泛使用的虚拟化众多,容器虚拟化最为主流的是LXC和Docker,其中后者主要在Ixc的上加入了层级化的image文件系统,通过这层文件系统采用了相同image实现的容器可以以共享的方式使用内部文件和各类数据,并且能共用相关的工具,最后容器系统能copy on write机制来维护自己的数据。

LXD是LXC最新发布的重构实现版本,LXD包括三个组件:系统范围的守护进程(xd)、命令行客户端(Ixc)和OpenStack Nova插件(nova-compute-lxd),它的主要特性是:通过简单明了的命令行API提供了高效且便捷的用户体验,类似docker采用基于image镜像的实现,还有更好的完善了热迁移功能。

此外CoreOS在Github上发布了一款容器引擎竞争产品原型Rocket,它是与docker实现原理相似的一种容器引擎,通过它开发者能够将应用和依赖包放在在拥有移植能力的rocket环境中运行,简化搭环境等部署工作。Rocket在其原型的设计时,针对Docker固有的安全功能上存在的各种缺陷进行了改善。

另外,此外还有其他很多基于容器的管理技术,比如Docker可以使用的Kubernets提供的一种机器集群的管理方式对其工作进行辅助。从原理上来看,Kubernets是以调度器形式实现,它能够保证当宿主机崩溃时其中的容器程序的依旧可以维持运行。

现在Microsoft同样要为Docker提供了服务,它们计划为Windows提供一种基于容器的实现方案,同时提供兼容Docker环境的API接口。

目前容器技术的缺陷

容器因与底层os共享内核,而非采用独立的os,无法保证完全的隔离,安全性较低,再者容器实现虚拟化是通过对每个容器配置Cgroups达到资源的隔离,虽然实现简单,但由Cgroup提供的资源限制无法解决进一步的资源竞争,被cgroups限制的进程之间仍然存在很多资源竞争,难以针对实际使用场景进一步的优化,故性能依旧有着很大的提升空间,针对容器的实际运行,可以提供新的解决方案。

容器和虚拟机的另一个差异是:当虚拟机挂起或是关闭时,除了内存中无法保存的临时数据外,文件系统中的文件数据不会发生变化;而停止一个容器,对创建容器镜像的所有状态做的改变都将丢失。这是在通过容器运行时必须认识到的关键变化:容器的生命周期是短暂的,是一次性的。短暂的原因是由于创建一个新容器要依照底层系统创建一个空白的文件系统(rootfs),在容器上产生的所有操作都将体现在其中,但是当容器停止,该rootfs目录下的所有文件作为临时的数据存储会被删除,容器对它进行的操作在容器停止时将消失。

本文主要工作

对LXC进行优化,优化模型要对原LXC平台进行修改:
1、通过运行时动态监控容器的执行状态,实时调节其配置环境,对其使用的资源做到按需分配。
2、从新的角度分别对LXC的隔离性从逻辑上和物理上两个角度出发,优化提升,增强了隔离性。

二、基于容器的虚拟化技术实现原理

容器引擎在实现时能够直接利用Host主机的os,在更低的内核层面依赖内核提供的服务机制实现了资源的隔离,从而令各方面的开销得到降低,具体来说它使用了内核提供的namespaces机制控制各个命名空间的权限和隔离,再由Cgroups的配置实现对物理资源的控制。

namespace用于隔离,Cgroup用于资源分配

namespace机制

容器虚拟化技术所需的隔离性是通过采用由linux内核所提供的namespace机制所实现的,通过将资源划分至不同且特定的namespace中,使的诸如PID.IPC等系统资源不再是全局性的,修改后namespace下的资源均对其他namespace来讲是被隐藏的,由此令使用了不同的namespace的容器进程包含的资源隔离开,在容器中只能看到属于自己的资源,不同容器中的资源即使重名亦不冲突,像是独立的系统一样。

Cgroup机制

Cgroups是自linux内核cpuset中剥离而来,在整合现有各个子系统后,由内核直接提供的一种实现进程分组并对其使用的物理资源进行限制、隔离与记录的机制,它不单是资源统一管理的框架,同样是容器沙箱实现虚拟化的资源管理控制部分的底层基础。不同于传统虚拟化虚拟硬件的实现方式,它是在操作系统级别上进行实现的,故而无法做到底层虚拟机资源的绝对隔离,稳定性同样无法比肩,但却有优良的灵活性,同时在低成本的条件下带来的性能损耗更小。总结一下,Cgroups可以限制、记录、隔离进程组所使用的物理资源,为基于容器的虚拟化的实现提供了基础,更是相关管理工具设计的核心所在。

三、本文优化模型

在这里插入图片描述
左图为传统的LXC架构模型,右图为本文提出的优化模型。

首先通过组的方式取代传统LXC的管理方式,每个容器组是由用户决定,包含一个或多个在功能上有联系的容器。通过组的方式管理容器时,如何将操作对应到具体容器上,这里是由Vpool提供的label来标记容器属性。

虚拟容器池(Vpool)的结构是物理的资源池和运行在其中的容器两个部分组成。在有了分组运行的容器后,最终需要将单个容器绑定到具体的物理资源池中,以Vpool表示一个物理资源池和其中运行的容器,再由Vpool manager进行管理,不同vpool就像不同物理机,相互隔离保持其独立的文件读写等权限。在采用分布式运行的集群中,为宿主机中的运行的程序提供了资源池,相比于管理员手动管理,它能自动平衡容器工作负载同时分配资源,不易出错且令分配更加高效。

调度器在设计时分为两个阶段,即对容器组的调度与内部容器的调度。容器组的调度指的是添加新的容器组后,如何结合容器组的服务配置文件和由Vpool manager提供的Vpool信息,将组内的所有容器绑定到不同的Host宿主机上的Vpool当中启动并运行的过程。单个容器的调度是采用本章介绍的容器资源动态调节组件对运行中的容器进行优化后,若当前环境对容器的运行依旧不利,则进行容器迁移的过程。

容器资源动态调节组件作用是对所有的运行中的容器申请的资源的分配进行扩张或压缩处理。将容器的运行过程分为三个阶段,分别实现对容器进程的创建优化,运行优化,以及释放优化。

对第一三阶段,无论是资源回收还是分配均为模型在后台动态执行,容器中的应用并无感知,通过创建时延迟分配,结合所处Vpool的资源配置信息和容器的label属性,在容器组细分为单个容器并分配后,如果当前系统负载高,资源抢占频繁时,按照管理员提前配置的优先级,后台进程会延缓资源的分配,优先级低的会延时处理。同样,删除时延迟释放为在容器完成工作后删除时,部分资源不会被立即释放,而交由后台优化进程代管,通过延迟统一处理多个释放请求,并在创建时会依据新容器的配置要求进行分配。

在第二阶段,通过配合Vpool中提出的保留类资源空间来设计缓冲区实现,加入缓冲后,在容器运行时可以使用的空间除去硬性分配的外,还有Vpool中的保留空间,可以使得内存需求的突然增大能被可控处理,然后下降至正常水平,在范围内不会直接导致运行中断而出错。同样当自身使用的少时,能把空间让给处在同一Vpool中的其他容器使用。

黄海涛.基于LXC的多系统虚拟化环境研究与实现.2019

一、本文主要工作

本文将运用虚拟化的技术,利用虚拟化带来的隔离性来解决Android上的存在的安全问题,对现有的虚拟化技术与方案进行研究与分析,提出能够在Android系统中实现的多系统虚拟化方案。虚拟化技术可以提供一个与外界隔离的独立空间,将应用置于虚拟系统环境中运行,可以保证其无法破坏到宿主机系统,也无法获取到宿主机的信息,这样就可以有效的防止了恶意程序对于Android系统的威胁,保证用户数据的安全性。

Android移动设备的虚拟化与普通的服务器或者PC相比,面临着许多的问题。首先是受到Android移动设备运行的内存资源的限制。移动设备的运行内存都比较小,当虚拟化多个系统以后,要合理分配这些资源,保障每一个虚拟机都能正常运行。其次,Android移动设备的计算能力比较弱。PC与服务器使用的都是x86指令集,其设计的目标是性能优先。而移动设备的大多数为ARM指令集的处理器,这种架构的的处理器一般功耗会比较低,适合移动设备上使用,但是计算性能相较于x86架构的会弱一些。最后是手机移动设备存在特殊的一些硬件设备如电源,传感器等,虚拟化的时候要解决这些设备的冲突。

(1)设计Android多系统虚拟化方案
对多种虚拟化技术进行研究分析,并且结合移动设备的特殊性,提出基于LXC容器技术的多系统虚拟化方案。这个方案与别的虚拟化实现相比,对内核与系统代码的修改较少,可移植性高,复用了Android内核,降低了虚拟化的开销,性能较好。
(2)实现基于Android多系统的LXC容器环境
通过对LXC进行研究,分析该工具的工作原理,然后通过修改Android内核,移植LXC工具与构造容器,在Android系统中实现多个互相隔离的LXC容器,为Android虚拟机提供了虚拟化的环境。
(3)对Android系统进行虚拟化改造,实现多系统的虚拟化
通过对Android系统中的通信,输入与显示系统的虚拟化改造,解决多系统同时运行时的产生的硬件冲突问题,并且还为系统添加了多系统之间的管理模块,用于管理虚拟机之间的相互切换与硬件设备使用的权限。
(4)对虚拟化方案进行测试与验证
在Android设备中实现本文提出的虚拟化方案,并对该设备进行功能与性能的测试,分析每个测试的结果,验证本方案的可行性,得出方案的优缺点。

二、操作系统级虚拟化

操作系统级虚拟化指的是的是将一个宿主操作系统进行划分,然后产生一个个独立的操作系统空间,正常的一个操作系统拥有一个用户空间实例,经过操作系统虚拟级虚拟化以后,其操作系统内核可以多个用户空间实例同时存在。这些独立的用户空间被称为容器,因此操作系统级虚拟化也被成为容器虚拟化技术,容器与宿主系统共享操作系统内核。通过对宿主系统的划分,每一个空间都有自己的独立的命名空间,进程资源等资源,因此容器中应用程序的实际运行效果与其他的虚拟化技术中在虚拟机中运行应用程序的效果是相同。这种虚拟化方式拥有下面的一些特点;
(1)操作系统级虚拟化所划分出来的容器,是以原来的系统作为模板,可以看成原来系统的副本,而其他虚拟化方案是真实安装的系统,拥有自己独立的内核。
(2)操作系统级虚拟化是对原有的系统进行划分,因此产生的虚拟化系统只能是与宿主系统相同的操作系统,而别的虚拟化技术则可以在一个物理硬件上运行不同的操作系统。
(3)操作系统级虚拟化中每个虚拟机具有强耦合性的特点,可以同时被配置,宿主系统的内核发生变化,则所有的虚拟机都会产生变化,而别的虚拟化技术中,每个虚拟机都是相互独立的,与宿主系统没有联系。
(4)操作系统机虚拟化技术虚拟出来的系统都是虚拟的,复用原来系统中的硬件驱动,性能消耗低,而其他技术都需要在VMM之上运行操作系统,拥有独立的硬件驱动,性能消耗高。

三、LXC容器概述

LXC(Linux container)是一种利用容器技术实现的操作系统级虚拟化技术。

它利用单个Linux内核运行多个隔离的Linux系统(容器),来自于Sourceforge网站上的一个开源项目,与普通的操作系统级的虚拟方案类似,LXC的实现不需要动态翻译操作指令,通过内核提供的功能实现数据的隔离。

LXC工具提供了用户空间的软件包,用于创建和管理容器。提供的常见的工具集如表2.1所示。

在这里插入图片描述
LXC的实现依赖Linux内核中Cgroups与Namespaces特性,而Cgroups与Namespaces这两个内核特性都已经加入到内核主线当中,对于任何的Linux系统,只需要开启相关的内核特性就可以使用LXC的功能。

Cgroup

Cgroups全称Control Groups,即分组控制,它是Linux内核中一种可以限制记录与隔离进程组中的物理资源的机制,该机制将系统中的进程组和它们的子进程划分到一个组中,对整个组进行物理资源使用上限的设定,进而控制组内的所有进程,整个组会按照预先设定好参数进行资源的管理。

每一个Cgroup代表的是一个控制组(control group),以某种标准进行划分的进程组,是Cgroups中资源控制的基本单位,而每一个进程则是Cgroups系统中最小控制单位。整个Cgroup机制由树状结构构成,每个控制组相当于树的一个节点,这样的一个结构成为层级结构(Hierarchy),每个子节点继承父节点中的所有规则,除此之外,Cgroup系统还有子系统的概念(subsystem),这些子系统是对控制组进行控制的控制器,每一个子系统负责控制一种资源,目前支持了对CPU、内存、块设备和网络等资源的控制。

Cgroups系统提供了下面的一些功能:
(1)资源限制。可以为控制组设置某一项资源的使用上限,每个控制组是层级结构中的一个节点,子系统与层级结构以附加的关系进行绑定,通过控制组进行相应的子系统配置,就能实现整个控制组在某个资源上的限制功能。
(2)设定优先级。可以设定层级系统中控制组使用资源的优先级,Cgroups系统会根据优先级与资源控制的配置,对每一个层级系统中的控制组进行资源的调度,优先级高的控制组优先使用层级系统分配的资源。
(3)资源统计。可以对层级结构中不同的控制组所使用的资源进行统计,记录,这里面的资源包括了CPU,内存,块设备资源等。
(4)控制功能。可以对层级系统中控制组中的进程发出暂停命令,让该控制组中的进程处于等待资源的状态,通过恢复命令让进程重新进入运行状态。

Namespace

Namespace特性是Linux内核提供的用于系统全局资源的一种隔离机制,该机制的实质是将Linux中内核资源进行重新分组,使得一组进程看到其中一组资源,另一组进程看到的是另外一组不同的资源。而在LXC容器技术中,多个容器会共享系统的内核资源,而Namespace特性则会将这些全局性的资源如PID,IPC、NET等,分配给某个Namespace,每个Namespace下的资源对于其他的Namespace是不可见的。
在这里插入图片描述

Namespace结构如图2.4所示,图中以进程号资源为例,PID代表的是每一个进程的进程号,Namespace运行在内核之上,将内核中进程号资源分成三个部分,分别为Namespacel,Namespace2与Namespace3。在每个Namespace空间中,可以有用相同的进程号,在全局的内核来看,这些进程号会带上命名空间信息相互是有区别的,而在Namespace空间中看,每个进程号都能获得与其他Namespace空间相同的进程号,通过这种方式,进程号资源被重新分配,每个Namespace空间互相隔离,提供了隔离的运行环境。其他的内核资源也是通过这样的方式实现的。

四、在Android系统上应用LXC

通过前文对LXC的介绍,可知LXC工具依赖的是Linux中特有的内核特性进行工作的。而Android系统的内核是由Linux内核修改的,同样拥有Cgroups与Namespaces这两个内核特性,这使得LXC在Android中运行成为可能。为了将LXC的容器虚拟化技术运用到Android系统中,本文提出了Android虚拟化环境实现的方案,本方案的目的是在Android系统中运行多个LCX容器。

根据操作系统级虚拟化的理论,本文提出的虚拟化环境方案的架构如图3.1所示。

在这里插入图片描述

整个虚拟化架构可以分为三个部分,最上层为虚拟化的容器环境,每个都是一个独立的虚拟化空间。容器所用的硬件和软件资源是互相隔离的,由LXC来统一管理与分配,容器与容器之间互相不可见。所有的容器共用一个Android内核,容器中所有用到的内核调用,都是通过LXC提供的接口往下直接调用内核中原来的实现。因此,可以把每一个容器环境看成独立的Android内核环境。

中间一层是由LXC实现,主要包括了资源隔离与提供内核调用接口两个功能。

资源隔离主要分为两个部分,第一部分是对内存,CPU与硬盘资源的隔离。LXC通过内核中Cgroups特性来对这部分的资源进行调配。第二部分是对每个容器内部的进程所使用到的资源进行分配隔离。LXC主要通过Namespaces的内核特性,给每一个容器分配自己的命名空间来实现这一个功能。容器内部的进程运行在与外部隔绝的命名空间中,达到容器之间进程资源的隔离。

最底层的为Android内核,整个虚拟化系统中实际上只有一个内核在运行。上层的容器通过LXC的接口调用,实际都是使用同一个内核所提供的系统接口。这种方式就是系统级操作系统虚拟化的一大特点,共享系统中的内核大大减少了虚拟化所带来的花销。在整个设计方案中,不需要创造或修改内核中的核心功能,只需要通过LXC的接口调用,就可以在容器环境中提供Android系统运行所必备的内核调用。这三个层次就是整个虚拟化环境的总体结构。

通过上文提出的方案,就能得到各个相互独立的容器环境。在这些容器环境中,启动Android系统,就能实现多系统虚拟化的目的。由于容器的隔离性,Android系统也是互相不可见的,通过这个思路,本文就能实现Android多系统的虚拟化。

LXC工具正常是运行在Linux系统中的,它用到了很多Linux系统中的系统调用来实现它的功能。而Android系统的内核是基于Linux内核进行修改的,与Linux内核相比,它添加了很多硬件相关的驱动设备,优化了一些系统调用,关闭了一些不必要的内核特性。但是本质上,大多数的系统调用是与Linux内核一致的。因此,LXC要在Android内核上运行,只需要把Android内核中的一些相关的内核特性开启,然后对内核进行重新编译就能保证LXC在Android内核中正常运行。通过对LXC进行分析,在Android的内核中运行LXC工具需要开启的内核特性如表3.1所示。
在这里插入图片描述
表3.1所示的的内核特性中主要是Cgroups与Namespcae两方面。其中在Cgroups子系统负责对资源的管理与限制[3),Namespaces负责对进程资源的隔离。确定了需要开启的内核特性以后,需要在编译内核的过程中对这些内核特性进行打开,而这需要对内核进行重新编译。

LXC工具集提供了lxc-create命令对容器进行创建,这个命令是按照Linux容器的标准进行构建的,但是Android系统与Linux系统有所不同,使用该命令在Android系统创造出的容器并不能用,因此,我们需要手动构建出LXC容器。一个LXC容器镜像主要是由两个部分组成,分别是容器的文件系统与容器的配置信息。容器的文件系统需要跟普通的Linux根目录的文件系统相似,
用于构建Android系统的容器文件系统需要具备的文件结构包括
(1)bin目录用于存放Android系统调用的一些接口程序;
(2)system目录用于挂载Android系统中的system分区;
(3)sbin目录用于存放内核调用的接口程序;
(4)lib目录用于存放系统的所有的依赖库;
(5)data目录用于挂载Android系统的data分区;
(6)dev目录用于存放系统的所有外部设备文件的映射。

容器的配置信息主要包含了容器的名字、根目录路径、网络设置、挂载设置和设备设置等信息。在容器的配置信息中,需要将文件系统的bin,lib,dev,sbin目录以绑定挂载的方式,把Android系统中根目录对应的文件挂载到这些目录上,通过这些目录中包含的系统程序,依赖库与设备驱动,就成功把容器构造成一个Android的内核环境。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值