作为个人学习笔记分享,有任何问题欢迎交流!
在openstack中创建虚拟机的底层实现是nova使用了libvirt,代码在nova/virt/libvirt/driver.py。
#image_meta:镜像的相关内容,#injected_files:要注入到VM的文件
#network_info:网络相关信息,block_device_info:磁盘相关信息
def spawn(self, context, instance, image_meta, injected_files,
admin_password, network_info=None, block_device_info=None):
#确定客户机的磁盘映射关系
disk_info = blockinfo.get_disk_info(CONF.libvirt.virt_type,
instance,
block_device_info,
image_meta)
#创建VM的磁盘文件
self._create_image(context, instance,
disk_info['mapping'],
network_info=network_info,
block_device_info=block_device_info,
files=injected_files,
admin_pass=admin_password)
#综合各方面的信息,拼装一个define VM的XML文件
xml = self.to_xml(context, instance, network_info,
disk_info, image_meta,
block_device_info=block_device_info,
write_to_disk=True)
#向neutron请求IP,然后使用xml创建domain
self._create_domain_and_network(context, xml, instance, network_info,
block_device_info)
下面将详细分析上述4个函数,比源代码略有删减
#virt_type: cpu_mode,一般为kvm,具体可参见该选项的注释
def get_disk_info(virt_type, instance, block_device_info=None,
image_meta=None, rescue=False):
#根据device_type和virt_type返回总线类型,如kvm和disk,则会返回virtio
#cdrom和kvm,则会返回ide
disk_bus = get_disk_bus_for_device_type(virt_type, image_meta, "disk")
cdrom_bus = get_disk_bus_for_device_type(virt_type, image_meta, "cdrom")
#确定怎样映射默认的disks到VM中,如root挂到/dev/vda等,还有swap, local等
mapping = get_disk_mappin