易 帆,曹 源,閭 琳
基于鏡像分割技術(shù)的虛擬機啟動方法研究
易 帆1*,曹 源2,閭 琳3
針對虛擬機在網(wǎng)絡(luò)應(yīng)用中部署開銷高、存儲規(guī)模大的問題,通過分析引導(dǎo)系統(tǒng)文件,將傳統(tǒng)的虛擬機鏡像分割為系統(tǒng)鏡像和用戶自定義鏡像;虛擬化系統(tǒng)在啟動的時候,同時讀取2個鏡像文件,隨后采用unionfs進行鏡像的融合,最終向用戶提供完整的虛擬機操作系統(tǒng)。使用IOZONE軟件對原型鏡像虛擬機進行性能測試,結(jié)果證明:該方法可以顯著減少虛擬機鏡像的傳輸時間和系統(tǒng)的存儲規(guī)模。
虛擬機;融合鏡像;虛擬機啟動;鏡像分割
虛擬機技術(shù)和虛擬計算環(huán)境是計算機科學(xué)近年來最矚目的成就之一。目前虛擬機的存儲與傳輸載體為虛擬機鏡像,通過虛擬機鏡像將一定格式的文件作為虛擬機的磁盤存儲設(shè)備[1]。但一個完整的虛擬機鏡像文件會占用大量的磁盤空間,因此傳統(tǒng)的部署虛擬機的方法會導(dǎo)致網(wǎng)絡(luò)開銷增大。
對于虛擬機鏡像分割技術(shù)中虛擬機啟動方法的研究在虛擬化領(lǐng)域尚處于新興階段,相關(guān)的研究成果較少。文獻[3]用文件壓縮機制對虛擬機鏡像模板文件的體積進行優(yōu)化。在傳輸前對虛擬機鏡像模板文件進行壓縮,傳輸?shù)剿拗鳈C后,再解壓縮,以減少網(wǎng)絡(luò)傳輸量。文獻[4]重新設(shè)計了虛擬機監(jiān)控器(VMM)的底層COW虛擬機塊設(shè)備,從而將大尺寸的虛擬機鏡像進行細粒度的分割,并進行按需部署,達到低開銷、高效率的效果。但文獻[4]主要針對虛擬機在網(wǎng)絡(luò)節(jié)點上的部署,沒有實現(xiàn)鏡像的完全分割存儲,因此無法減少系統(tǒng)鏡像的冗余。
本文通過對虛擬機鏡像進行分割存儲、在啟動時進行鏡像融合,從而達到減少存儲、提高傳輸?shù)哪康?。對虛擬機鏡像的分割存儲是把傳統(tǒng)的虛擬機鏡像文件分為靜態(tài)的系統(tǒng)鏡像和動態(tài)的用戶自定義鏡像。系統(tǒng)鏡像是一個不包含用戶個人信息的系統(tǒng),為只讀屬性,規(guī)模占整個鏡像系統(tǒng)的70%~80%;用戶自定義鏡像是系統(tǒng)的可寫部分,用于記錄用戶使用系統(tǒng)的操作及用戶增加的數(shù)據(jù)等[2]。
本文首先分析通用Linux系統(tǒng)的引導(dǎo)過程,討論分割鏡像的可行性;然后對一個建立在CentOS 5.5操作系統(tǒng)上的原型虛擬機鏡像進行分割,并實現(xiàn)了原型多鏡像虛擬機的啟動;最后測試原型多鏡像虛擬機的性能表現(xiàn)。
1.1 Initrd中init文件分析
在每個Linux系統(tǒng)的/boot/目錄下,都存在一個或幾個initrd-xxx.img文件,這些文件為系統(tǒng)的啟動鏡像文件,也稱為IMG鏡像。下面簡要分析作為initrd核心的init的腳本代碼,以此來說明init的結(jié)構(gòu)和功能。
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行,掛載系統(tǒng)必須的文件系統(tǒng)并供內(nèi)核使用,如/sys、/proc。這2個目錄在initrd中已經(jīng)存在;
第3部分: 第8~13行,建立設(shè)備文件所需的文件系統(tǒng);
第4部分: 第14~43行,創(chuàng)建系統(tǒng)啟動時所需的各種設(shè)備文件;
第5部分: 第44~85行,加載必須的模塊文件。
1.2 多鏡像虛擬機原型實現(xiàn)
本文使用unionfs融合系統(tǒng)鏡像和用戶自定義鏡像,使這2個鏡像在系統(tǒng)運行時能協(xié)同工作[5]。
上述分析中,將init分為6個部分。在采用了鏡像分割技術(shù)的原型系統(tǒng)的實現(xiàn)中,可以在第5部分加載unionfs文件系統(tǒng)模塊的腳本;然后在第6部分掛載系統(tǒng)鏡像以及用戶自定義鏡像;接著采用unionfs融合系統(tǒng)鏡像和用戶自定義鏡像,完成根目錄的掛載;最后由switchroot完成根目錄的切換。
根據(jù)上述的分析,重點需要關(guān)注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
Ⅰ 這一部分增加了對有關(guān)邏輯卷設(shè)備的支持。因為有些Linux系統(tǒng)采用了邏輯卷設(shè)備作為存儲設(shè)備(比如CentOS);
Ⅱ 創(chuàng)建根設(shè)備。經(jīng)過驗證,這一部分與下面一個部分協(xié)同工作;創(chuàng)建根設(shè)備文件,將它以只讀屬性、ext3格式掛載到/sysroot目錄;/dev/VolGroup00/LogVol00 /sysroot;其中/dev/VolGroup00/LogVol00就是根文件系統(tǒng)所在的邏輯卷設(shè)備;
Ⅲ 這里直接掛載/sysroot;因為系統(tǒng)在內(nèi)核啟動的第1階段的末期,會將根文件系統(tǒng)所在的設(shè)備掛載到/sysroot,而后,switchroot會將/sysroot轉(zhuǎn)換為真正的根目錄;
Ⅳ Setuproot將當(dāng)前根目錄下的/proc、/sys、/dev等目錄的內(nèi)容遷移到/sysroot目錄下,為下一步的根目錄轉(zhuǎn)換作準(zhǔn)備。這3個目錄存在于initrd中,在initrd被加載到內(nèi)存空間之后,掛載了相應(yīng)的文件系統(tǒng),生成了新的內(nèi)容;
Ⅴ Switchroot負責(zé)進行最終的根目錄轉(zhuǎn)換,在完成后清空initrd在內(nèi)存中的內(nèi)容,并將控制權(quán)交給init進程,進入內(nèi)核啟動的第2階段
在模型系統(tǒng)設(shè)計實現(xiàn)時,可以在第Ⅱ部分的地方插入掛載系統(tǒng)鏡像和用戶自定義鏡像的指令,并替換掉原先創(chuàng)建根設(shè)備的這部分腳本,然后使用unionfs融合這2個目錄。在此使用一些技術(shù)方法來進行掛載操作。
1)以只讀方式掛載真正的根文件系統(tǒng)所在的設(shè)備,即系統(tǒng)鏡像。在創(chuàng)建完掛載點之后,使用mount命令進行掛載:
Mkdir /ro
Mount -t ext3 -o defaults,ro /dev/VolGroup00/LogVol00 /ro
其中/ro是掛載點,說明這是一個只讀的目錄;
圖1 融合目錄時initrd啟動的流程圖
2)以可讀寫的方式掛載用戶自定義鏡像。為了使腳本更具有可讀性,可以創(chuàng)建新的掛載點。這種掛載方法為:
Mkdir /rw
Mount-t ext3-o defaults,rw /dev/sdb1 /rw
其中/dev/sdb1是用戶自定義鏡像對應(yīng)的設(shè)備名,/rw說明該目錄是可讀寫屬性的。
3)采用unionfs對2個目錄進行融合。根據(jù)unionfs對于分支優(yōu)先級的約定,最高優(yōu)先級的分支(掛載時位于最左端)應(yīng)該具有可讀寫的屬性;因此,融合鏡像的命令為:
Mount-t unionfs-o dirs=/rw=rw:/ro=ro /sysroot
到此處為止,關(guān)于采用unionfs融合多鏡像的操作已經(jīng)完成,下面將由init進程控制Linux的內(nèi)核啟動;內(nèi)核的啟動將進入第2階段。特別需要說明的是,此時系統(tǒng)已經(jīng)處在了設(shè)計預(yù)期中所要求的環(huán)境中,即系統(tǒng)鏡像為只讀,提供系統(tǒng)必要的文件和配置信息,而新增加的文件和數(shù)據(jù)將寫入到用戶自定義鏡像中。
經(jīng)過修改后,系統(tǒng)內(nèi)核啟動的一般流程如圖1所示。
本文在安裝了Linux CentOS 5.5操作系統(tǒng)的虛擬機上搭建了一個采用多鏡像啟動的虛擬機原型系統(tǒng)。
2.1 測試環(huán)境
讀寫性能測試使用IOZONE軟件,其他的一些硬件及軟件環(huán)境如表1所示。
表1 實驗環(huán)境配置
2.2 多鏡像虛擬機的讀寫性能測試
本文不僅對采用了多鏡像啟動技術(shù)的原型多鏡像虛擬機系統(tǒng)的讀寫性能進行測試,同時還與另外2個測試對象(一個是常用的使用一個鏡像文件的普通單鏡像虛擬機;另一個是普通的多鏡像虛擬機,即與普通單鏡像虛擬機相比,掛載了額外的鏡像的虛擬機系統(tǒng))的測試結(jié)果進行比較,觀察原型虛擬機系統(tǒng)讀寫性能的變化情況。
本文對3個測試對象分別采用命令:Iozone-s 512M-i 0-i 1-i 2-r 4-f {file-path}/iozone。
測試對象的IO讀寫性能,對命令的各參數(shù)解釋如下:
-s 512M:表示所測試的文件大小為512 MB。模擬實驗中所使用的用戶自定義鏡像的大小為1 GB,因為如果所使用的文件過大,會導(dǎo)致測試出錯。另外,鑒于在使用IOZONE進行測試時的文件大小應(yīng)為系統(tǒng)內(nèi)存大小的2倍,所以設(shè)置3個測試對象的內(nèi)存大小都為256 MB;
-i 0:進行寫/重寫(write/rewrite)模式的測試;
-i 1:進行讀/重讀(read/re-read)模式的測試;
-i 2:進行隨機讀/寫(random-read/write)模式的測試;
-r 4:設(shè)置一次讀/寫的文件塊大小為4 kB;
-f {file-path}/iozone:設(shè)置測試文件的路徑和名稱。對于3個測試對象來說,將測試文件的名稱定為iozone;測試文件的路徑是很重要的參數(shù),對于原型多鏡像虛擬機系統(tǒng)而言,測試文件必將寫入到用戶自定義鏡像之中。對于普通的單鏡像模式的虛擬機而言,測試文件必將寫入到系統(tǒng)鏡像之中。對于普通的多鏡像模式的虛擬機,其系統(tǒng)鏡像和額外掛載的鏡像都是可以寫文件的,在此處控制系統(tǒng)寫文件的目的磁盤為額外掛載的鏡像。
對于每個鏡像模式的虛擬機,運行上述的命令,進行5組IOZONE測試;從所得的結(jié)果中,選出每個測試模式對應(yīng)的最優(yōu)值、最差值及平均值。測試結(jié)果如表2所示。
表2 IO性能測試結(jié)果 kb/s
通過IO性能測試的平均值比較發(fā)現(xiàn):基于鏡像分割技術(shù)的原型多鏡像虛擬機在測試中的表現(xiàn)普遍優(yōu)于普通的多鏡像虛擬機(在讀模式上例外);與普通單鏡像的虛擬機的性能接近。在其表現(xiàn)稍差的性能方面,其性能差距也不是非常明顯,比如在寫模式上比普通單鏡像虛擬機差7.7%,在讀模式上比普通單鏡像虛擬機差5.1%等等。
對于寫模式和讀模式的測試結(jié)果,根據(jù)IOZONE的定義,這2個操作是首次進行相應(yīng)操作時的IO性能的測試結(jié)果。在這2個模式下,unionfs在底層系統(tǒng)會進行文件的寫時復(fù)制和重定位等操作,這必然會在某種程度上使IO性能降低。這就是原型多鏡像虛擬機在讀寫模式測試中性能下降的原因。
對于重寫模式和重讀模式,因為此時系統(tǒng)中已經(jīng)包含了相應(yīng)操作的文件的部分?jǐn)?shù)據(jù),比如文件的元數(shù)據(jù)和緩存中的一些命中的頁,根據(jù)測試結(jié)果原型多鏡像虛擬機的性能稍優(yōu)。
對于隨機讀模式和隨機寫模式,與讀/重讀模式和寫/重新模式的測試結(jié)果相比,3種鏡像模式的虛擬機的性能下降很快。這說明在隨機模式中,其對于數(shù)據(jù)的定位成為系統(tǒng)的瓶頸。該瓶頸使得unionfs的底層轉(zhuǎn)換對系統(tǒng)IO的性能消耗不明顯,測試結(jié)果顯示原型多鏡像虛擬機的性能較優(yōu)。
通過本次測試,可以證明原型多鏡像虛擬機在整體性能上與普通的多鏡像虛擬機和普通的單鏡像虛擬機相比,占有一定優(yōu)勢。
2.3 網(wǎng)絡(luò)環(huán)境下的多鏡像虛擬機測試
本文在網(wǎng)絡(luò)環(huán)境中測試多鏡像虛擬機,所使用的普通單鏡像虛擬機的鏡像大小為10 GB,多鏡像虛擬機的系統(tǒng)鏡像大小為8 GB,用戶自定義鏡像的大小為1 GB。
在網(wǎng)絡(luò)中使用虛擬機,使用時要從服務(wù)器端下載虛擬機鏡像,使用完后要將虛擬機鏡像保存到服務(wù)器端,從而將數(shù)據(jù)存儲到服務(wù)器端。使用多鏡像虛擬機,只有在第一次使用時要將系統(tǒng)鏡像和用戶自定義鏡像下載到客戶端機器上;以后每次回傳和下載鏡像時只需要關(guān)注用戶自定義鏡像。
因此,首次使用時,普通單鏡像虛擬機和多鏡像虛擬機的網(wǎng)絡(luò)消耗相同;再次使用虛擬機時,多鏡像虛擬機的網(wǎng)絡(luò)開銷將是普通單鏡像虛擬機的1/8,明顯地減少了虛擬機鏡像在網(wǎng)絡(luò)中的傳輸延時。
在虛擬化技術(shù)的應(yīng)用方面,本文結(jié)合unionfs文件系統(tǒng),提出了基于鏡像分割原理啟動的虛擬機系統(tǒng),并經(jīng)測試證明該虛擬機與傳統(tǒng)的虛擬機相比,有效地提高了性能。
在網(wǎng)絡(luò)環(huán)境中使用多鏡像虛擬機提供服務(wù),還具有以下優(yōu)勢:1)與普通的虛擬機相比可以減少系統(tǒng)鏡像的傳輸,明顯節(jié)省了網(wǎng)絡(luò)傳輸時延;2)用戶可以根據(jù)自己的需求選擇自定義鏡像的格式和大小,帶來了應(yīng)用的靈活性;3)使系統(tǒng)鏡像和用戶自定義鏡像分離,可以做到即使用戶不愿意將自己的個人數(shù)據(jù)保存到云端,依然可以使用云計算技術(shù)所帶來的部分優(yōu)勢。
在非網(wǎng)絡(luò)環(huán)境下,虛擬機的多鏡像啟動技術(shù)依然具有可用價值。簡單地說,用戶可以通過部署系統(tǒng)鏡像,攜帶自定義鏡像的方法,來達到異地使用同一系統(tǒng)的目的。
由于本文基于通用Linux引導(dǎo)進程,而不是某一種特定的虛擬機監(jiān)控器軟件,因此本文的方法可以在多種虛擬機監(jiān)控器軟件上面使用,創(chuàng)建多鏡像虛擬機,具有良好的平臺無關(guān)性和可移植性。
[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] 王海斌.動態(tài)虛擬集群部署與管理[D]. 長春:吉林大學(xué),2011.
[4] 陳彬.分布環(huán)境下虛擬機按需部署關(guān)鍵技術(shù)研究[D].長沙:國防科學(xué)技術(shù)大學(xué),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- ),男(漢族),甘肅慶陽人,工程師,碩士,研究方向:云計算、計算機系統(tǒng)結(jié)構(gòu)。
(1.國際商業(yè)機器科技(深圳)有限公司成都分公司,成都 610041;2.武漢大學(xué) 計算機科學(xué)與技術(shù)學(xué)院,武漢 430072;3.成都工業(yè)學(xué)院 電氣與電子工程系,成都 610031)
TP393
A
2095-5383(2013)04-0044-04