OpenStack之Nova分析——创建虚拟机(八)

时间:2022-09-23 19:58:38

上篇文章分析了虚拟机磁盘镜像文件的创建过程,接下来要进行的工作便是定义虚拟机定义XML文件以及虚拟机网络创建和虚拟机创建。关于虚拟机定义XML文件就是对虚拟机的一些描述,其创建过程就不再展开了。我们直接来继续分析虚拟机创建的最后环节——虚拟机和虚拟网络的创建。

虚拟机和虚拟网络的创建定义在_create_domain_and_network方法中,来看这个方法

class LibvirtDriver(driver.ComputeDriver):
def _create_domain_and_network(self, xml, instance,
network_info, block_device_info=None):
...
#创建虚拟机OpenVSwitch断点
self.plug_vfs(instance, network_info)
...
#创建虚拟机
domain = self._create_domain(xml, instance=instance)
return domain
_create_domain_and_network方法主要做了2件事

1. 调用plug_vifs方法创建虚拟机的OpenVSwitch端点

2. 调用_create_domain方法创建虚拟机

这里只分析_create_domain方法,其定义如下

class LibvirtDriver(driver.ComputeDriver):
def _create_domain(self, xml=None, domain=None,
instance=None, launch_flags=0):
#获取虚拟机镜像文件的存储路径
if instance:
inst_path = libvirt_utils.get_instance_path(instance)
...
#定义虚拟机
if xml:
domain = self._conn.defineXML(xml)
#创建虚拟机
domain.createWithFlags(launch_flags)
...
return domain
_create_domain方法首先调用_conn成员变量的defineXML方法定义一个虚拟机,相当于执行了virsh define命令。这里的_conn是一个virConnect对象。virConnect类是libvirt包中定义的一个标准类,它创建并维护了一个与libvirtd服务的连接,它的defineXML方法会返回新定义虚拟机的virDomain对象。virDomain类也是libvirt包中定义的一个标准类。然后调用virDomain对象的createWithFlags启动新定义的虚拟机。相当于执行了virsh start命令。

前面几篇文章已经通过大量的篇幅分析了虚拟机的创建过程,在整个的创建过程中,我们相继分析了涉及到的Nova API、Nova Scheduler、Nova Compute服务,而实际上在虚拟机创建的流程中还包括虚拟网络的创建过程,这里并没有介绍,后面有机会再花时间写这方面的文章吧。

最后,这篇通过一个简单的流程图,再次对虚拟机的创建过程做一个总结,作为我们分析虚拟机创建过程的一个收尾:

OpenStack之Nova分析——创建虚拟机(八)