你好,游客 登录 注册 搜索
背景:
阅读新闻

禁止CloudStack删除Xenserver原有虚拟机

[日期:2013-08-13] 来源:Linux社区  作者:u011650565 [字体: ]

CloudStack在文档中指明需要加入一台干净的Xenserver作为hyperviser。

但是实际使用中,总会存在不同的需求,很多场景是试用CloudStack接管当前已有的hyperviser而非完整重新部署,那么之前在hyperviser中启动的vm,则会被判断为非CloudStack管理而被关闭或删除,如此则会产生对现有环境的不良影响。现实部署环境中,总有些情况,是要求保留现有环境中已有的vm。

以Xenserver为例,非CS管理的vm,会被关闭,CS对于xenserver中vm生命周期的管理比较特殊,在关闭vm之后,还会删除vm实例,只保留磁盘文件,即vdi,这样的结果,对于原有vm设置并不熟悉的管理员来说,相当于噩梦一般的存在了。

推荐阅读:

CloudStack 4.0 + KVM 安装详细指南 http://www.linuxidc.com/Linux/2013-06/85750.htm
CloudStack部署手册 PDF清晰版 http://www.linuxidc.com/Linux/2013-06/86114.htm
安装部署CloudStack 4.0企业私有云平台 http://www.linuxidc.com/Linux/2013-06/85748.htm
CloudStack安装部署与常见问题解决 http://www.linuxidc.com/Linux/2013-06/85746.htm

那么我们从代码中来看一下为什么虚拟机会被删除。以CS 4.0.2为例:
在XenCenter中新建一台vm,等待一段时间就会发现,该vm关机并且消失了。
此时查看log,会发现如下信息:
2013-08-05 20:19:47,038 WARN [cloud.vm.VirtualMachineManagerImpl](DirectAgent-84:null) Found an alien VM Windows 7 (32-bit) (1)
2013-08-05 20:19:47,038 DEBUG[cloud.vm.VirtualMachineManagerImpl] (DirectAgent-84:null) Cleaningup a VM that is no longer found : Windows 7 (32-bit) (1)
2013-08-05 20:19:47,045 DEBUG [agent.transport.Request](DirectAgent-84:null) Seq 1-229638607: Sending  {Cmd , MgmtId: 345049672023, via: 1, Ver: v1, Flags: 100111,[{"StopCommand":{"isProxy":false,"vmName":"Windows 7 (32-bit)(1)","wait":0}}] }
2013-08-05 20:19:47,045 DEBUG [agent.transport.Request](DirectAgent-84:null) Seq 1-229638607: Executing: { Cmd , MgmtId: 345049672023, via: 1, Ver: v1,Flags: 100111, [{"StopCommand":{"isProxy":false,"vmName":"Windows 7(32-bit) (1)","wait":0}}] }
“Windows 7 (32-bit) (1)” 是我所建vm的名字。

第一行log出现在VirtualMachineManagerImpl.java中的convertToInfos(Map>)方法中,

    protected Map<Long, AgentVmInfo> convertToInfos(final Map<String, Pair<String, State>> newStates) {
        final HashMap<Long, AgentVmInfo> map = new HashMap<Long, AgentVmInfo>();
        if (newStates == null) {
            return map;
        }
        Collection<VirtualMachineGuru<? extends VMInstanceVO>> vmGurus = _vmGurus.values();
        boolean is_alien_vm = true;
        long alien_vm_count = -1;
        for (Map.Entry<String, Pair<String, State>> entry : newStates.entrySet()) {
         is_alien_vm = true;
            for (VirtualMachineGuru<? extends VMInstanceVO> vmGuru : vmGurus) {
                String name = entry.getKey();
                VMInstanceVO vm = vmGuru.findByName(name);
                if (vm != null) {
                    map.put(vm.getId(), new AgentVmInfo(entry.getKey(), vmGuru, vm, entry.getValue().second(), entry.getValue().first()));
                    is_alien_vm = false;
                    break;
                }
                Long id = vmGuru.convertToId(name);
                if (id != null) {
                    map.put(id, new AgentVmInfo(entry.getKey(), vmGuru, null, entry.getValue().second(), entry.getValue().first()));
                    is_alien_vm = false;
                    break;
                }
            }
            // alien VMs
            if (is_alien_vm){
             map.put(alien_vm_count--, new AgentVmInfo(entry.getKey(), null, null, entry.getValue().second(), entry.getValue().first()));
             s_logger.warn("Found an alien VM " + entry.getKey());
            }
        }
        return map;
    }

该方法会在开始定义一个map作为返回值,之后遍历db中所有的vm(vmGurus)并与newStates比较,判断为alien的vm会赋一个负数值,并放入map中返回给上一级方法,其中map的value是newAgentVmInfo(),传入参数中guru和vm为null。上一级方法调用者为:deltaSync和fullSync。

接下来请看第2页精彩内容http://www.linuxidc.com/Linux/2013-08/88693p2.htm

linux
相关资讯       XenServer  CloudStack 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款