基于LXC的Android系统虚拟化技术①
2018-01-08谷德贺顾乃杰刘博文苏俊杰贺爱香
谷德贺,顾乃杰,刘博文,苏俊杰,贺爱香
1(中国科学技术大学 计算机科学技术学院,合肥 230027)
2(中国科学技术大学 安徽省计算与通信软件重点实验室,合肥 230027)
3(中国科学技术大学 先进技术研究院,合肥 230027)
4(安徽新华学院 信息工程学院,合肥 230088)
基于LXC的Android系统虚拟化技术①
谷德贺1,2,3,顾乃杰1,2,3,刘博文1,2,3,苏俊杰1,2,3,贺爱香1,4
1(中国科学技术大学 计算机科学技术学院,合肥 230027)
2(中国科学技术大学 安徽省计算与通信软件重点实验室,合肥 230027)
3(中国科学技术大学 先进技术研究院,合肥 230027)
4(安徽新华学院 信息工程学院,合肥 230088)
虚拟化技术的研究正逐渐从高性能服务器端转向移动智能设备领域. 现有的虚拟化方案多是采用多内核方案,系统负载高,效率低. 针对车载系统等平台多屏显示以及资源受限等问题,本文提出一种基于容器技术的Android轻量级虚拟化方案. 该方案通过利用Namespace资源隔离机制和Cgroup资源分配机制,使得ARM平台在资源使用较少的同时,能够同时启动多个Android虚拟机,并且各虚拟机上的屏幕显示相互独立. 测试结果表明,该方案的内存占用率较双系统方案降低了7%,而平均CPU使用率较原生Android系统仅增加了1%.
虚拟化技术; 资源隔离; 资源分配; ARM 平台; 虚拟机
近年来云计算[1]的快速发展,虚拟化技术[2]被广泛应用于高性能服务器,以提高系统资源的利用率. 同时,随着智能手机等移动终端的普及[3],智能终端扮演着越来越重要的角色,用户对视频、微信、新闻浏览等功能的使用开始从PC转移至移动终端. 由于生活和工作等场景的多样化,用户不得不携带多个终端设备以满足不同应用场景的需要,例如车载系统上司机和乘客同时对导航以及娱乐系统的需求. 与此同时,面对恶意广告、病毒以及隐私信息泄露[4-6]等问题,更多的用户开始关注移动平台[7]的隐私安全性问题.
通过虚拟机机制[8],将多个独立且隔离的智能手机软件实例运行在同一个ARM硬件上,可以有效解决Android设备的安全风险. 现有的虚拟化方法都对用户层和内核层做了大量地修改,如哥伦比亚大学提出的Cells模型[9]; 或利用ARM平台的Hypervisor模式[10],如KVM/ARM架构[11]; 或设计完整的微内核模式,如OKL4的微内核模型[12],将宿主系统和客户机系统隔离运行. 这些方案对于高性能服务器可能有效,但应用于智能手机主要有两个问题. 其一,智能手机资源的受限,运行整个额外的操作系统以及用户空间环境,将带来很大的系统开销,导致系统响应速度过慢; 其二,部分方法对内核层进行大量地修改,导致宿主系统和客户机系统很难升级和扩展,对于频繁的Android更新,这将带来很大的工作量.
LXC[13]即 Linux Container,是利用 Linux 内核容器特性为用户提供空间接口的开源工具,其通过强大的API和简单的工具,可以让用户轻松创建和管理系统或者应用程序容器. LXC利用内核支持的资源隔离以及控制机制,通过对容器的配置,使用lxc-start等工具对容器进行控制,可以快速部署,且具有更小的虚拟化开销等优点.
针对移动设备资源的受限,以及车载系统对于多屏显示的需求,本文利用LXC开源工具提出一种Android系统轻量级虚拟化多屏显示方案. 本方案是一种系统级虚拟化方案,通过利用Linux内核支持的虚拟化特性,在对内核尽可能少的修改前提下,将多个系统独立的运行在同一个ARM平台上且拥有不同的显示屏幕. 本方案中多个系统共用同一个内核,其所带来的系统负载小,即使在性能较差的平台也不会影响用户体验,且具有容易部署和可扩展性强等优势.
1 知识背景与相关工作
现有的移动虚拟化技术主要从以下几个方面来隔离宿主系统,分别为操作系统级虚拟化方案、基于Hypervisor监管程序方案[14]和基于微内核方案[14].
1.1 基于操作系统级方案
操作系统级虚拟化将系统的命名空间划分为不同的虚拟机. 虚拟机之间共享唯一的系统内核以及主机环境,每个虚拟机只保存本地环境的状态,本文也是采用此解决方案. Cells[9]是哥伦比亚大学提出的基于操作系统级虚拟化的解决方案. Cells引入了一种前端虚拟手机(VP)和多个后台虚拟手机的使用模型,使多个VP可以互不干扰、独立运行; 且基于Namespace思路提出一种新的Device命名空间机制,使不同设备具有不同的访问权限,例如不可访问、共享访问以及互斥访问,使手机硬件得到很好的复用和隔离. 但Cells对Linux内核层做了大量的修改,使得其不可能并入Linux主线中. 不同的是,本文在未对内核层做大量地修改的情况下,同样完成了系统需求.
1.2 基于Hypervisor方案
KVM/ARM[11]是一个基于ARM平台Hypervisor模型的完整系统虚拟化解决方案. KVM/ARM与其他虚拟化方案最大的区别在于大多数VMM都实现主要的服务,例如调度器、内存管理以及时钟等. KVM利用现有 Linux Kernel的功能,以及硬件支持,使得虚拟技术的系统性能负载很小.
KVM/ARM引入一种技术,使其可以在CPU不同特权模式下运行. 通过该技术利用ARM硬件虚拟化支持进入监管模式,在统一时间内利用内核模式运行现有的Linux内核服务. 该方案中不同系统使用各自的内核,且上下文切换带来的系统消耗较多,不适用资源受限的移动设备.
1.3 基于微内核方案
微内核[15]采用最小化原则,在保证能够实现全部功能的前提下使内核尽量的小. OKL4[12]是从Open Kernel Labs出现的一种基于微内核的虚拟化技术.OKL4通过构建一种简单的内核,提供比Hypervisor监管程序的更高效率,而且设计的微内核具有一定的通用性,可以在多平台以及多系统上构建. 通过vCPUs、vMMU、vIRQs以及TLB相应的硬件支持,微内核足够小,并可以正确的支持所有功能. 使得通过OKL4的系统负载足够小. 但因为其需要设备支持以及仿真支持,对于目前日益多元化的移动设备来说,是一个繁重的硬件设备要求,也增加了硬件的成本.
2 ARM平台移动虚拟化的设计方案
针对车载系统等平台多屏显示以及资源受限等问题,本文提出一种轻量级虚拟化方案. 该方案主要包括系统的总体架构以及多屏显示方案.
2.1 系统架构
利用Linux内核中Namespace的资源隔离机制和Cgroup[16]的资源控制机制,以及轻量级容器工具LXC的特性,本文采用操作系统级虚拟化解决方案. 通过LXC工具对容器系统进行管理以及操作,利用内核机制的支持,LXC工具小且功能完善等优势,完成多系统虚拟化的需求.
命名空间将LXC启动的进程隔离放入独立的命名空间中,通过Android init进程初始化Android系统,形成独立的一组进程视图. 同时Cgroup机制负责不同系统的资源的配置,分配CPU节点和Memory节点,以及监控容器空间内系统的运行状况. 这样在容器空间内的进程只能感受到当前容器的状况.
Cgroups可以为不同用户层面的资源管理,提供一个统一化的接口. 从单个进程的资源控制到操作系统层面,Cgroup 主要提供三个主要功能: 1) 资源限制:Cgroup可以对进程组使用的资源总额进行限制; 2) 优先级分配: 通过分配CPU时间片数量及硬盘IO带宽大小,实际上就相当于控制进程的优先级; 3) 资源统计: Cgroup可以统计系统的资源使用量,如CPU使用时长、内存使用量等. 本文的架构如图1所示.
图1 系统架构图
基于宿主机以及Android系统的特性,底层硬件共享同一个CPU、Memory、GPU等设备,但不同系统拥有不同的显示设备以及输入输出设备,多个系统间共享同一个Linux内核,需要针对不同的显示以及输入输出设备作设备,设计隔离以及复用方案,而GPU与CPU不同,其本身具有隔离性,不同应用程序均持有独立的显示上下文信息,不需要进行单独的处理. 在宿主机中配置LXC工具,通过LXC工具就可以同时启动不同的系统.
本方案采用LXC作为容器虚拟化工具,通过利用内核中命名空间的隔离机制和进程资源控制组对资源进行划分,使得宿主系统与不同客户机系统能够隔离,相互不影响,并且流畅地运行. 该方案使得单个硬件设备即可运行多个虚拟系统,每个系统运行标准的Andoird环境,每个Android系统运行着未修改的Android应用程序. 每个虚拟系统完全隔离,不能检查,篡改或者访问任何其他的虚拟机.
每个虚拟系统可以被创建和配置通过PC机下载到开发板. 虚拟机系统可以被用户删除,但是其配置权限是通过密码保护的,只能拥有权限的用户才能在PC 机上改变. 例如,对于管理员可以创建虚拟机,下载或使其从设备上移除,但普通用户不能重新配置,这对于虚拟机系统来说有很好的安全保障.
2.2 Android显示框架设计
由于本文中所使用的硬件平台是共享单个CPU、GPU以及内存设备,但拥有两块不同的显示屏幕,因此对多个系统同时显示在不同屏幕上单独设计方案.
Android采用分层的架构设计,将系统分为四层:应用层,应用程序框架层,运行库存,Linux 内核层.Android对Linux内核驱动程序进行封装,提出硬件抽象层,Android的显示系统硬件抽象层提供的是Gralloc,分别负责对framebuffer以及帧缓冲区的分配和释放.Linux内核驱动层提供了FrameBuffer显示驱动程序,其设备驱动程序的设备文件通常放在/dev/graphics/fb0或者是/dev/fb0.
利用不同显示设备在系统中存在不同的设备节点,以及宿主Linux和客户机Android系统的特性,提出双屏显示方案. 其架构如图2. 对于宿主Linux系统使用QT交互界面默认使用/dev/fb0对应的屏幕设备,Android客户机系统通过LXC容器启动,将Android的显示画面输出到fb1对应的屏幕中,从而实现双屏同时显示Qt Linux系统与Android系统画面.
在Linux中,FB的使用模式是通过两种的访问类型: mmap和标准的ioctl操作. 不同虚拟机对底层不同的FrameBuffer驱动进行映射,同时底层FrameBuffer的驱动在内存分配上也是相互隔离的. 这样就使得不同系统的访问流相互隔离,从而达到显示隔离的效果.最后GPU将渲染的数据直接写入对应的buffer中,与CPU处理的内存并不同,GPU是直接对FrameBuffer进行操作,与CPU处理的数据是相互独立的. 相较于在Android的服务层做修改,本方案不会改变Android的通用接口,使得实现方案更加具有通用性. 同时本方案将Android系统应用程序的数据直接显示在fb1上,使得多系统显示数据得到很好的隔离. 并且不同系统均可以正常显示,相互之间没有影响.
图2 双屏显示方案
3 实现细节
为了实现当前的设计方案,需要完成以下工作:
(1) 对 Linux kernel进行定制,开启 Namespace 机制和Cgroup机制在内核中的选项. 使用指定的交叉编译工具,移植LXC工具到宿主系统中.
(2) 制作Android容器文件系统,使得LXC可以启动客户机系统.
(3) 完成Android系统对显示的需要,对不同系统显示进行隔离.
3.1 LXC移植
使用LXC的工具的前提是Linux内核支持Namespace机制和Cgroup机制,虽然现在Namespace和Cgroup加入到内核中,但是其默认功能是没有开启的.需要手动打开Kernel对应的选项,并重新编译内核,目前使用的Kernel版本是3.4.35.
由于使用定制的ARM平台交叉工具,所以编译过程会和普通GCC编译不同,需要的依赖项也不同. 为了提高通用性,在脚本中加入对各个平台依赖的判断.这里使用的编译工具是armv6-gcc,为了使LXC工具正常编译,系统需要安装automake等工具,提前编译libcap库. 但为了并对LXC源码进行了修改,其主要修改的内容有:
(1) 与 Android 系统不兼容部分,例如 setenv,share,tmpfile 等函数,在 Linux 平台与 Android 平台中,其基础函数库参数以及实现方式不同,从而影响LXC正常执行.
(2) 无法正常编译的问题,例如部分宏出现未定义问题,需要增加相应的头文件.
(3) 相关逻辑的修改,使得可以启动Android容器,且不需要修改通用的API接口.
执行make以及make install,将交叉编译好的LXC工具移植到ARM平台的机器中,通过使用LXC工具集中的lxc-checkconfig来检测kernel选项是否打开以及其他功能是否运行正常. 并且可以通过尝试创建一些模板容器,检查LXC是否可以正常运行.
3.2 容器文件系统制作
根据LXC容器创建过程以及Android系统启动分析,由于存储容量有限,且原生的Anroid文件系统需相应的修改,才可以在Linux Container中正常的运行.
宿主机系统采用普通的嵌入式Linux系统,则为了启动Android客户机系统,使用LXC启动命令(lxcstart)将客户机系统顺利启动,需要在Linux系统中创建容器系统. 在LXC工具指定的路径建立容器的名称,不同的客户机的文件目录是相互隔离的. 同时也可以通过设置共享相应的客户机的库文件等. 不同的目录对应不同的客户机系统,这样运行时不同的客户机系统之间无法感知其他系统的文件系统.
主要的文件目录如图3,对于宿主机系统都有其容器名,其中rootfs为其Android客户机系统的目录文件. 其目录下包含Android系统启动必须的文件,修改原Android系统的init.rc文件,关闭不必要的服务,修改其创建的设备节点用来与宿主系统隔离和复用,修改挂载的文件系统,复用宿主系统的文件,提升低端设备的扩展性,以及隔离需要隔离的文件目录. 通过自动化脚本配置容器信息,提升容器配置的通用性.
3.3 双屏显示
由于本文中ARM平台的硬件设备是一个CPU,Memory但是拥有两个屏幕硬件设备,在Linux中每个应用程序通过mmap系统调用,将显存映射到应用程序对应进程的虚拟地址空间中,可以直接将所需要显示的内容直接写入内存空间,通过实现一系列文件操作接口,使得应用程序可以直接操作字符设备,最终LCD控制器自动将显存中的内容显示在屏幕设备中.
图3 Android 容器目录文件结构
Android系统在设计之初只考虑单屏的存在,因此对于移动设备来说,因为只存在一个屏幕,在字符设备节点中默认只有/dev/fb0或者/dev/graphics/fb0存在. 对于 Android 应用程序,通过 SurfaceFlinger服务,调用libgl库进行图像处理,将显示数据交给硬件逻辑层Gralloc,最终底层FrameBuffer驱动以及GPU驱动将需要显示的内容刷新在显示设备中. Gralloc对于复杂的显示驱动,保证Android上层应用显示接口不变. 因此选择对Android硬件抽象层Gralloc中作出相应的修改,实现Android客户机系统可以正常显示在第二块屏幕上.
通过对Android系统的源码分析,用户空间使用FrameBuffer设备,首先通过load加载Gralloc模块.从Gralloc层打开fb设备的流程可知,在保证Android显示正常,只需要对Gralloc模块加载的fb设备作出相应的修改就可以实现双屏显示的方案,因此在该硬件抽象层加入相应的逻辑修改,其主要工作为:
(1) 将Gralloc模块关于打开fb0设备的逻辑做相应的修改,使得加载Gralloc模块时将不是默认打开fb0设备,使得Android设备可以在fb1对应的显示屏能够正常显示.
(2) 拒绝容器打开的客户机系统对Linux中对应fb0的字符设备节点打开的权限,使得从客户机系统角度来看也只有一个显示设备节点存在.
(3) 在LXC启动容器的流程中,加入对fb1设备加载的逻辑. 考虑到fb1设备一直打开,损失移动设备的电量,在lxc-start的启动流程中加入对fb1设备加载的相应逻辑,达到节约能耗的目的.
4 系统成果以及功能测试
实验测试环境是在ARM平台车载系统开发板上,使用 Linux kernel 3.4.35 版本,Android 对应 4.2.2 版本,基于LXC1.0.7的虚拟化解决方案,其硬件实验环境为:双核 ARM Cortex A7、1GB DRAM、8GB eMMC. 因其平台硬件资源有限,只启动双系统进行测试.
4.1 功能测试
通过烧制系统集成Image,打开电源开关,宿主Linux系统和客户机Android系统同时启动,宿主系统显示其开机Logo,Android系统在另一个显示器显示“ANDROID”字样,代表两个系统通过宿主系统的命令启动成功; Android系统通过LXC工具正常启动,且通过两个屏幕分别显示不同系统界面,互相隔离相互不影响,表明双屏显示方案正常; 且通过45项系统以及硬件功能的Sanity Test测试.
同时通过多次的开关机重启,双系统同时画面几乎同时启动且正常显示,表示其功能正常且稳定. 且鼠标,键盘输出输出设备不会在Android系统中响应,只能点击和响应QT的界面,同时对于Android系统使用自带的触摸屏去触摸点击,可以正常交互和显示.
4.2 性能测试
通过读取/proc/meminfo信息统计不同系统情况下,内存的使用的情况,在开机30分钟稳定后得到的数据情况如图4.
图4 内存使用情况
我们根据2016年Google热门app榜单,选取社交类、影音类、游戏类三类,分别测试微信、音乐播放器、部落冲突,代表不同的应用场景,将虚拟化后的CPU使用率与原生Android的CPU使用率进行对比,得到10秒的时间内的增长率,详情如表1所示.
从表中可以看出,不同种类的应用的CPU使用率的增长情况不同,但总体情况类似. 相比较来说可以看出原生的Android系统在启动APP时的速度较快一些,不过两者的CPU使用率相差不大,在实际使用的场景下基本感受不到两者的差距. 根据三种应用的使用率情况看,其虚拟化后的Android系统的平均CPU使用率仅比原生系统高1%,性能与原生系统较相近.
表1 三类 app 的 CPU 利用率变化
5 结束语
针对车载系统等平台多屏显示的需求,本文提出一种基于容器技术Android轻量级虚拟化方案. 相较于传统多核虚拟化方案,本方案只需要单个内核即可支持多个Android容器,具有更低的资源开销和更高的性能. 从而实现用户对不同场景以及隐私信息安全的需求. 测试结果表明: 在ARM 平台上,该方案的内存占用率较双系统方案降低了7%,而平均CPU使用率较原生Android系统仅增加了1%. 但是本文所提出的双屏显示方案还不够完善,对不同输入输出设备的隔离和复用采取不同的策略,下一步的将围绕隔离以及复用框架的通用性展开进一步工作.
1Armbrust M,Fox A,Griffith R,et al. A view of cloud computing. Communications of the ACM,2010,53(4): 50–58. [doi:10.1145/1721654]
2陈全,邓倩妮. 云计算及其关键技术. 计算机应用,2009,29(9): 2562–2567.
3TrendForce: 2015年全球智能手机出货12.93亿部,华为跃升全球第三并突破一亿部. http://press.trendforce.cn/press/20160114-2266.html. [2016-01-14].
4Enck W,Ongtang M,McDaniel P. Understanding android security. IEEE Security & Privacy,2009,7(1): 50–57.
5杨健,汪海航,王剑,等. 云计算安全问题研究综述. 小型微型计算机系统,2012,33(3): 472–479.
6蒋绍林,王金双,张涛,等. Android 安全研究综述. 计算机应用与软件,2012,29(10): 205–210.
7Android Platform. https://developer.android.com/about/android.html.
8Aguiar A,Hessel F. Current techniques and future trends in embedded system’s virtualization. Software: Practice and Experience,2012,42(7): 917–944. [doi: 10.1002/spe.v42.7]
9Andrus J,Dall C,van’t Hof A,et al. Cells: A virtual mobile smartphone architecture. Proc. of the Twenty-Third ACM Symposium on Operating Systems Principles. Cascais,Portugal. 2011. 173–187.
10Uhlig R,Neiger G,Rodgers D,et al. Intel virtualization technology. Computer,2005,38(5): 48–56. [doi: 10.1109/MC.2005.163]
11Varanasi P. Implementing Hardware-supported virtualization in OKL4 on ARM[Ph. D. thesis]. New South Wales: University of New South Wales,2010.
12Kivity A,Kamay Y,Laor D,et al. kvm: the Linux virtual machine monitor. Proc. of the Linux Symposium. 2007.225–230.
13LXC-Linux Containers. https://linuxcontainers.org/,2014.
14Chen XY. Smartphone virtualization: Status and challenges.2011 International Conference on Electronics,Communications and Control (ICECC). Ningbo,China. 2011. 2834–2839.
15毛德操,胡希明. Linux 内核源代码情景分析 (上册). 杭州:浙江大学出版社,2001.
16Rosen R. Linux containers and the future cloud. Linux Journal,2014,2014(240): 3.
Virtualization Technology of Android System Based on LXC
GU De-He1,2,3,GU Nai-Jie1,2,3,LIU Bo-Wen1,2,3,SU Jun-Jie1,2,3,HE Ai-Xiang1,4
1(School of Computer Science and Technology,University of Science and Technology of China,Hefei 230027,China)
2(Anhui Province Key Laboratory of Computing and Communication Software,University of Science and Technology of China,Hefei 230027,China)
3(Institute of Advanced Technology,University of Science and Technology of China,Hefei 230027,China)
4(Institute of Information Engineering,Anhui XinHua University,Hefei 230088,China)
The virtualization technology research is gradually moving from high-performance server to mobile intelligent devices. Existing virtualization solutions are mostly multi-core solution with high system overhead and low efficiency.This paper presents a lightweight virtualization scheme based on Linux container for multi-screen display and resource limitation of vehicle system. Our program,through the use of Namespace resource isolation mechanism and Cgroup resource control mechanism,can start several Android virtual machines on the ARM platform at the same time,while displaying on different screens and running independently. The performance test results show that on the ARM platform,the program uses less than 7% of the memory of the two systems,and the average CPU usage after virtualization is only 1% higher than the native Android system.
virtualization technology; resource isolation; resource control; ARM platform; virtual machine
谷德贺,顾乃杰,刘博文,苏俊杰,贺爱香.基于 LXC 的 Android 系统虚拟化技术.计算机系统应用,2017,26(12):58–63. http://www.c-sa.org.cn/1003-3254/6110.html
安徽省自然科学基金(1408085MKL06); 高等学校学科创新引智计划项目(B07033)
2017-03-15; 修改时间: 2017-03-31; 采用时间: 2017-04-07