OpenStack快照分析:(三)从磁盘启动云主机离线(在线)快照分析 (4)

            #  'status': u'creating',
            #  'display_name': u'snapshot for snapshot1',
            #  'created_at': u'2016-06-24T09:23:00.517279',
            #  'display_description': u'',
            #  'volume_size': 20,
            #  'volume_id': u'60e16af2-0684-433c-a1b6-c1af1c2523fc',
            #  'progress': None,
            #  'project_id': u'25520b29dce346d38bc4b055c5ffbfcb',
            #  'id': u'cede2421-ea68-4a8e-937d-c27074b9024b',
            #  'size': 20
            # }

            snapshot = self.volume_api.create_snapshot_force(
                context
, volume['id'], name, volume['display_description'])
           
# 接着会根据bdm信息,来构建快照的dict格式属性信息,返回一个BlockDeviceDict对象,属性如下:
            # {
            #  'guest_format': None,
            #  'boot_index': 0,
            #  'no_device': None,
            #  'connection_info': None,
            #  'snapshot_id': u'cede2421-ea68-4a8e-937d-c27074b9024b',
            #  'volume_size': 20,
            #  'device_name': u'/dev/vda',
            #  'disk_bus': u'virtio',
            #  'image_id': None,
            #  'source_type': 'snapshot',
            #  'device_type': u'disk',
            #  'volume_id': None,
            #  'destination_type': 'volume',
            #  'delete_on_termination': False
            # }

            mapping_dict = block_device.snapshot_from_bdm(snapshot[
'id'], bdm)
           
# 过滤掉已经在数据库中存在的字段
            mapping_dict = mapping_dict.get_image_mapping()
           
# 将云主机所有的映射关系都添加到mapping
            mapping.append(mapping_dict)
        
return mapping

   
self._record_action_start(context, instance, instance_actions.CREATE_IMAGE)
   
# 调用“snapshot_instance”,获取云主机所有的mapping关系
    mapping = snapshot_instance(
self, context, instance, bdms)

   
# 如果此时卷的文件系统已静默,这里则进行解冻处理,实现过程就是通过rpc.case发送异步请求给nova-compute
    # nova-compute
接收到消息后,会等到快照完成后对文件系统进行解冻(需要agent支持)
   
if quiesced:
       
self.compute_rpcapi.unquiesce_instance(context, instance, mapping)

   
# 更新云主机metadata信息中的properties信息
   
if mapping:
        properties[
'block_device_mapping'] = mapping
        properties[
'bdm_v2'] = True
    #
到这一步时,会到添加一条记录到glance快照(镜像)数据库条目
    #
(会在Dashboard的镜像面板显示一条名为snapshot1的快照记录)
    #
快照的大部分信息都拷贝至系统盘属性,这是因为卷快照是可以直接用来启动云主机的,
    #
另外'block_device_mapping'属性中包含所有的volume设备快照信息(如果有的话),
    #
每个volume设备快照信息作为一条记录,记录在image_properties数据表;
    #
      {
         'name': u'snapshot1',
         'min_ram': u'0',
         'min_disk': u'20',
         'is_public': False,
         'properties': {
                 'bdm_v2': True,
                 'block_device_mapping': [{
                          'guest_format': None,
                          'boot_index': 0,
                          'no_device': None,
                          'image_id': None,
                          'volume_id': None,
                          'device_name': u'/dev/vda',
                          'disk_bus': u'virtio',
                          'volume_size': 20,
                          'source_type': 'snapshot',
                          'device_type': u'disk',
                          'snapshot_id': u'cede2421-ea68-4a8e-937d-c27074b9024b',
                          'destination_type': 'volume',
                          'delete_on_termination': False
                 }],
                 'base_image_ref': u'',
                 'root_device_name': u'/dev/vda'
         },
         'size': 0
    }
   
return self.image_api.create(context, image_meta)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxggp.html