本發(fā)明屬于計算機虛擬技術(shù)領(lǐng)域,具體涉及Xen虛擬機Fork機制建立方法。
背景技術(shù):
Xen是一個開放源代碼的虛擬機監(jiān)視器,在Xen上運行的虛擬機稱為Domain(域),在Xen上的眾多Domain中存在一個特權(quán)域用來輔助Xen管理其他Domain,提供相應(yīng)的虛擬資源服務(wù),特別是其他Domain對I/O設(shè)備的訪問,這個特權(quán)域稱為Domain0(簡稱:Dom0),而其他則稱為DomainU(簡稱:DomU),本文中Fork機制所指虛擬機均指DomU,F(xiàn)ork表示分叉,克隆的意思。Xen系統(tǒng)實現(xiàn)了共享內(nèi)存機制,用于Domain之間數(shù)據(jù)的共享和傳遞。它建立在Domain之間的授權(quán)機制之上,即對共享內(nèi)存的訪問須要預先通過授權(quán)。Domain之間的授權(quán)機制稱為授權(quán)表機制,它是一種基于頁(Pages)的授權(quán)訪問機制。Xenstore是Xen提供的一個域間共享的存儲系統(tǒng),這個系統(tǒng)由Dom0管理和維持。Xenstore是一個具有層次結(jié)構(gòu)的目錄,類似于Linux中的樹形目錄。Xenstore中存儲了Domain之間共享的配置信息,Dom0作為管理域,可以查看整個結(jié)構(gòu)的內(nèi)容,而DomU只能查看自身的信息。MiniOS是包含在Xen源代碼中的一個輕量級的操作系統(tǒng)內(nèi)核,主要作為存根域的操作系統(tǒng),存根域是一個為分解Dom0Qemu設(shè)備模型(為Xen的全虛擬化功能提供支持)運行在Xen之上的特殊的系統(tǒng)域。
經(jīng)過修改的MiniOS成為可以提供單一服務(wù)的虛擬機,稱作Unikernel。由此可以將Xen看作一個整體的操作系統(tǒng),其上運行的各個提供單一服務(wù)的Domain看作操作系統(tǒng)中的進程。實際上,Domain在Xen系統(tǒng)中的地位與傳統(tǒng)Linux系統(tǒng)中的進程無異。在Linux系統(tǒng)中,進程通過Fork(分叉)產(chǎn)生子進程,F(xiàn)ork過程首先會對父進程進行克隆,產(chǎn)生一個幾乎完全一樣的子進程,之后父子進程會執(zhí)行不同的代碼,從而完成不同任務(wù),進程的Fork是Linux中產(chǎn)生新進程的主要方式。受Linux進程Fork的啟發(fā),因此提出Xen之上虛擬機的Fork機制。使虛擬機能在運行過程中Fork出具有相同初始狀態(tài)的子虛擬機,去完成其他任務(wù)。
虛擬機Fork機制本質(zhì)上是虛擬機的克隆,但是目前的虛擬機克隆都是屬于靜態(tài)克隆,即先將要克隆的虛擬機掛起或關(guān)閉,然后手動執(zhí)行克隆操作,最后恢復原始虛擬機并啟動新虛擬機。不同的虛擬機監(jiān)視器有著不同的克隆策略。目前業(yè)界主流的虛擬機監(jiān)視器有VMware、KVM和Xen等。VMware支持兩種類型的克?。和暾寺『玩溄涌寺。粋€完整克隆是和原始虛擬機完全獨立的一個拷貝,它不和原始虛擬機共享任何資源??梢悦撾x原始虛擬機獨立使用。一個鏈接克隆需要和原始虛擬機共享同一虛擬磁盤文件,不能脫離原始虛擬機獨立運行。但采用共享磁盤文件卻大大縮短了創(chuàng)建克隆虛擬機的時間,同時還節(jié)省了寶貴的物理磁盤空間。KVM與Xen有著相同的兩種虛擬機克隆方式,一個是將虛擬機關(guān)閉之后,使用Virt-manager(一個開源的虛擬機管理工具)的Virt-clone工具(或者使用其他虛擬機管理工具)對虛擬機進行克隆,然后修改新虛擬機的主機名和IP地址等;另外一種方式是手動直接復制磁盤文件與配置文件,然后修改配置文件。這兩種方式本質(zhì)上都是對虛擬機的磁盤文件和配置文件進行了拷貝,均需要掛起或關(guān)閉原始虛擬機。目前各種虛擬機監(jiān)視器中,類似于Linux進程Fork機制這種動態(tài)克隆虛擬機的機制還未實現(xiàn)。
現(xiàn)有虛擬機的克隆技術(shù)均是靜態(tài)克隆,先將要克隆的虛擬機掛起或關(guān)閉,然后手動執(zhí)行克隆操作,最后恢復原始虛擬機并啟動新虛擬機,這種方式不符合虛擬機Fork這種在原虛擬機運行過程中克隆出一個子虛擬機場景的自動化需求,這種克隆方式可以稱為動態(tài)克隆。而且靜態(tài)克隆因為掛起或關(guān)閉了原虛擬機,有著明確的一段服務(wù)不可用的時間,違背了模仿Linux進程Fork機制的思想。
技術(shù)實現(xiàn)要素:
針對上述技術(shù)問題,本發(fā)明的目的是使Xen之上的虛擬機在運行過程中就能克隆出子虛擬機,然后自動去運行其他服務(wù),而不必掛起或關(guān)閉原虛擬機,一是使虛擬機的克隆和運行不同服務(wù)達到了自動化需求,二是節(jié)省了由于原虛擬機掛起或關(guān)閉而造成了服務(wù)中斷。使整個虛擬機的克隆過程更加類似于Linux中進程的Fork機制。本發(fā)明提出了一種Xen虛擬機Fork機制建立方法,包括以下步驟:
(S1)啟動xen系統(tǒng),將在Xen上運行的虛擬機分為兩類,第一類是用來輔助Xen管理和提供虛擬服務(wù)資源的虛擬機,記為Dom0(也稱為特權(quán)域),第二類是除第一類外的虛擬機,記為DomU(也稱為非特權(quán)域);初始的DomU稱為父DomU,對應(yīng)的父DomU通過Fork產(chǎn)生的虛擬機稱為子DomU;
(S2)在Xen內(nèi)核的libxl模塊主函數(shù)中,設(shè)置兩個進程,進程一用于創(chuàng)建父DomU,進程二用于輪詢Xenstore中父DomU的done_fork標志位;并定義全局變量is_parent,在進程一中設(shè)置is_parent=1,進程二中設(shè)置is_parent=0;
(S3)在libxl模塊的DomU構(gòu)建函數(shù)中,判斷全局變量is_parent是否等于1,若is_parent=1,開始構(gòu)建父DomU,在Xenstore的父DomU節(jié)點下寫入標志位is_parent=1;父DomU構(gòu)建完成并啟動起來,進入到DomU的用戶進程主函數(shù),讀取Xenstore中自身DomU下的is_parent標志位,判斷若等于1,執(zhí)行父DomU的fork操作;
(S4)父DomU進行Fork開始時,首先授權(quán)父DomU內(nèi)存頁面,并在Xenstore中記錄授權(quán)表下標和頁內(nèi)偏移,然后在Xenstore對應(yīng)的父DomU節(jié)點中寫入done_fork標志位等于1,并記錄父DomU各寄存器狀態(tài)和派發(fā)給將要啟動的子DomU執(zhí)行的任務(wù)函數(shù)名;
(S5)當Dom0中進程二輪詢到Xenstore中父DomU的done_fork標志位等于1,跳出循環(huán),進入到DomU構(gòu)建函數(shù)中;
(S6)在DomU構(gòu)建函數(shù)中,判斷全局變量是否等于1,若is_parent不等于1,開始構(gòu)建子DomU,在Xenstore的子DomU節(jié)點下寫入標志位is_parent=0,此過程中,Dom0讀取Xenstore中父DomU節(jié)點下的各數(shù)據(jù)值,并寫入到子DomU節(jié)點中;子DomU構(gòu)建完成并啟動起來,進入到DomU的用戶進程主函數(shù),讀取Xenstore中自身DomU下的is_parent標志位,判斷等于0,執(zhí)行子DomU的操作;
(S7)子DomU讀取Xenstore中授權(quán)表下標和頁內(nèi)偏移、寄存器狀態(tài)值和需要執(zhí)行的函數(shù)名稱,映射授權(quán)頁面,恢復寄存器狀態(tài),然后執(zhí)行函數(shù)(即:需要執(zhí)行的函數(shù)名稱對應(yīng)的函數(shù))。
進一步地,所述步驟(S4)中父DomU通知Dom0啟動子DomU是通過設(shè)置done_fork標志位讓Dom0輪詢的方式,替換為事件通知方式,采用Xen的事件通道機制,即DomU通過發(fā)送事件來讓Dom0啟動子DomU。
進一步地,所述父DomU將授權(quán)表下標、自身寄存器狀態(tài)、執(zhí)行函數(shù)名等消息值發(fā)送給子DomU用寫入Xenstore Dom0作為中介的方式替換為域間通信方式,即待子DomU啟動完成,父DomU將所述消息值直接發(fā)送給子DomU。
進一步地,使子DomU恢復父DomU相同的內(nèi)存狀態(tài),采用父DomU將內(nèi)存共享給子DomU的方式,替換為直接采用內(nèi)存拷貝的技術(shù)。目前虛擬機快照和虛擬機遷移中的內(nèi)存預拷貝策略可滿足不掛起或停止虛擬機的要求。
進一步地,復制父DomU配置文件生成子DomU配置文件時,采用手動復制并更改的方式,替換成通過代碼在對配置文件進行解析的過程中,更改配置文件中的某些參數(shù),使子DomU區(qū)別于父DomU。
采用本發(fā)明獲得的有益效果:本發(fā)明使Xen之上的虛擬機在運行過程中就能克隆出子虛擬機,然后自動去運行其他服務(wù),而不必掛起或關(guān)閉原虛擬機,一是使虛擬機的克隆和運行不同服務(wù)達到了自動化需求,二是節(jié)省了由于原虛擬機掛起或關(guān)閉而造成了服務(wù)中斷。使整個虛擬機的克隆過程更加類似于Linux中進程的Fork機制。
附圖說明
圖1是本發(fā)明的流程示意圖;
圖2是本發(fā)明實施例數(shù)據(jù)處理圖。
具體實施方式
下面結(jié)合附圖和實施例對本發(fā)明作進一步說明。
由于Dom0和DomU均是Xen上的虛擬機,實施例中Fork的虛擬機僅包括DomU,但Dom0也是Fork過程中的重要角色,為免于造成誤解,下面實現(xiàn)實施例描述中Fork過程的“虛擬機”詞語均以“DomU”指代。
本發(fā)明要實現(xiàn)的目標是使DomU在運行過程中Fork出子DomU執(zhí)行相應(yīng)的程序功能,其實現(xiàn)的主要思路是,當父DomU要進行Fork時,告知Dom0啟動一個與父DomU內(nèi)核相同但配置文件不同的新DomU(即子DomU),待子DomU啟動完成后,將父DomU的內(nèi)存和寄存器狀態(tài)復制給子DomU。
結(jié)合附圖1,本發(fā)明主要對Xen內(nèi)核的Libxl模塊進行修改,更改DomU鏡像建立和啟動過程,DomU Fork具體流程描述如下。
在xen系統(tǒng)中,DomU的創(chuàng)建、暫停、銷毀等均由Dom0完成,通過Libxl模塊。因此Libxl模塊的代碼是在Dom0中運行。在libxl模塊主函數(shù)中,設(shè)置兩個進程,一個用于創(chuàng)建父DomU,另外一個進程用于輪詢done_fork標志位,該標志位等于1時即創(chuàng)建子DomU,兩個進程分別會對is_parent全局變量設(shè)置成1或0。
在libxl模塊的創(chuàng)建DomU代碼中,通過is_parent全局變量判斷要啟動的是父DomU還是子DomU,然后設(shè)置Xenstore中對應(yīng)DomU節(jié)點下的is_parent標志位(is_parent=1表示父DomU,反之亦然)。當父DomU要進行Fork時,首先會授權(quán)其內(nèi)存頁面(共享內(nèi)存),并在Xenstore中記錄授權(quán)表下標和頁內(nèi)偏移,然后設(shè)置Xenstore對應(yīng)DomU節(jié)點中done_fork標志位等于1,并記錄自身各寄存器狀態(tài)和子DomU要執(zhí)行的函數(shù)名稱。Dom0運行過程中,設(shè)置一個進程一直輪詢Xenstore中父DomU節(jié)點的done_fork標志位,當done_fork標志位等于1時就開始構(gòu)建子DomU,使用與父DomU相同的內(nèi)核但配置文件不同,同時Dom0會讀取Xentore的父DomU域中的各項消息值,包括授權(quán)表下標、頁內(nèi)偏移、子DomU要執(zhí)行的函數(shù)名稱和父DomU各寄存器狀態(tài),并寫到Xentore的子DomU節(jié)點中。然后當子DomU啟動完成,就讀取Xenstore中的這些值,然后映射父DomU共享的內(nèi)存頁面,恢復寄存器狀態(tài),最后跳轉(zhuǎn)到要執(zhí)行的函數(shù)名稱進行執(zhí)行,至此父DomU就完成了Fork。
Xenstore的結(jié)構(gòu)為類似于linux目錄結(jié)構(gòu)的樹形結(jié)構(gòu),每個Domain都擁有自己的節(jié)點(Domain id為key),節(jié)點下面存儲著自身的各種信息,各DomU之間不能互相訪問,但是Dom0可以訪問xentore全部結(jié)構(gòu),在構(gòu)建DomU時,xenstore中已經(jīng)存在相應(yīng)Domain id的節(jié)點,Dom0知道DomU的Domain id,就可以在其節(jié)點寫入數(shù)據(jù)。
如圖1所示的流程圖中,進程二是一直在輪詢,只有待進程一先執(zhí)行過后,當父DomU寫入標志位done_fork=1后,進程二才往下進行剩余步驟。圖1中DomU構(gòu)建函數(shù)根據(jù)全局變量is_parent的取值來判斷構(gòu)建的是父DomU、還是子DomU,則啟動DomU則根據(jù)上面構(gòu)建的是父DomU或子DomU則對應(yīng)啟動該DomU。Dom U的用戶進程主函數(shù),在實踐中也可以分別編程為父Dom U、子Dom U的用戶進程主函數(shù),本實施例中將兩部分代碼集成為一個用戶進程主函數(shù)中,不影響兩者功能的實現(xiàn)。
實施例中,復制父DomU的配置文件并更改ip地址,主機名等參數(shù),成為子DomU的配置文件;構(gòu)建父DomU,父DomU啟動之后,進行fork,一段時間之后,通過xl list命令(此命令查看xen啟動的所有Domain),可以查看子DomU也啟動起來,通過xl console子DomUID命令(接入Domain控制臺),可以查看到子DomU調(diào)用指定函數(shù)的結(jié)果(一直打印某個字符串)T如圖2所示。
本發(fā)明模仿Linux進程的Fork機制,使Xen之上的虛擬機在運行過程中就能克隆出子虛擬機,然后自動去運行其他服務(wù),而不必掛起或關(guān)閉原虛擬機,使Xen的功能越來越接近于整個操作系統(tǒng)。
以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換等,均應(yīng)包含在本發(fā)明的保護范圍之內(nèi)。