简单说明一下,openstack创建虚拟机内幕!
实例的实际创建过程是通过调用libvirt函数来完成,在virt/Libvirt/driver.py中spawn方法来完成真正的虚拟机创建过程。
1 def spawn(self, context, instance, image_meta, injected_files,
2 admin_password, network_info=None, block_device_info=None):
3 disk_info = blockinfo.get_disk_info(CONF.libvirt_type,
4 instance,
5 block_device_info,
6 image_meta)
7 xml = self.to_xml(instance, network_info,
8 disk_info, image_meta,
9 block_device_info=block_device_info)
10
11 self._create_image(context, instance, xml,
12 disk_info['mapping'],
13 network_info=network_info,
14 block_device_info=block_device_info,
15 files=injected_files,
16 admin_pass=admin_password)
17
18 self._create_domain_and_network(xml, instance, network_info,
19 block_device_info)
20 LOG.debug(_("Instance is running"), instance=instance)
21
22 def _wait_for_boot():
23 """Called at an interval until the VM is running."""
24 state = self.get_info(instance)['state']
25
26 if state == power_state.RUNNING:
27 LOG.info(_("Instance spawned successfully."),
28 instance=instance)
29 raise utils.LoopingCallDone()
30
31 timer = utils.FixedIntervalLoopingCall(_wait_for_boot)
32 timer.start(interval=0.5).wait()
to_xml就是利用传过来的各种参数,来构造libvirt用来创建虚拟机的xml文件,其中_create_image函数比较的复杂呢,里边处理了和镜像相关的相关逻辑,如从glance中下载各种类型的所需的文件,并进行备份,将备份的文件考入实例对应的目录下作为实例实际的disk。
其中有几个非常重要的目录,系统的CONF.instances_path,也就是和实例相关的目录,实例所用到的文件都在此目录下,常见的目录是/var/lib/nova/instances,
查看目录文件:
.
├── _base
│ ├── 0f7c4295-d5e8-41a3-bc1a-79c99aa0f8f5
│ ├── 5f44ef07-3990-4207-a909-40d66157a21f
│ ├── 6841da6ee6638fb19178e74819c0edc08209259c
│ └── 6841da6ee6638fb19178e74819c0edc08209259c_20
├── instance-00000042
│ ├── console.log
│ ├── disk
│ ├── kernel
│ ├── libvirt.xml
│ └── ramdisk
└── snapshots
其中_base目录下存放着备份或者说缓存的镜像文件,snapshots放的是快照文件instance-xxxxx里边放的就是对应实例的相关文件console.log代表实例输出的日志,libvirt.xml就是libvirt用来生成实例的文件,disk就是对应实例的