xen live migration

来源:互联网 发布:数据洞察 编辑:程序博客网 时间:2024/04/30 04:45

最近由于项目需要,大致浏览了一下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-(previousname)。当然,名字的改变可以是随心所欲的。

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的区别,前者是通过xendmanagement进行管理,需要使用xm new-->xmstart启动,然后使用suspend-resume进行保存snapshot【在硬盘】,而save-restore则对应xmcreate。但是功能上来说是一致的。代码上也调用了不少一样的子过程)与这个文件相应的一个文件为同目录下的XendDomainInfo.py。两个文件需要相互调用配合才可以完成xend的功能的。

其中调用domain_migrate函数。这个函数中使用domain_lookup_nr获得VM的配置信息。然后获得一些defaultarguments。比如端口号8002等。建立socket。发送握手信号:receive, 收到(readyreceive)之后调用函数

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包括的内容很多,比如vmname, vcpu number. device(包括vbd等,localdisk的信息就是包含在vbd中,同时vbd还包括了localdisk的格式,例如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信息,仿佛给出的地址是物理地址或者是虚拟地址。因为迁移过程中,该地址信息并没有发生变化,但是一般情况下machineaddress应该是会发生变化的。但是无论是物理地址还是机器地址,只要能获得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()虚拟机于是运行起来。

原创粉丝点击