openstack:nova中“從映象啟動(建立一個新卷)”建立虛擬機器的流程
阿新 • • 發佈:2019-01-04
原文網址:http://blog.csdn.net/xiangpingli/article/details/47912777
nova還有一種啟動方式:“從映象啟動(建立一個新卷)”
這個流程中,nova會在_prep_block_device中的attach_block_device去呼叫cinder的create建立一個卷
然後會在_prep_block_device中的attach_block_device去呼叫cinder的attach掛載這個卷
然後才去spawn,孵化虛擬機器,在spawn中會呼叫_create_image來建立映象,這裡建立映象不是建立卷,卷是在_prep_block_device建立好的,除非是“從映象啟動”才會在
_create_image建立卷。
下面看下nova中“從映象啟動(建立一個新卷)”建立虛擬機器的流程:
- nova.api.openstack.compute.servers.Controller.create
- ->nova.compute.api.API.create
- ->nova.compute.api.API._create_instance
- ->nova.comductor.ComputeTaskAPI.build_instances
-
->nova.conductor. rpcapi.ComputeTaskAPI.build_instances
- ->nova.conductor. manager.ComputeTaskAPI.build_instances
- ->nova.compute.rpcapi.ComputeManager.build_and_run_instance
- ->nova.compute.manager.ComputeManager._do_build_and_run_instance
- ->nova.compute.manager.ComputeManager._build_and_run_instance //直到這裡,流程仍與前兩種建立虛擬機器的情況相同,看看最終是哪裡有差別
-
->nova.compute.manager.ComputeManager._build_resources
- ->nova.compute.manager.ComputeManager._build_networks_for_instance //準備網路資源
- ->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
- ->nova.virt.driver.create
- ->nova.virt.libvrit.driver.create 建立一個新卷
- ->nova.virt.block_device.DriverVolumeBlockDevice.attach (DriverVolumeBlockDevice是DriverImageBlockDevice的父類)
- ->nova.virt.driver.attach
- ->nova.virt.libvirt.driver.attach 掛載這個卷
- ->nova.virt.libvirt.driver.LibvirtDriver.spawn
- //再回過頭來梳理下spawn,是不是這時候塊裝置都有了呢?之前的流程是不是有點問題?
- //是不是塊裝置在_prep_block_device都建好了,後面只是向裡面填不同的內容?
- //那麼spawn中的_create_image 又做了什麼呢?上面的_prep_block_device和spawn中的_create_image分別做什麼?看起來都像建卷?
- //事實上,是一個建卷(_prep_block_device只是塊裝置,裡面沒有東西)而一個是在捲上組織映象(_create_image之前卷已經存在,這裡只是組織映象)
- //另外考慮分支情況:(1)如果卷存在_prep_block_device流程怎麼走?(2)如果從雲硬碟啟動_create_image流程怎麼走
- //也就是說把分支情況也要考慮好
- 接上面:
- ->nova.virt.libvirt.driver.LibvirtDriver.spawn
- ->Nova.virt.libvirt.driver._create_image //組織映象
- 這裡會檢查是從雲硬碟啟動,還是不從雲硬碟啟動:
- booted_from_volume = self._is_booted_from_volume(
- instance, disk_mapping)
- ...
- ifnot booted_from_volume:
- ->Nova.virt.libvirt.driver._try_fetch_image_cache
- ->Nova.virt.libvirt.imagebackend.Image.cache
- ->Nova.virt.libvirt.imagebackend.Qcow2.create_image
- ->Nova.virt.libvirt.imagebackend.Qcow2.create_image:prepare_template即fetch_image
- ->Nova.virt.libvirt.utils.fetch_image
- ->Nova.virt.images.fetch_to_raw
- ->Nova.virt.images.fetch #下載系統映象到/var/lib/nova/instances/_base/目錄
- ->nova.image.glance.GlanceImageService.download
- ->nova.image.glance.GlanceClientWrapper.call
- ->Nova.virt.images.convert_image #若映象不是raw格式,且nova.conf中force_raw_images=True,則將backing file強制轉換為raw格式
- ->Nova.virt.libvirt.imagebackend.Qcow2.create_image:copy_qcow2_image
- ->nova.virt.libvirt.utils.create_cow_image