使用XenServer的SDK实现虚拟机的按需关闭和按需启动

来源:互联网 发布:慕课网 java视频教材 编辑:程序博客网 时间:2024/04/30 18:06

【摘要】问题的提出:根据XenServe服务器中虚拟机的性能情况,实时且自动地做出启动新虚拟机、关闭已启动虚拟机的动作。本文简要叙述了基本思路和方法,在具体进行开发时,需要参考《XenServer 软件开发工具包指南》,其中含有:如何编写与XenServer 主机交互的应用程序的精选代码示例。                                                                                                                                                                                                                                                                                       

【目标简述】

根据XenServe服务器中虚拟机的性能情况,实时且自动地做出启动新虚拟机、关闭已启动虚拟机的动作。

 
甲、XenServer SDK环境的搭建

 (1)XenServer 6.0 SDK的下载网址

 http://community.citrix.com/display/xs/Download+SDKs

  注:下载时,找到如下部分:

 XenServer SDK VM
点击“Download  SDK”下载,这是一个完整的基于Linux的开发环境。

 (2)服务器配置建议

 Ⅰ)先在一台服务器上搭建开发环境,建议配置如下:

        CPU:酷睿i5以上(支持Intel VT 和AMD-V)

        内存:16GB

        硬盘:500GB×2

        网卡:4块千兆以太网卡

 Ⅱ)完成初步目标后,再搭建一台服务器,在XenServer的HA(高可用性)和Failover(故障转移)环境中进行进一步调整。

  

乙、基本思路

 (1)在XenServer上创建Daemon:XS_InfoGet

 XS-InfoGet用于:使用 HTTP 与 XenServer 交互以获取 XenServer性能统计信息并进行传递。

 XenServer的各项目统计信息(包括XenServer和各个虚拟机的相关数据)均存储在RRD(Round Robin Databases,循环数据库)中,可使用HTTP从XenServer中获取这些数据,然后将数据传递给后台的监控Daemon。

 具体说明可见附件的相关说明部分。

 参考资料一   Using XenServer RRDs:                                                                                            
                        http://community.citrix.com/display/xs/Using+XenServer+RRDs

参考资料二   Getting the Last RRD Datapoints:                                                                                            
                       http://community.citrix.com/display/xs/Getting+the+Last+RRD+Datapoints

参考资料三   一个完整的Python脚本:                                                                                            
                       http://community.citrix.com/display/xs/RRD+Example+Script

  (2)在XenServer上创建Daemon:XS_CoreDecision

     用C在XenServer上编写Daemon:XS_CoreDecision,运行在XenServer后台上,实时地接收来自XS_InfoGet的数据,并且,做出性能分析和相应动作:

        Ⅰ)一旦一些数据(如内存占用率)超过阈值,即将参数(比如,需要启动的虚拟机名称等)传递给相关函数,启动新的虚拟机;

        Ⅱ)一旦某些数据低于阈值,即将参数(比如,需要关闭的虚拟机名称等)传递给相关函数,关闭现有的某些虚拟机;

 

        比如,启动虚拟机:

static int start_vm(xen_session *session,xen_vm vm){    printf("Startingnew Virtual Machine now...\n");    xen_vm_start(session,vm, false, false);   print_vm_power_state(session, vm);    return 0;}
        
        关闭虚拟机:

static int shut_vm(xen_session *session,xen_vm vm){    printf("Shuttingdown Virtual Machine now...\n");   xen_vm_hard_shutdown(session, vm,false,false);   print_vm_power_state(session, vm);    return 0;}

        同样地,也可以执行克隆虚拟机、挂起虚拟机和恢复虚拟机等操作。

  

        Ⅲ)也可以由此Daemon(XS_CoreDecision)去启动一个bash脚本(先要将虚拟机的UUID传递给此脚本),用脚本去控制虚拟机的启动和关闭。

               比如,关闭一个虚拟机:

# Get name and state of the vmname=$(${XE} vm-list uuid=${vmuuid}params=name-label --minimal)state=$(${XE} vm-list uuid=${vmuuid}params=power-state --minimal)wasrunning=0 # If the VM state is running, shutdown thevmif [ "${state}" ="running" ]; then${XE}vm-shutdown uuid=${vmuuid}${XE}event-wait class=vm power-state=halted uuid=${vmuuid}wasrunning=1fi


需要说明的是,如果使用了HBA卡,那么,通过XenServer的SDK是无法访问HBA卡的相关信息的,只能通过HBA的工具软件获取相关信息。

 

原创粉丝点击