原文网址:
跟踪分析了:“从镜像启动”、“从镜像启动(创建一个新卷)”过程中,卷的创建是在_build_resources->_prep_block_device中创建的,而不是在
spawm->_create_image中创建的,而_create_image只是来在卷上创建镜像,或者说来组织镜像。
在这里看一下“从云硬盘启动”和“从镜像启动”、“从镜像启动(创建一个卷)”,在_prep_block_device中的差异.
这边创建的卷,不过是怎么_prep_block_device的?
cinder中创建的,nova调用了cinderclient的创建卷的命令,但其_prep_block_device做了什么?
中创建的还是调cinder创建的?在_prep_block_device中做了什么?
_prep_block_device,是准备哪些东西?
再深入看一下_prep_block_device的流程:
[python] view plain copy
- ->nova.compute.manager.ComputeManager._prep_block_device //准备块设备
- ->nova.compute.manager.ComputeManager.attach_block_devices
- ->nova.virt.block_device.attach_block_devices
- ->nova.virt.block_device.DriverImageBlockDevice.attach:volume_api.create //怀疑这里在不同的创建方式下走不同的流程
- ->Nova.volume.API.create
- ->nova.volume.cinder.API.create
- -> client = cinderclient(context) ; client.volumes.create(size, **kwargs)//调用cinder创建卷
确认:
DriverImageBlockDevice.attach:volume_api.create //怀疑这里在不同的创建方式下走不同的流程
确认这里在“从云硬盘启动”、“从镜像启动”、“从镜像启动(创建一个新卷)”三种方式下会走不同的流程
(1)“从镜像启动”:
一个也没有调用
nova.compute.manager.ComputeManager.attach_block_devices 有没有被调用
[python] view plain copy
1. ->nova.compute.manager.ComputeManager._prep_block_device //准备块设备
2. ->nova.compute.manager.ComputeManager.attach_block_devices
3. ->nova.virt.block_device.attach_block_devices
_create_image中做的,这里attach什么呢?是不是也要准备块设备?_create_image中只是下载?
看这时候有没有卷信息呢?
��看下nova.compute.manager.ComputeManager.attach_block_devices 有没有被调用?那几个类:DriverImageBlockDevice、DriverSnapshotBlockDevice、DriverBlankBlockDevice中的attach一个也没有调用
“从镜像启动”的_prep_block_device:在attach_block_devices这里就直接返回了,如下是“从镜像启动”的打印:
看这时候有没有卷信息呢?从镜像启动时,那几个类:DriverImageBlockDevice、DriverSnapshotBlockDevice、DriverBlankBlockDevice中的attach
一个也没有调用
nova.compute.manager.ComputeManager.attach_block_devices 有没有被调用
“从镜像启动(创建一个新卷)”的_prep_block_device:这里会去调用cinder的create建卷,和调用cinder的attach去挂载云硬盘。如下是“从镜像启动(创建一个新卷)”的log:
这里的调用流程:
[python] view plain copy
“从云硬盘启动”的_prep_block_device:这里不会去创建卷,因为卷已经存在了,所以这里会直接调用attach去挂载云硬盘。如下是“从云硬盘启动”的Log:
1. ->nova.compute.manager.ComputeManager._prep_block_device //准备块设备
2. ->nova.compute.manager.ComputeManager.attach_block_devices
3. ->nova.virt.block_device.attach_block_devices
4. ->nova.virt.block_device.DriverImageBlockDevice.attach
5. ->nova.virt.driver.create
6. ->nova.virt.libvrit.driver.create 创建一个新卷
7. ->nova.virt.block_device.DriverVolumeBlockDevice.attach (DriverVolumeBlockDevice是DriverImageBlockDevice的父类)
8. ->nova.virt.driver.attach
9. ->nova.virt.libvirt.driver.attach 挂载这个卷
流程如下:
[python] view plain copy
1. ->nova.compute.manager.ComputeManager._prep_block_device //准备块设备
2. ->nova.compute.manager.ComputeManager.attach_block_devices
3. ->nova.virt.block_device.attach_block_devices
4. ->nova.virt.block_device.DriverVolumeBlockDevice.attach (DriverVolumeBlockDevice是DriverImageBlockDevice的父类)
5. ->nova.virt.driver.attach
6. ->nova.virt.libvirt.driver.attach 挂载这个卷
也就是说,在_prep_block_device中的差别:
attach,因为这时候不存在一个卷,这个卷要在后面_create_image中创建
cinder的attach,去挂载这个卷,或者说挂载这个块设备,就是做block_device_mapping
cinder的create去创建一个卷,并且会去调用cinder的attach去挂载这个卷
这里的_prep_block_device方法的更深入的原理是什么?
【需要搞清楚】对这里的流程清楚了,就是调到了哪里。但原理还不够清楚,怎么调过去的,为什么就调到后面的nova.compute.manager.ComputeManager.attach_block_devices了,后面的nova.compute.manager.ComputeManager.attach_block_devices为什么有的会调create和attach,有的会调用attach而不调用create,有的create和attach都不会调用?【需要搞清楚】
详细解析:
的成员,所以attach_block_devices返回什么很重要。
attach_block_devices:
是什么意思,map是将第二个参数中的所有成员,在第一个参数的函数中执行一遍!
“从镜像启动(创建一个新卷)”打印:
,去调用实际的create和attach去创建卷和挂载卷。
“从镜像启动”打印:
,这里不会去建卷,更不会去挂载卷,都在后面的_create_image中来处理。这里经过再次确认,确实不会调用。
“从云硬盘启动”,打印:
map中的回调函数:_log_and_attach函数,去挂载已经创建好的云硬盘。
这里最根本的是要搞清楚:
block_device_mapping是什么?
map(_log_and_attach, block_device_mapping)做了什么?
这里还没搞明白,后面再研究。