虚拟化服务器部分相关的内容,简单整理下创建虚拟机这块的业务。
用户购买完云服务虚拟机后,会调用commander(生成指令的项目)将用户购买的虚拟机的配置信息进行处理,此处的处理指的是生成虚拟机磁盘操作指令,cfg虚拟机的配置文件,以及执行开机指令创建虚拟机。
指令生成后,进行cfg配置文件的生成,cfg配置文件分为模板安装和光盘安装分为两种格式,使用Java自带的VelocityHelper进行数据的模板话替换,生成所需的cfg文件。(生成的cfg文件路径为物理机挂载路径)。
通过MQ消息中间件,将生成的指令信息,以及所需的其他参数,发送到对应资源满足的宿主物理机上的agent中,agent收到创建云服务的消息后,解析获得的消息信息,获取对应的指令和参数。直接执行指令操作,并将指令结果,即云服务虚拟机是否创建成功结果返回给commander系统。
commander收到云服务创建的结果后,根据回调URL,调用UCenter中接口修改云服务以及云服务操作记录表。
创建虚拟机,分为模板创建和光盘安装两种方式。
以模板创建,创建两块磁盘为例。第一块磁盘命名为sda,第二块磁盘命名为sdb,依此类推,最多三块磁盘。若为光盘安装,则在此基础上另加一块sdd的光盘对应的磁盘。
第一步先执行移动磁盘的指令,将模板池中对应的已经生成的磁盘模板,移动到要安装的路径(磁盘路径)下。如果是0 lvm块磁盘,则 磁盘路径 = 存储池路径 + /- + 磁盘名称;如果是文件磁盘,则 磁盘路径 = 存储池路径 + 磁盘名称:
mv /storage/templatePool/sys/Windows2003_RD_Temp/Windows2003_RD_Temp_complete vg0/-server_a9o37pv26a8vya51_sda 或 mv /storage/templatePool/sys/Windows2003_RD_Temp/Windows2003_RD_Temp_complete /storage/nfs/server_a9o37pv26a8vya51_sda |
第二步,执行创建磁盘的指令,块磁盘对应lvcreate指令 或 文件磁盘对应qemu-img指令:
lvcreate -L 10G -n server_8y2x916102u47zm1_sdb vg0 或 qemu-img create -f raw /storage/nfs/server_8y2x916102u47zm1_sda 10G |
第三步,执行开机指令,xl create:
xl create /storage/nfs/XML/server_8y2x916102u47zm1.cfg |
如果为光盘安装,则没有第一步mv移动磁盘的指令,直接根据文件磁盘或块磁盘执行创建磁盘指令,以及开机指令。
Commander发给agent要执行的指令示例如下:
{ "dataDisk": [ "lvcreate -L 10G -n server_a9o37pv26a8vya51_sdb vg0" ], "param": [ { "memCapacity": "1024", "templatesPoolPath": "/storage/templatePool/sys/Windows2003_RD_Temp/" } ], "systemDisk": "mv <templatesPoolPath> /storage/nfs/server_a9o37pv26a8vya51_sda", "xenCommand": "xl create /storage/nfs/XML/server_a9o37pv26a8vya51.cfg" }
{ "dataDisk": [ "lvcreate -L 10G -n server_8y2x916102u47zm1_sdb vg0", "qemu-img create -f raw /storage/nfs/server_8y2x916102u47zm1_sda 10G" ], "param": [ { "memCapacity": "1024" } ], "xenCommand": "xl create /storage/nfs/XML/server_8y2x916102u47zm1.cfg" } |
指令格式示例: |
xl create <cfgPath> qemu-img create -f raw <diskPath> <diskSize> lvcreate -L <diskSize> -n <diskName> <diskPath> mv <templatesPoolPath> <diskPath> |
说明: <cfgPath>:从vm表中取元数据文件路径,加上虚拟机名称.cfg <diskPath>:从vmDisk表中取磁盘路径 <diskSize>:从vm表中取硬盘容量 <templatesPoolPath>:从虚拟磁盘存储表中取模板池路径,加上从模版镜像表中取模版镜像文件名 |
cfg文件示例(变化部分): |
# variable parameter name = "server_ocmze1gb29k89nz7" uuid = "47ec5a8e-b2dc-4f0f-9359-ed4b91efe0b4" maxmem = 16284 memory = 1024 vcpus = 4 vcpu_avail = 16 vncdisplay = 4103 vncpasswd = "WR0ZZH" vif = ["mac=00:16:3e:1f:f0:c0,bridge=xenbr0,rate=3Mb/s", "mac=00:16:3e:c0:08:d8,bridge=xenbr1"] disk = ["phy:/dev/mapper/vg0-server_ocmze1gb29k89nz7_sdb,sdb,w", "tap2:/storage/nfs/server_ocmze1gb29k89nz7_sda,sda,w", "file:,sdd:cdrom,r"] |