易 帆,曹 源,闾 琳
基于镜像分割技术的虚拟机启动方法研究
易 帆1*,曹 源2,闾 琳3
针对虚拟机在网络应用中部署开销高、存储规模大的问题,通过分析引导系统文件,将传统的虚拟机镜像分割为系统镜像和用户自定义镜像;虚拟化系统在启动的时候,同时读取2个镜像文件,随后采用unionfs进行镜像的融合,最终向用户提供完整的虚拟机操作系统。使用IOZONE软件对原型镜像虚拟机进行性能测试,结果证明:该方法可以显著减少虚拟机镜像的传输时间和系统的存储规模。
虚拟机;融合镜像;虚拟机启动;镜像分割
虚拟机技术和虚拟计算环境是计算机科学近年来最瞩目的成就之一。目前虚拟机的存储与传输载体为虚拟机镜像,通过虚拟机镜像将一定格式的文件作为虚拟机的磁盘存储设备[1]。但一个完整的虚拟机镜像文件会占用大量的磁盘空间,因此传统的部署虚拟机的方法会导致网络开销增大。
对于虚拟机镜像分割技术中虚拟机启动方法的研究在虚拟化领域尚处于新兴阶段,相关的研究成果较少。文献[3]用文件压缩机制对虚拟机镜像模板文件的体积进行优化。在传输前对虚拟机镜像模板文件进行压缩,传输到宿主机后,再解压缩,以减少网络传输量。文献[4]重新设计了虚拟机监控器(VMM)的底层COW虚拟机块设备,从而将大尺寸的虚拟机镜像进行细粒度的分割,并进行按需部署,达到低开销、高效率的效果。但文献[4]主要针对虚拟机在网络节点上的部署,没有实现镜像的完全分割存储,因此无法减少系统镜像的冗余。
本文通过对虚拟机镜像进行分割存储、在启动时进行镜像融合,从而达到减少存储、提高传输的目的。对虚拟机镜像的分割存储是把传统的虚拟机镜像文件分为静态的系统镜像和动态的用户自定义镜像。系统镜像是一个不包含用户个人信息的系统,为只读属性,规模占整个镜像系统的70%~80%;用户自定义镜像是系统的可写部分,用于记录用户使用系统的操作及用户增加的数据等[2]。
本文首先分析通用Linux系统的引导过程,讨论分割镜像的可行性;然后对一个建立在CentOS 5.5操作系统上的原型虚拟机镜像进行分割,并实现了原型多镜像虚拟机的启动;最后测试原型多镜像虚拟机的性能表现。
1.1 Initrd中init文件分析
在每个Linux系统的/boot/目录下,都存在一个或几个initrd-xxx.img文件,这些文件为系统的启动镜像文件,也称为IMG镜像。下面简要分析作为initrd核心的init的脚本代码,以此来说明init的结构和功能。
1 #!/bin/nash
2
3 mount -t proc /proc /proc
……
7 mount -t sysfs /sys /sys
8 echo Creating /dev
……
11 mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
12 mkdir /dev/shm
13 mkdir /dev/mapper
14 echo Creating initial device nodes
15 mknod /dev/null c 1 3
……
42 echo Creating block device nodes.
43 mkblkdevs
44 echo "Loading ehci-hcd.ko module"
45 insmod /lib/ehci-hcd.ko
……
83 echo Waiting for driver initialization.
84 stabilized --hash --interval 1000 /proc/scsi/scsi
85 mkblkdevs
第1部分:第1行,声明使用nash脚本解释器;
第2部分:第3~7行,挂载系统必须的文件系统并供内核使用,如/sys、/proc。这2个目录在initrd中已经存在;
第3部分: 第8~13行,建立设备文件所需的文件系统;
第4部分: 第14~43行,创建系统启动时所需的各种设备文件;
第5部分: 第44~85行,加载必须的模块文件。
1.2 多镜像虚拟机原型实现
本文使用unionfs融合系统镜像和用户自定义镜像,使这2个镜像在系统运行时能协同工作[5]。
上述分析中,将init分为6个部分。在采用了镜像分割技术的原型系统的实现中,可以在第5部分加载unionfs文件系统模块的脚本;然后在第6部分挂载系统镜像以及用户自定义镜像;接着采用unionfs融合系统镜像和用户自定义镜像,完成根目录的挂载;最后由switchroot完成根目录的切换。
根据上述的分析,重点需要关注init脚本的第6部分。
86 echo Scanning and configuring dmraid supported devices
87 echo Scanning logical volumes
88 lvm vgscan --ignorelockingfailure
89 echo Activating logical volumes
90 lvm vgchange -ay --ignorelockingfailure VolGroup00
91 resume /dev/VolGroup00/LogVol01
92 echo Creating root device.
93 mkrootdev -t ext3 -o defaults,ro /dev/VolGroup00/LogVol00
94 echo Mounting root filesystem.
95 mount /sysroot
96 echo Setting up other filesystems.
97 setuproot
98 echo Switching to new root and running init.
99 switchroot
Ⅰ 这一部分增加了对有关逻辑卷设备的支持。因为有些Linux系统采用了逻辑卷设备作为存储设备(比如CentOS);
Ⅱ 创建根设备。经过验证,这一部分与下面一个部分协同工作;创建根设备文件,将它以只读属性、ext3格式挂载到/sysroot目录;/dev/VolGroup00/LogVol00 /sysroot;其中/dev/VolGroup00/LogVol00就是根文件系统所在的逻辑卷设备;
Ⅲ 这里直接挂载/sysroot;因为系统在内核启动的第1阶段的末期,会将根文件系统所在的设备挂载到/sysroot,而后,switchroot会将/sysroot转换为真正的根目录;
Ⅳ Setuproot将当前根目录下的/proc、/sys、/dev等目录的内容迁移到/sysroot目录下,为下一步的根目录转换作准备。这3个目录存在于initrd中,在initrd被加载到内存空间之后,挂载了相应的文件系统,生成了新的内容;
Ⅴ Switchroot负责进行最终的根目录转换,在完成后清空initrd在内存中的内容,并将控制权交给init进程,进入内核启动的第2阶段
在模型系统设计实现时,可以在第Ⅱ部分的地方插入挂载系统镜像和用户自定义镜像的指令,并替换掉原先创建根设备的这部分脚本,然后使用unionfs融合这2个目录。在此使用一些技术方法来进行挂载操作。
1)以只读方式挂载真正的根文件系统所在的设备,即系统镜像。在创建完挂载点之后,使用mount命令进行挂载:
Mkdir /ro
Mount -t ext3 -o defaults,ro /dev/VolGroup00/LogVol00 /ro
其中/ro是挂载点,说明这是一个只读的目录;
图1 融合目录时initrd启动的流程图
2)以可读写的方式挂载用户自定义镜像。为了使脚本更具有可读性,可以创建新的挂载点。这种挂载方法为:
Mkdir /rw
Mount-t ext3-o defaults,rw /dev/sdb1 /rw
其中/dev/sdb1是用户自定义镜像对应的设备名,/rw说明该目录是可读写属性的。
3)采用unionfs对2个目录进行融合。根据unionfs对于分支优先级的约定,最高优先级的分支(挂载时位于最左端)应该具有可读写的属性;因此,融合镜像的命令为:
Mount-t unionfs-o dirs=/rw=rw:/ro=ro /sysroot
到此处为止,关于采用unionfs融合多镜像的操作已经完成,下面将由init进程控制Linux的内核启动;内核的启动将进入第2阶段。特别需要说明的是,此时系统已经处在了设计预期中所要求的环境中,即系统镜像为只读,提供系统必要的文件和配置信息,而新增加的文件和数据将写入到用户自定义镜像中。
经过修改后,系统内核启动的一般流程如图1所示。
本文在安装了Linux CentOS 5.5操作系统的虚拟机上搭建了一个采用多镜像启动的虚拟机原型系统。
2.1 测试环境
读写性能测试使用IOZONE软件,其他的一些硬件及软件环境如表1所示。
表1 实验环境配置
2.2 多镜像虚拟机的读写性能测试
本文不仅对采用了多镜像启动技术的原型多镜像虚拟机系统的读写性能进行测试,同时还与另外2个测试对象(一个是常用的使用一个镜像文件的普通单镜像虚拟机;另一个是普通的多镜像虚拟机,即与普通单镜像虚拟机相比,挂载了额外的镜像的虚拟机系统)的测试结果进行比较,观察原型虚拟机系统读写性能的变化情况。
本文对3个测试对象分别采用命令:Iozone-s 512M-i 0-i 1-i 2-r 4-f {file-path}/iozone。
测试对象的IO读写性能,对命令的各参数解释如下:
-s 512M:表示所测试的文件大小为512 MB。模拟实验中所使用的用户自定义镜像的大小为1 GB,因为如果所使用的文件过大,会导致测试出错。另外,鉴于在使用IOZONE进行测试时的文件大小应为系统内存大小的2倍,所以设置3个测试对象的内存大小都为256 MB;
-i 0:进行写/重写(write/rewrite)模式的测试;
-i 1:进行读/重读(read/re-read)模式的测试;
-i 2:进行随机读/写(random-read/write)模式的测试;
-r 4:设置一次读/写的文件块大小为4 kB;
-f {file-path}/iozone:设置测试文件的路径和名称。对于3个测试对象来说,将测试文件的名称定为iozone;测试文件的路径是很重要的参数,对于原型多镜像虚拟机系统而言,测试文件必将写入到用户自定义镜像之中。对于普通的单镜像模式的虚拟机而言,测试文件必将写入到系统镜像之中。对于普通的多镜像模式的虚拟机,其系统镜像和额外挂载的镜像都是可以写文件的,在此处控制系统写文件的目的磁盘为额外挂载的镜像。
对于每个镜像模式的虚拟机,运行上述的命令,进行5组IOZONE测试;从所得的结果中,选出每个测试模式对应的最优值、最差值及平均值。测试结果如表2所示。
表2 IO性能测试结果 kb/s
通过IO性能测试的平均值比较发现:基于镜像分割技术的原型多镜像虚拟机在测试中的表现普遍优于普通的多镜像虚拟机(在读模式上例外);与普通单镜像的虚拟机的性能接近。在其表现稍差的性能方面,其性能差距也不是非常明显,比如在写模式上比普通单镜像虚拟机差7.7%,在读模式上比普通单镜像虚拟机差5.1%等等。
对于写模式和读模式的测试结果,根据IOZONE的定义,这2个操作是首次进行相应操作时的IO性能的测试结果。在这2个模式下,unionfs在底层系统会进行文件的写时复制和重定位等操作,这必然会在某种程度上使IO性能降低。这就是原型多镜像虚拟机在读写模式测试中性能下降的原因。
对于重写模式和重读模式,因为此时系统中已经包含了相应操作的文件的部分数据,比如文件的元数据和缓存中的一些命中的页,根据测试结果原型多镜像虚拟机的性能稍优。
对于随机读模式和随机写模式,与读/重读模式和写/重新模式的测试结果相比,3种镜像模式的虚拟机的性能下降很快。这说明在随机模式中,其对于数据的定位成为系统的瓶颈。该瓶颈使得unionfs的底层转换对系统IO的性能消耗不明显,测试结果显示原型多镜像虚拟机的性能较优。
通过本次测试,可以证明原型多镜像虚拟机在整体性能上与普通的多镜像虚拟机和普通的单镜像虚拟机相比,占有一定优势。
2.3 网络环境下的多镜像虚拟机测试
本文在网络环境中测试多镜像虚拟机,所使用的普通单镜像虚拟机的镜像大小为10 GB,多镜像虚拟机的系统镜像大小为8 GB,用户自定义镜像的大小为1 GB。
在网络中使用虚拟机,使用时要从服务器端下载虚拟机镜像,使用完后要将虚拟机镜像保存到服务器端,从而将数据存储到服务器端。使用多镜像虚拟机,只有在第一次使用时要将系统镜像和用户自定义镜像下载到客户端机器上;以后每次回传和下载镜像时只需要关注用户自定义镜像。
因此,首次使用时,普通单镜像虚拟机和多镜像虚拟机的网络消耗相同;再次使用虚拟机时,多镜像虚拟机的网络开销将是普通单镜像虚拟机的1/8,明显地减少了虚拟机镜像在网络中的传输延时。
在虚拟化技术的应用方面,本文结合unionfs文件系统,提出了基于镜像分割原理启动的虚拟机系统,并经测试证明该虚拟机与传统的虚拟机相比,有效地提高了性能。
在网络环境中使用多镜像虚拟机提供服务,还具有以下优势:1)与普通的虚拟机相比可以减少系统镜像的传输,明显节省了网络传输时延;2)用户可以根据自己的需求选择自定义镜像的格式和大小,带来了应用的灵活性;3)使系统镜像和用户自定义镜像分离,可以做到即使用户不愿意将自己的个人数据保存到云端,依然可以使用云计算技术所带来的部分优势。
在非网络环境下,虚拟机的多镜像启动技术依然具有可用价值。简单地说,用户可以通过部署系统镜像,携带自定义镜像的方法,来达到异地使用同一系统的目的。
由于本文基于通用Linux引导进程,而不是某一种特定的虚拟机监控器软件,因此本文的方法可以在多种虚拟机监控器软件上面使用,创建多镜像虚拟机,具有良好的平台无关性和可移植性。
[1] LU X C, WANG H M, WANG J.Internet-Based virtual computing environment (iVCE): concepts and architecture[J].Science in China(Series E), 2006,36(10):1081 1099
[2] ROUSSELLE P, TYMANN P, HARIR S, et al.The virtual computing environment[C]// High Performance Distributed Computing. 1994 Proceedings of the 3rd IEEE International Symposium,1994.
[3] 王海斌.动态虚拟集群部署与管理[D]. 长春:吉林大学,2011.
[4] 陈彬.分布环境下虚拟机按需部署关键技术研究[D].长沙:国防科学技术大学,2010.
[5] Unionfs.A stackatle unification file system[EB/OL].[2012-12-29].http://www.fsl.cs.sunysb.edu/project-unifs.html.
StudyofVirtualMachineStartupMethodBasedonImageSplittingMethod
YIFan1*,CAOYuan2,LVLin3
(1. IBM Solution amp; Services(Shenzhen)Co.,Ltd. Chengdu Branch, Chengdu 610041, China;2. School of Computer Science and Engineering, Wuhan University, Wuhan 430072, China;3. Department of Electrical and Electronic Engineering, Chengdu Technological College, Chengdu 610031, China)
Aiming at the large virtual machine image problem, this paper proposes a process that splits a traditional image into a system image and a user-defined image by analyzing the booting system files. When a virtual system startup, it reads files from both images, then merges them by unionfs, finally provides a complete virtual operating system. The performance experiments using IOZONE show that the image method eliminates the system image redundancy, and greatly reduces the image storage.
virtual machine; image-merging; virtual machine startup;image splitting
2013-09-05
易帆(1976- ),男(汉族),四川成都人,工程师,硕士,研究方向:分布式计算、云计算,通信作者邮箱:ysohuf@sohu.com。
曹源(1986- ),男(汉族),甘肃庆阳人,工程师,硕士,研究方向:云计算、计算机系统结构。
(1.国际商业机器科技(深圳)有限公司成都分公司,成都 610041;2.武汉大学 计算机科学与技术学院,武汉 430072;3.成都工业学院 电气与电子工程系,成都 610031)
TP393
A
2095-5383(2013)04-0044-04