一 介绍
创建一个虚拟机至少需要指定的参数有3个:虚拟机名字,镜像,Flavor。执行“nova image-list”命令可以看到目前可用的虚拟机镜像。
命令执行结果如下:
[root@localhost ~(keystone_demo)]# nova image-list
WARNING: Command image-list is deprecated and will be removed after Nova 15.0.0 is released. Use python-glanceclient or openstackclient instead
+--------------------------------------+--------+--------+--------+
| ID | Name | Status | Server |
+--------------------------------------+--------+--------+--------+
| 740a2773-9cc8-4222-8790-899df4b6d748 | cirros | ACTIVE | |
+--------------------------------------+--------+--------+--------+
创建一个名为test的虚拟机,使用flavor类型m1.tiny的命令如下:
[root@localhost ~(keystone_demo)]# nova boot --flavor m1.tiny --image cirros test
+--------------------------------------+-----------------------------------------------+
| Property | Value |
+--------------------------------------+-----------------------------------------------+
| OS-DCF:diskConfig | MANUAL |
| OS-EXT-AZ:availability_zone | |
| OS-EXT-STS:power_state | 0 |
| OS-EXT-STS:task_state | scheduling |
| OS-EXT-STS:vm_state | building |
| OS-SRV-USG:launched_at | - |
| OS-SRV-USG:terminated_at | - |
| accessIPv4 | |
| accessIPv6 | |
| adminPass | NeeWrsEoLP3Z |
| config_drive | |
| created | 2018-03-27T13:24:06Z |
| description | - |
| flavor | m1.tiny (1) |
| hostId | |
| id | 8c940566-5996-412b-a75f-96ccc5bf810d |
| image | cirros (740a2773-9cc8-4222-8790-899df4b6d748) |
| key_name | - |
| locked | False |
| metadata | {} |
| name | test |
| os-extended-volumes:volumes_attached | [] |
| progress | 0 |
| security_groups | default |
| status | BUILD |
| tags | [] |
| tenant_id | b38c09cb0b5a4d46820c66052bb0ee94 |
| updated | 2018-03-27T13:24:06Z |
| user_id | 7ed4ce59626941478efb08c37cad526e |
+--------------------------------------+-----------------------------------------------+
创建之后可以执行“nova list”查看虚拟机是否正常运行,下面是执行结果:
[root@localhost ~(keystone_demo)]# nova list
+--------------------------------------+------+---------+------------+-------------+-------------------+
| ID | Name | Status | Task State | Power State | Networks |
+--------------------------------------+------+---------+------------+-------------+-------------------+
| 57835459-1d60-40ae-b0c7-381bcbaba738 | test | SHUTOFF | - | Shutdown | private=10.0.0.3 |
| 8c940566-5996-412b-a75f-96ccc5bf810d | test | ACTIVE | - | Running | private=10.0.0.10 |
+--------------------------------------+------+---------+------------+-------------+-------------------+
在KVM环境下,使用Libvirt库提供的virsh命令创建一个虚拟机需要一个XML配置文件。
在Nova中创建一个虚拟机同样也需要这个XML配置文件,不同的是这个XML配置文件由Nova根据用户设定的参数自动生成。
针对packstack安装的openstack,Nova生成的配置文件都存放在/var/lib/nova/instances目录,这些配置文件很好体现了Nova在创建虚拟机时需要哪些参数信息。
[root@localhost 8c940566-5996-412b-a75f-96ccc5bf810d(keystone_demo)]# ll
total 2268
-rw-------. 1 root root 18994 Mar 27 21:24 console.log
-rw-r--r--. 1 qemu qemu 2293760 Mar 27 21:25 disk
-rw-r--r--. 1 nova nova 79 Mar 27 21:24 disk.info
8c940566-5996-412b-a75f-96ccc5bf810d表示新建虚拟机的UUID,这个目录下存放了该虚拟机的内核镜像等文件。
二 创建虚拟机过程
创建虚拟机的过程如下图
三 创建虚拟机代码调用关系
1文件 nova.api.openstack.coumpute.servers
1函数 def create(self, req, body):
1调用 (instances, resv_id) = self.compute_api.create(context,
2文件 nova.compute.api
2函数 def create(self, context, instance_type,
2调用 return self._create_instance(
3文件 nova.compute.api
3函数 def _create_instance(self, context, instance_type,
3调用 self.compute_task_api.build_instances(context,
4文件 nova.conductor.manager
4函数 def build_instances(self, context, instances, image, filter_properties,
5调用 hosts = self.scheduler_client.select_destinations(context,
6调用 self.compute_rpcapi.build_and_run_instance(context,
5文件 nova.scheduler.manager
5函数 def select_destinations(self, context, request_spec, filter_properties):
5调用 dests = self.driver.select_destinations(context, request_spec,
5文件 nova.scheduler.filter_scheduler
5函数 def select_destinations(self, context, request_spec, filter_properties):
6文件 nova.compute.api.manager
6函数 def build_and_run_instance(self, context, instance, image, request_spec,
6调用 self._do_build_and_run_instance(*args, **kwargs)
7文件 nova.compute.api.manager
7函数 def _do_build_and_run_instance(self, context, instance, image,
7调用 _build_and_run_instance
四 创建虚拟机过程解析
1 创建虚拟机等TaskAPI任务,已经由nova-conductor承担,因此nova-api监听到创建虚拟机HTTP请求后,会通过RPC调用nova.conductor.manager.ComputeTaskManager中的build_instances()方法。
2 nova-conductor会在build_instances()中生成request_spec字典,其中包括了详细的虚拟机信息,nova-scheduler依据这些信息为虚拟机选中一个最佳的主机,然后nova-conductor再通过RPC调用nova-computer创建虚拟机。
3 nova-compute首先会使用Resource Tracker的Claim机制检测一下主机的可用资源是否能够满足新建虚拟机的需要,然后通过具体的Virt Driver创建虚拟机。