虛擬機(jī)快照的生成方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,尤其涉及一種虛擬機(jī)快照的生成方法和裝置。
【背景技術(shù)】
[0002]虛擬機(jī)快照指的是將某一時(shí)刻下的虛擬機(jī)的狀態(tài)復(fù)制保存下來,以便系統(tǒng)在出現(xiàn)問題時(shí)根據(jù)該虛擬機(jī)快照還原虛擬機(jī),或者使得虛擬機(jī)在啟動(dòng)后根據(jù)該虛擬機(jī)快照恢復(fù)到該時(shí)刻的運(yùn)行狀態(tài)。在線快照指的是在不中斷當(dāng)前虛擬機(jī)的正常運(yùn)行下將當(dāng)前虛擬機(jī)的工作狀態(tài)保存到指定文件
[0003]虛擬機(jī)快照包括虛擬機(jī)的設(shè)備狀態(tài)和內(nèi)存數(shù)據(jù)。目前的KVM(全稱:Kernel-basedVirtual Machine,基于linux內(nèi)核的虛擬機(jī))并沒有在線內(nèi)存快照功能。在獲取KVM的快照時(shí),需先暫停虛擬機(jī),然后再熱迀移虛擬機(jī)的虛擬內(nèi)存中的內(nèi)容和設(shè)備狀態(tài)到快照文件中。然而,熱迀移虛擬機(jī)內(nèi)存到快照文件中所花時(shí)間較長,因此虛擬機(jī)暫停時(shí)間較久,這對(duì)虛擬機(jī)的業(yè)務(wù)影響較大。
【發(fā)明內(nèi)容】
[0004]本發(fā)明實(shí)施例提供了一種虛擬機(jī)快照的生成方法和裝置,以保證快照文件中虛擬機(jī)內(nèi)存的一致性,同時(shí)盡可能減少虛擬機(jī)內(nèi)部業(yè)務(wù)的中斷。
[0005]第一方面,本發(fā)明實(shí)施例提供一種虛擬機(jī)快照的生成方法。該方法在用戶態(tài)對(duì)虛擬機(jī)所有內(nèi)存頁寫保護(hù),從而在內(nèi)核態(tài)阻塞所有針對(duì)虛擬機(jī)內(nèi)存頁的寫操作,并在用戶態(tài)處理寫保護(hù)異常,在內(nèi)存頁被污染前保存到快照文件中,保存完成后立即恢復(fù)虛擬機(jī)繼續(xù)運(yùn)行。從而保證快照文件中,虛擬機(jī)內(nèi)存的一致性,又盡可能不影響虛擬機(jī)的正常運(yùn)行,減少對(duì)宿主機(jī)的影響(主要是不能占用過多額外內(nèi)存)。
[0006]在第一方面的一種可能的實(shí)現(xiàn)方式中,虛擬機(jī)監(jiān)控器獲取快照命令,并根據(jù)該快照命令在第一時(shí)刻暫停該虛擬機(jī),將處于暫停狀態(tài)的所述虛擬機(jī)的第一時(shí)刻的設(shè)備狀態(tài)保存至所述虛擬機(jī)的快照文件。在所述設(shè)備狀態(tài)保存完畢后,將所述虛擬機(jī)由暫停狀態(tài)恢復(fù)為運(yùn)行狀態(tài)。并且從第一時(shí)刻開始,虛擬機(jī)監(jiān)控器還執(zhí)行對(duì)所述虛擬機(jī)的內(nèi)存中內(nèi)存頁的保存操作及對(duì)所述虛擬機(jī)的內(nèi)存中的內(nèi)存頁的污染攔截操作。
[0007]根據(jù)第一方面的第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式中,對(duì)所述虛擬機(jī)的內(nèi)存中的內(nèi)存頁的污染攔截操作包括:在所述第一時(shí)刻到將所述內(nèi)存頁的內(nèi)容保存至所述虛擬機(jī)的快照文件的時(shí)刻之間,對(duì)影響所述內(nèi)存頁的內(nèi)容的污染動(dòng)作進(jìn)行攔截,直到將所述內(nèi)存頁的內(nèi)容保存到臨時(shí)緩存后,再解除對(duì)所述污染動(dòng)作的攔截。
[0008]根據(jù)第一方面的第一種可能的實(shí)現(xiàn)方式,或者第二種可能的實(shí)現(xiàn)方式中,在第三種可能的實(shí)現(xiàn)方式中,對(duì)所述虛擬機(jī)的內(nèi)存中內(nèi)存頁的保存操作包括:將所述臨時(shí)緩存中保存的所述內(nèi)存頁的內(nèi)容保存至所述虛擬機(jī)的快照文件中。本發(fā)明實(shí)施例利用臨時(shí)緩存來保存虛擬機(jī)內(nèi)存頁,減少對(duì)虛擬機(jī)運(yùn)行的影響。用戶可以根據(jù)實(shí)際需求,來設(shè)置臨時(shí)緩存的大小,臨時(shí)緩存越大,對(duì)虛擬機(jī)運(yùn)行影響越小。根據(jù)第一方面或第一方面的任意一種實(shí)現(xiàn)方式,在第四種可能的實(shí)現(xiàn)方式中,對(duì)所述虛擬機(jī)的內(nèi)存中內(nèi)存頁的保存操作及對(duì)所述內(nèi)存中的內(nèi)存頁的污染攔截操作為第一時(shí)刻后兩個(gè)并行執(zhí)行的動(dòng)作。
[0009]根據(jù)第一方面任意一種實(shí)現(xiàn)方式,在第五種可能的實(shí)現(xiàn)方式中,依次獲取虛擬機(jī)的內(nèi)存中各內(nèi)存頁的快照文件的過程包括:在獲取其中一個(gè)內(nèi)存頁的快照文件之前,首先判斷該內(nèi)存頁的內(nèi)容是否保存到臨時(shí)緩存中,若否,則直接將該內(nèi)存頁的內(nèi)容保存到快照文件中,若是,則將臨時(shí)緩存中的該內(nèi)存頁的內(nèi)容保存到虛擬機(jī)的快照文件中。因此,針對(duì)虛擬機(jī)所有內(nèi)存頁只保存一次,因而可以保證快照文件小于等于虛擬機(jī)內(nèi)存大小,減少了內(nèi)存快照文件占用的空間。進(jìn)一步地,在第六種可能的實(shí)現(xiàn)方式中,臨時(shí)緩存可以是虛擬機(jī)的內(nèi)存之外的一段內(nèi)存,也可以是虛擬機(jī)內(nèi)存之外的多個(gè)文件。
[0010]根據(jù)第一方面任意一種實(shí)現(xiàn)方式,在第七種可能的實(shí)現(xiàn)方式中,判斷所述內(nèi)存頁的內(nèi)容是否保存到臨時(shí)緩存的方法包括:當(dāng)攔截到影響該內(nèi)存頁的內(nèi)容的污染動(dòng)作時(shí),將該內(nèi)存頁標(biāo)記為已攔截到污染動(dòng)作,或者,在將該內(nèi)存頁的內(nèi)容保存到臨時(shí)緩存時(shí),將該內(nèi)存頁標(biāo)記為已緩存到臨時(shí)緩存中。
[0011 ]本發(fā)明實(shí)施例的虛擬機(jī)快照生成方法中,獲取到虛擬機(jī)在第一時(shí)刻的設(shè)備狀態(tài)的快照文件后,將虛擬機(jī)恢復(fù)為運(yùn)行狀態(tài),使得虛擬機(jī)暫停的時(shí)間較短,對(duì)虛擬機(jī)的業(yè)務(wù)影響較小;獲取虛擬機(jī)的內(nèi)存狀態(tài)的快照文件時(shí),由于從第一時(shí)刻開始到保存虛擬機(jī)的內(nèi)存中的內(nèi)存頁的內(nèi)容至所述虛擬機(jī)的快照文件之前,對(duì)影響所述內(nèi)存頁的內(nèi)容的污染動(dòng)作進(jìn)行攔截,將所述內(nèi)存頁的內(nèi)容保存到臨時(shí)緩存,使得在保存虛擬機(jī)的內(nèi)存頁時(shí),對(duì)于已被污染的內(nèi)存頁從臨時(shí)緩存中獲取該內(nèi)存頁的內(nèi)容保存到虛擬機(jī)的快照文件中,這樣,可以保證虛擬機(jī)的第一時(shí)刻的快照文件中設(shè)備狀態(tài)和虛擬內(nèi)存的一致性;另外,在將內(nèi)存頁的內(nèi)容保存到臨時(shí)緩存后,解除對(duì)所述污染動(dòng)作的攔截,以使得能夠順利訪問該內(nèi)存頁,不需要將虛擬機(jī)暫停直到獲取完虛擬機(jī)的虛擬內(nèi)存的快照文件才恢復(fù)虛擬機(jī)的運(yùn)行狀態(tài),避免了虛擬機(jī)暫停時(shí)間較久而影響業(yè)務(wù)的情況
[0012]根據(jù)第一方面任意一種實(shí)現(xiàn)方式,在第八種可能的實(shí)現(xiàn)方式中,,對(duì)所述內(nèi)存頁的污染動(dòng)作進(jìn)行攔截的方法包括:利用userfaultfd接口開啟對(duì)所述內(nèi)存頁的寫保護(hù),通過寫保護(hù)來攔截該內(nèi)存頁的污染動(dòng)作。具體的,利用userfaultfd接口將所述內(nèi)存頁標(biāo)記為只讀。linux userfault功能對(duì)內(nèi)存頁的copy-on-wirite功能,不區(qū)分內(nèi)核態(tài)還是用戶態(tài)在修改寫保護(hù)頁,本發(fā)明實(shí)施例通過調(diào)用userfaultfd接口來開啟對(duì)內(nèi)存頁的寫保護(hù),不用區(qū)分是內(nèi)核態(tài)還是用戶態(tài)在修改寫保護(hù)頁,因此無需修改內(nèi)核驅(qū)動(dòng)代碼,能夠兼容現(xiàn)有的虛擬化平臺(tái)。
[0013]根據(jù)第一方面任意一種實(shí)現(xiàn)方式,在第九種可能的實(shí)現(xiàn)方式中,將該內(nèi)存頁的內(nèi)容保存到臨時(shí)緩存的方法包括:創(chuàng)建寫保護(hù)異常處理線程;所述寫保護(hù)異常處理線程獲取文件描述符;可選地,該寫保護(hù)異常處理線程可通過userfaultfd接口來獲取文件描述符。當(dāng)對(duì)所述內(nèi)存頁的污染動(dòng)作被攔截到時(shí),所述寫保護(hù)異常處理線程根據(jù)所述文件描述符獲取所述內(nèi)存頁的地址;所述寫保護(hù)異常處理線程根據(jù)所述內(nèi)存頁的地址獲取所述內(nèi)存頁的內(nèi)容,將所述內(nèi)容保存到臨時(shí)緩存中。可選地,寫保護(hù)異常處理線程可通過調(diào)用read(ufd)來獲取該內(nèi)存頁的地址。
[0014]根據(jù)第一方面第九種可能的實(shí)現(xiàn)方式,在第十種可能的實(shí)現(xiàn)方式中,寫保護(hù)異常處理線程還可以將該內(nèi)存頁標(biāo)記為已攔截到污染動(dòng)作或已保存到臨時(shí)緩存。優(yōu)選地,寫保護(hù)異常處理線程可以利用位圖來標(biāo)記內(nèi)存頁。當(dāng)寫保護(hù)異常處理線程將內(nèi)存頁的內(nèi)容保存到臨時(shí)緩存后,通過userfaultfd接口通知內(nèi)核態(tài)去掉對(duì)該內(nèi)存頁的寫保護(hù),虛擬機(jī)繼續(xù)運(yùn)行,并可以實(shí)現(xiàn)對(duì)對(duì)該內(nèi)存頁的寫操作,。當(dāng)所有的地址的內(nèi)存頁內(nèi)容全部保存到快照文件中時(shí),通知寫保護(hù)異常處理線程退出。
[0015]根據(jù)第一方面任意一種實(shí)現(xiàn)方式,在第十一種可能的實(shí)現(xiàn)方式中,、虛擬化平臺(tái)中能夠污染虛擬機(jī)的內(nèi)存的有客戶機(jī)軟件和虛擬機(jī)監(jiān)控器。虛擬機(jī)監(jiān)控器打開有擴(kuò)展頁表(英文:Extended Page Table,縮寫:EPT)或者巢狀分頁表(英文:Nested Page Table,縮寫:NPT)的寫保護(hù)功能,用于攔截客戶機(jī)軟件對(duì)虛擬機(jī)的內(nèi)存的污染動(dòng)作。打開EPT或者NPT的寫保護(hù)功能后,所述寫保護(hù)功能用于在所述客戶機(jī)軟件污染所述內(nèi)存頁前時(shí)使得所述虛擬機(jī)由客戶機(jī)狀態(tài)切換到宿主機(jī)狀態(tài),所述虛擬機(jī)監(jiān)控器在所述宿主機(jī)狀態(tài)中將所述內(nèi)存頁的內(nèi)容保存到臨時(shí)緩存,并將所述內(nèi)存頁標(biāo)記為已攔截到污染動(dòng)作或已保存到臨時(shí)緩存,然后去掉該內(nèi)存頁的寫保護(hù),使得客戶機(jī)軟件能夠順利實(shí)現(xiàn)對(duì)該內(nèi)存頁的寫操作。
[0016]根據(jù)第一方面的第^^一種實(shí)現(xiàn)方式,在第十二種可能的實(shí)現(xiàn)方式中,虛擬機(jī)監(jiān)控器能夠通過虛擬機(jī)監(jiān)控器的代碼執(zhí)行路徑區(qū)分虛擬機(jī)監(jiān)控器是否將要寫所述虛擬機(jī)的內(nèi)存。當(dāng)虛擬機(jī)監(jiān)控器根據(jù)執(zhí)行代碼路徑確定將要污染所述虛擬機(jī)的內(nèi)存時(shí),所述虛擬機(jī)監(jiān)控器判斷當(dāng)前是否正在獲取所述虛擬機(jī)的快照文件。具體的,在虛擬機(jī)監(jiān)控器接收到快照命令時(shí),打開寫動(dòng)作跟蹤功能。當(dāng)虛擬機(jī)監(jiān)控器確定寫動(dòng)作跟蹤功能打開時(shí),可確定當(dāng)前正在獲取所述虛擬機(jī)的快照文件。當(dāng)所述虛擬機(jī)監(jiān)控器確定當(dāng)前正在獲取所述虛擬機(jī)的快照文件時(shí),且所述虛擬機(jī)監(jiān)控器確定要污染的內(nèi)存頁的內(nèi)容沒有存到所述臨時(shí)緩存時(shí),將所述內(nèi)存頁的內(nèi)容保存到臨時(shí)緩存中,然后再污染所述內(nèi)存頁。
[0017]第二方面,本發(fā)明實(shí)施例還提供了用于實(shí)現(xiàn)上述方法的虛擬機(jī)快照的生成裝置。
[0018]在第二方面的第一種可能的實(shí)現(xiàn)方式中,虛擬機(jī)快照的生成裝置包括:獲取模塊、第一保存模塊、攔截模塊、第二保存模塊和恢復(fù)模塊,其中每個(gè)模塊完成特定的功能,各個(gè)多塊共同配合實(shí)現(xiàn)上述第一方面、第一方面的第一種可能的實(shí)現(xiàn)方式至第十二種可能的實(shí)現(xiàn)方式中所提供的虛擬機(jī)快照的生成方法。
[0019]在第二方面的第二種可能的實(shí)現(xiàn)方式中,虛擬機(jī)快照的生成裝置為虛擬機(jī)監(jiān)控器,該虛擬機(jī)監(jiān)控器包括用戶態(tài)的QEMU進(jìn)程和內(nèi)核態(tài)的KVM模塊,該QEMU進(jìn)程具體用于執(zhí)行上述第一方面、第一方面的第一種可能的實(shí)現(xiàn)方式至第十二種可能的實(shí)現(xiàn)方式中所提供的虛擬機(jī)快照的生成方法。第三方面,本發(fā)明實(shí)施例還提供一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),該存儲(chǔ)介質(zhì)中存儲(chǔ)有用于實(shí)現(xiàn)上述第一方面、第一方面的第一種可能的實(shí)現(xiàn)方式至第十二種可能的實(shí)現(xiàn)方式中所描述的虛擬機(jī)快照的生成方法的指令或軟件模塊。
[0020]本發(fā)明實(shí)施例中,由于從第一時(shí)刻開始到保存虛擬機(jī)的內(nèi)存中的內(nèi)存頁的內(nèi)容至所述虛擬機(jī)的快照文件之前,對(duì)影響所述內(nèi)存頁內(nèi)容的污染動(dòng)作進(jìn)行攔截,將所述內(nèi)存頁的內(nèi)容保存到臨時(shí)緩存,使得在保存虛擬機(jī)的內(nèi)存頁時(shí),若檢測(cè)到該內(nèi)存頁的內(nèi)容保存到臨時(shí)緩存,則從臨時(shí)緩存中獲取該內(nèi)存頁的內(nèi)容,并將該內(nèi)容保存到虛擬機(jī)的快照文件中,這樣,可以保證虛擬機(jī)的第一時(shí)刻的快照文件中設(shè)備狀態(tài)和虛擬內(nèi)存的一致性;另外,在將內(nèi)存頁的內(nèi)容保存到臨時(shí)緩存后,解除對(duì)所述污染動(dòng)作的攔截,以使得能夠順利訪問該內(nèi)存頁,不需要將虛擬機(jī)暫停直到獲取完虛擬機(jī)的虛擬內(nèi)存的快照文件才恢復(fù)虛擬機(jī)的運(yùn)行狀態(tài),減少了虛擬機(jī)暫停時(shí)間,從而減少了對(duì)虛擬機(jī)所承載的業(yè)務(wù)的影響。
【附圖說明】
[0021]圖1為本發(fā)明實(shí)施例中的一個(gè)簡化的數(shù)據(jù)中