xen live migrate過程分析

文章轉自

http://blog.sina.com.cn/s/blog_4698287d0100c1rf.html

----------

最近由於項目需要,大致瀏覽了一下migrate的代碼,大體的感覺是xen的src中實現了一些c代碼,可以解決05年paper提到的迭代傳遞memory 與 CPU context. 但是完成完整功能的代碼是用/tools/python中的代碼完成的,可以說python代碼是用來組裝xen中功能的。xend是一個非常強大的第三方軟件。

調用xen live migrate的命令爲: xm migrate -l fc8 162.105.146.219 當然了,遷移是可以在本地進行的。因爲遷移的過程中源機的VM會改名。 改名方式爲 migrating-(previous name)。當然,名字的改變可以是隨心所欲的。

migrate code分爲save 與 restore兩部分。主要分別對應的/tools/libxc中的xc_domain_save.c與xc_domain_restore.c。個人能力有限,只能簡單談談python部分的代碼

 

從save部分談起:

首先進入的代碼爲/tools/python/xen/xm migrate.py 這部分的代碼主要是解析參數,然後執行

server.xend.domain.migrate(dom, dst, opts.vals.live,
                                   opts.vals.port,
                                   opts.vals.node,
                                   opts.vals.ssl)

然後進入/tools/python/xen/xend XendDomain.py 這個文件主要實現xend中的大部分功能,比如migrate, suspend, resume。等等(說明一下suspend-resume與save-restore的區別,前者是通過xend management進行管理,需要使用xm new-->xm start啓動,然後使用suspend-resume進行保存snapshot【在硬盤】,而save-restore則對應xm create。但是功能上來說是一致的。代碼上也調用了不少一樣的子過程)與這個文件相應的一個文件爲同目錄下的 XendDomainInfo.py。兩個文件需要相互調用配合纔可以完成xend的功能的。

其中調用domain_migrate函數。這個函數中使用domain_lookup_nr獲得VM的配置信息。然後獲得一些default arguments。比如端口號8002等。建立socket。發送握手信號:receive, 收到(ready receive)之後調用函數

XendCheckpoint.save(sock.fileno(), dominfo, True, live,
                                    dst,Checkpoint=True, node=node)

源代碼中是不包括參數Checkpoint的。可以傳遞進入Checkpoint參數(默認情況下爲false),如果爲True。則在save函數中會執行

if checkpoint:
            dominfo.resumeDomain()
        else:
            dominfo.destroy()
            dominfo.testDeviceComplete()

傳入參數True,那麼遷移過程中被shutdown的函數就會進行重新運行起來。雖然運行的狀態是b

在XendCheckpoint.py中,save函數首先會傳遞config到目的機器。config包括的內容很多,比如vm name, vcpu number. device(包括vbd等,local disk的信息就是包含在vbd中,同時vbd還包括了local disk的格式,例如xvda,sda1等,還有就是模式'r'只讀或者'w'讀寫)

這個文件中的最核心的代碼爲:

forkHelper(cmd, fd, saveInputHandler, False)

其中cmd爲啓動的子進程名字及其參數,而saveInputHandler爲回調函數。當子進程執行到某個階段之後就調用回調函數。其中cmd調用的進程爲xc_save這是由xc_save.c生成的。主要執行的解析參數然後調用函數 xc_domain_save.c。(見以後的代碼註釋分析哈xen <wbr>live-migrate <wbr>流程簡明分析)

 

另一方面即爲restore,其實這個過程是與save一一對應的。

首先在啓動SrcDeamon的時候,生成relocate.py的監聽類。監聽端口爲8002,當監聽到消息爲receive之後,relocate.py中相應的類將調用do_receive方法,該方法通過層層調用進入到XenCheckpoint中的restore函數。從而完成主要的restore功能

首先通過read_exact函數讀取配置文件,利用sxp中定義的parser,執行vmconfig=p.get_val()獲得詳細的配置信息。然後使用xd.restore_(vmconfig)創建接受vm的容器。這個函數首先構建虛擬機(_construction)接着保存虛擬機的信息(比如device中的console, vbd, vif。vir_base虛擬起始地址,頁表所在的地址,CR3等)於是可以得到變量domInfo(XenDomainInfo類),通過該變量獲得console與store的端口,共享頁的地址(通過debug信息,彷彿給出的地址是物理地址或者是虛擬地址。因爲遷移過程中,該地址信息並沒有發生變化,但是一般情況下machine address應該是會發生變化的。但是無論是物理地址還是機器地址,只要能獲得xen中物理-機器地址轉換表,都不會是太大的問題)於是創建image:判斷memory的分配額

restore_image = image.create(dominfo, dominfo.info)

memory = restore_image.getRequiredAvailableMemory(...)

maxmem = restore_image.getRequiredAvailableMemory(...)

shadow = restore_image.getRequiredShadowMemory(...)

balloon.free(memory + shadow)

於是與save相同,調用xc_restore進程,接受源機器發送過來的數據包,解析,建立頁映射以及將vcpu的信息設置完成,並通過dominfo.waitForDevices()獲取啓動時候需要的設備信息。

最終虛擬機處於pause狀態,通過參數設置,執行dominfo.unpause()虛擬機於是運行起來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章