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。(见以后的代码注释分析哈)
另一方面即为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()虚拟机于是运行起来。
- xen live migration
- xen Live Migration 配置
- Xen Live Migration with iSCSI
- Xen 虚拟机live migration的一种解决方案
- Xen 虚拟机live migration的一种解决方案
- OpenStack Live Migration
- virtualization--live migration
- 《转》OpenStack Live Migration
- icehouse live-migration
- openstack live-migration
- openstack nova live-migration
- OpenStack future live-migration
- OpenStack Nova: Live Migration & Cold Migration & Resize
- openstack的live migration 配置
- openstack的live migration 配置
- openstack live-migration配置过程
- OpenStack Nova : Live Migration 流程
- openstack live-migration出错解决方法
- 一些C++试题
- 隐形眼镜的评价分析报告
- Windows CE 6.0 安装及相关注意事项2【转】
- 早年的一篇关于80286保护模式的文章
- java线程 --- 一道迅雷笔试题 (一)
- xen live migration
- 股市的两个凡是
- Struts2 中 Result的 Chain Result,Redirect Action Result,Redirect Result 三者之间的区别
- VC6下 try catch 在release下的杯具
- 开放式虚拟机格式OVF
- Django模板中使用css, javascript
- struts2中action跳转到另一个action的方法
- GDE-X进展 战场框架
- 迁移、重构项目的注意事项