1. 创建流程
本次分析主要从Nova.compute.manger入手,对于创建虚拟机的API请求以及调度不做分析。创建虚拟机入口函数为_run_instance,manger中driver初始化是根据配置文件中的配置信息,默认为compute_driver = libvirt.LibvirtDriver。具体函数调用关系如下图。
+---------------------+
|buildinstance |
+---+-----------------+
| +--------------------+
+--------| _prebuild_instance |
| +--------------------+
| +--------------------+
+--------| _build_instance |
+-+------------------+
| +--------------------------------------+
+---| network_info = self._allocate_network|
| +--------------------------------------+
| +--------------------------------------------+
+---| block_de|ice_info = self._prep_block_device|
| +--------------------------------------------+
| +------------------------------------------+
+---| instance = self._spawn |
+-+----------------------------------------+
| +------------------+
+--|self.driver.spawn |
++-----------------+
| +--------------+
+--| _create_image|
| +--------------+
| +--------------+
+--| to_xml |
| +--------------+
| +--------------+-------------+
+--| _create_domain_and_network |
| +----------------------------+
| +----------------+
+--| Wait for boot |
+----------------+
`
创建虚拟机流程分为以下大的3步:
(1) 申请网络:_allocate_network
(2) 准备块存储设备:_prep_block_device
(3) 调用driver创建虚拟机:spawn
2. 状态图
创建虚拟机过程,VM State、Task State、Power State如下图所示,虚拟机的状态始终未building,任务状态发生了三次改变。
3 block_device_info
在prep_block_device函数中,会调用Cinder的initialize_connection()和attach(),返回值为block_device_info。函数执行完后,卷会挂载到本地,供虚拟机使用。
(1)从镜像启动虚拟机block_device_info值为:
{
'block_device_mapping': [],
'root_device_name': '/dev/vda',
'ephemerals': [],
'swap': None
}
(2)从硬盘启动block_device_info值为:
{
'block_device_mapping': [{
'guest_format': None,
'boot_index': 0,
'mount_device': u'vda',
'connection_info':{
'driver_volume_type': u'iscsi',
'serial': u'8fc07771-130e-4fc4-8cb0-0d47bc316cd4',
'data': {
u'access_mode': u'rw',
u'target_discovered': False,
u'encrypted': False,
u'qos_spec': None,
u'target_iqn': u'iqn.2010-10.org.openstack:volume-8fc07771-130e-4fc4-8cb0-0d47bc316cd4',
u'target_portal': u'186.100.21.222:3260',
u'volume_id': u'8fc07771-130e-4fc4-8cb0-0d47bc316cd4',
u'target_lun': 1,
u'auth_password': u'2goCZgd7Wb7sLwLBhA73',
u'auth_username': u'2sXoCUUoZcpajxK2L7T8',
u'auth_method': u'CHAP'
}
},
'disk_bus': None,
'device_type': None,
'delete_on_termination': False
}],
'root_device_name': u'vda',
'ephemerals': [],
'swap': None
}
转载请注明:爱开源 » Nova虚拟机创建流程
