<html>
原文地址(http://www.wangdk.com/?p=58)
网上查找CloudStack源代码的文章还是非常少的。不像OpenStack那样多,花了两天的时间,将CloudStack 创建VM的源代码读了一遍,感叹几点:创建一个VM流程中,查询操作数据库真多。
前几天听 CloudStack 的人说。CloudStack Management Server 装在一个16G/4C 的物理机上,执行半年,会挂掉。当时那个汗啊。。。
先把整理的流程图附上
以下依照每一个步骤进行说明:
1、com.cloud.api.ApiServlet.processRequest(HttpServletRequest, HttpServletResponse) 函数处理全部请求。
详细处理登录、登出请求其它请求进行转发,进入下一步
2、com.cloud.api.ApiServer.handleRequest(Map, String, StringBuffer)
收到创建VM的请求,解析參数依据參数“command” 实例化处理该API的类,并将请求參数赋值到该类创建的对象。对于创建VM,实例化的类为:
org.apache.cloudstack.api.command.user.vm.DeployVMCmd。
因为继承自BaseAsyncCreateCmd,所以须要首先调用DeployVMCmd的create函数,再调用execute函数
Note:基于注解赋值:com.cloud.api.ApiDispatcher.processParameters(BaseCmd, Map<String, String>),权限管理也是通过注解完毕的。
3、org.apache.cloudstack.api.command.user.vm.DeployVMCmd.create()
3.1 检查zone、serviceoffering、templateId、diskoffering、zone是否启用了本地存储、获取ipv4,、ipv6地址,推断是基本zone,还是高级zone
3.2 假设是基本zone,须要调用函数
com.cloud.vm.UserVmManagerImpl.createBasicSecurityGroupVirtualMachine(DataCenter,ServiceOffering, VirtualMachineTemplate, List<Long>, Account, String, String, Long, Long, String, HypervisorType, HTTPMethod, String, String, Map<Long, IpAddresses>, IpAddresses, Boolean, String, List<Long>, Map<String, String>)
3.3 假设是高级zone。首先推断该zone是否启用了安全组。假设启用了安全组。调用函数
com.cloud.vm.UserVmManagerImpl.createAdvancedSecurityGroupVirtualMachine(DataCenter, ServiceOffering, VirtualMachineTemplate, List<Long>, List<Long>, Account, String, String, Long, Long, String, HypervisorType, HTTPMethod, String, String, Map<Long, IpAddresses>, IpAddresses, Boolean, String, List<Long>, Map<String, String>)
假设没有启用安全组,调用函数:
com.cloud.vm.UserVmManagerImpl.createAdvancedVirtualMachine(DataCenter, ServiceOffering, VirtualMachineTemplate, List<Long>, Account, String, String, Long, Long, String, HypervisorType, HTTPMethod, String, String, Map<Long, IpAddresses>, IpAddresses, Boolean, String, List<Long>, Map<String, String>)
以在基本zone创建VM为例,进行源代码阅读
4、函数
com.cloud.vm.UserVmManagerImpl.createBasicSecurityGroupVirtualMachine(DataCenter,ServiceOffering, VirtualMachineTemplate, List<Long>, Account, String, String, Long, Long, String, HypervisorType, HTTPMethod, String, String, Map<Long, IpAddresses>, IpAddresses, Boolean, String, List<Long>, Map<String, String>)
(4.1) 依据zoneId 获取该zone内的默认网络,运行的SQL
select *from networks where data_center_id=1 and account_id=1 and guestType=’Shared’ and traffic_type=’Guest’;
将查询到的默认网络保存到内存,后面使用.(须要将虚拟机增加到该网络,进行管理)
(4.2) 推断虚拟机模板是否为vmware类型,或者 hypervisor 是否为vmware,两张有一个为true。假设配置了安全组策略。则报错。
(即眼下不支持vmware 虚拟机配置安全组)
(4.3) 检查该zone是否支持安全组,查询数据表ntwk_service_map ,确定该网络是否支持安全组服务。假设存在,还有检查服务的提供者是否存在(在数据表ntwk_service_map 存放)。
查询数据表configuration,当中的network.securitygroups.defaultadding 字段,设置为true表示能够将VM增加默认安全组。(这个时候会进行检查是否存在默认安全组,假设不存在,创建一个安全组,存入数据库)
(4.4) 查询该用户是否有安全组。假设有的话。将该安全组增加虚拟机安全组列表。假设该用户不存在安全组。为该用户创建默认安全组,并增加到虚拟机安全组列表
security_group 数据表中加入数据
insert into security_group (‘name’,’domain_id’,’account_id’,’description’) values (....)
Note:1、CloudStack不支持vmware配置安全组。在高级zone内,仅仅支持KVM主机配置安全组。
2、仅仅能在guest网络中配置安全组
5、 函数:
com.cloud.vm.UserVmManagerImpl.createVirtualMachine(DataCenter, ServiceOffering, VirtualMachineTemplate, String, String, Account, Long, Long, List<NetworkVO>, List<Long>, String, HTTPMethod, String, String, HypervisorType, Account, Map<Long, IpAddresses>, IpAddresses, Boolean, String, List<Long>, Map<String, String>)
(5.1) 查询虚拟机模板详情,查询数据表 vm_template。查询数据表dedicated_resources,推断该zone是否进行了domain划分。查看用户在domain是否有权限进行操作。
查询serviceoffering信息,假设设置了自己定义serviceoffering參数,须要进行參数设置。
(5.2) 获取模板大小,以及diskoffering的磁盘大小,检查该用户的cpu,memory资源是否足够,查询卷是否足够,查询主存储是否有足够空间 (涉及到的数据表resource_limit)
(5.3) hypervisor 不是裸金属时,检查存储池。禁止使用系统模板创建系统虚拟机
(5.4) 配置网卡信息。设置默认网卡。数据库获取vm的id,检查新建的虚拟机主机名是否合法,假设没有设置主机名,系统会生成一个。生成虚拟机名称
(5.5) 运行存储vm操作。见步骤6
(5.6) 将VM增加security group 和affinitygroup
6、
com.cloud.vm.UserVmManagerImpl.commitUserVm(DataCenter, VirtualMachineTemplate, String, String, Account, Long, Long, String, HypervisorType, Account, Boolean, String, long, ServiceOfferingVO, boolean, String, LinkedHashMap<String, NicProfile>, long, String, String, HypervisorType, Map<String, String>)
(6.1)构造 com.cloud.vm.UserVmVO.UserVmVO(long, String, String, long, HypervisorType, long, boolean, boolean, long, long, long, String, String, Long)。存放虚拟机信息
(6.2) 当主机为vmware,推断是否须要进行链接克隆。通过设置vmware.create.full.clone
(6.3) 设置 主机标签。假设是使用iso创建虚拟机进入函数:
org.apache.cloudstack.engine.orchestration.CloudOrchestrator.createVirtualMachineFromScratch(String, String, String, String, String, String, String, int, int, long, Long, List<String>, List<String>, Map<String, NicProfile>, DeploymentPlan)
使用非iso创建虚拟机
org.apache.cloudstack.engine.orchestration.CloudOrchestrator.createVirtualMachine(String, String, String, String, String, String, int, int, long, Long, List<String>, List<String>, Map<String, NicProfile>, DeploymentPlan)
(6.4) 将使用的资源存放到数据库
7、函数
org.apache.cloudstack.engine.orchestration.CloudOrchestrator.createVirtualMachineFromScratch(String, String, String, String, String, String, String, int, int, long, Long, List<String>, List<String>, Map<String, NicProfile>, DeploymentPlan)
设置rootdisk和nic
8、函数
com.cloud.vm.VirtualMachineManagerImpl.allocate(String, VirtualMachineTemplate, ServiceOffering, Pair<? extends DiskOffering, Long>, LinkedHashMap<?
extends DiskOffering, Long>, LinkedHashMap<? extends Network, List<? extends NicProfile>>, DeploymentPlan, HypervisorType)
(8.1) 调用network manager 分配网络
依据networkid 查询数据表networks,获取guru_name,推断调用哪个network adapter。
基本zone。没有安全组,使用的是DirectPodBasedNetworkGuru
调用函数com.cloud.network.guru.DirectPodBasedNetworkGuru.allocate(Network, NicProfile, VirtualMachineProfile) 。获取网卡的IP、网关,mac地址等信息
将网卡数据存入数据库
(8.2) 调用volume manager 分配卷。分为root盘和data盘,将数据存入数据库
9、运行函数org.apache.cloudstack.api.command.user.vm.DeployVMCmd.execute()
推断是否启动虚拟机。假设是,运行第10步,假设不是。仅仅须要从数据库获取虚拟机信息
10、com.cloud.vm.UserVmManagerImpl.startVirtualMachine(DeployVMCmd)
(10.1) 仅仅有admin用户能够在创建VM的时候指定创建VM,构造部署策略(选择数据中心,提供点,群集,主机,物理网络。资源池)
(10.2) 数据库查询虚拟机的相关信息。调用
com.cloud.vm.VirtualMachineManagerImpl.advanceStart(String, Map<Param, Object>, DeploymentPlan, DeploymentPlanner)
11、函数
com.cloud.vm.VirtualMachineManagerImpl.orchestrateStart(String, Map<Param, Object>, DeploymentPlan, DeploymentPlanner)
(11.1) 确认部署计划中,虚拟机卷所在的主存储相应的群集。与选择的群集同样,依据VM配置选择部署的目的(数据中心。提供点。群集,主机。存储)
(11.2) 假设用户没有设置VM的cpu。memory 超分配系数,则该VM的超分配系数採用群集的超分配系数
(11.3) 准备网络与存储
12函数
com.cloud.agent.manager.AgentManagerImpl.send(Long, Commands)
将创建虚拟机的信息传到 KVM主机
13、
com.cloud.agent.Agent.processRequest(Request, Link)
cloudstack-agent 收到请求。依据agent.properties 中的resource的设置,确定将请求转发到哪种hypervisor进行处理,假设是KVM,则转到14步
14、com.cloud.hypervisor.kvm.resource.LibvirtComputingResource.executeRequest(Command)
依据參数类型确定详细运行哪个操作,构造libvirt须要的參数创建虚拟机
- 本文已收录于下面专栏:
相关文章推荐
-
CloudStack 系统虚拟机
系统虚拟机: Ø 二级存储虚拟机(Secondary Storage VM):主要用来管理二级存储。 Ø 控制台代理虚拟机(Console Proxy VM):用于在 web 界面上展示控制台。...
- cuixingbing
- 2014-08-02 11:10
- 408
-
CloudStack管理VMware遇到的问题
话说前段安装了CloudStack并使用它来管理XenServer。这回要用它来管理VMware。虽说之前遇到了大大小小的问题都攻克了,但在VMware这一块还是遇到了一些麻烦。 在创建资源域、添...
- flyforfreedom2008
- 2015-08-16 11:16
- 1141
-
CloudStack + XenServer 部署 – XenServer集群的安装和配置(4).
CloudStack + XenServer 部署 – XenServer集群的安装和配置(4). 发表于 2012 年 10 月 19 日 由 Steven 本文将依据设计文档, ...- wangdk789
- 2014-04-29 21:31
- 1518
-
Cloudstack+XenServer配置和管理一个简单的云平台
Cloudstack+XenServer配置和管理一个简单的云平台 基本配置:Cloudstack4.3。XenServer6.2 操作系统:centos6.6-mini-x64 基本介绍...- u011289922
- 2015-11-19 17:05
- 1300
-
构建私有云平台cloudstack集群配置及不中断迁移測试
CloudStack 是一个开源的具有高可用性及扩展性的云计算平台。眼下Cloudstack支持管理大部分主流的hypervisors,如KVM。XenServer,VMware,Oracle...
- u010970855
- 2014-02-01 17:46
- 575
-
CloudStack4.3.2手动设置虚拟机IP总结
CloudStack手动设置虚拟机IP总结 一、现象 CloudStack 4.2.0版本号及兴许版本号。在界面添加每一个虚拟能够设置辅助IP的功能。假设不在界面中设置辅助IP,而是直接在虚拟机手动设置...
- xdgouzongmei
- 2016-10-07 11:51
- 391
-
搭建hypervisor类型为VMWare的cloudstack环境
第一步,安装必须的软件 1、须要的软件例如以下,普通情况下是採用二层虚拟化的方式进行安装: windows server2008,esxi-5.0 2、安装完毕上述软件后。用VSphere client登...- LOVE____JAVA
- 2013-11-01 18:24
- 1358
-
CloudStack管理员文档 - 虚拟机
关于虚拟机 管理员全然控制着客户虚拟机的生命周期。 客户虚拟机能够配置为高可用的,高可用的虚拟机会被系统监控,假设系统检測到虚拟机被关闭,会尝试重新启动该虚拟机。而且可能在另外一个host重新启动该虚拟机...- u012124304
- 2017-08-01 23:35
- 41
-
CloudStack 系统虚拟机
系统虚拟机: Ø 二级存储虚拟机(Secondary Storage VM):主要用来管理二级存储。 Ø 控制台代理虚拟机(Console Proxy VM):用于在 web 界面上展示控制台。 ...- rumenxinshou
- 2014-01-28 11:03
- 6658
-
用 CloudStack 配置和管理一个简单云
转载,文章来自developerworks。 http://www.ibm.com/developerworks/cn/cloud/library/1303_chenyz_cloudstack/ ...- carolzhang8406
- 2017-02-22 10:10
- 465
1条评论