nova boot from volume无法注入密码的hack
前面有篇《nova boot from volume代码分析》http://iceyao.blog.51cto.com/9426658/1770927,今天这里看下针对nova boot from volume无法注入密码的简单hack。
nova/virt/libvirt/driver.py中_inject_data函数部分代码
ifany((key,net,metadata,admin_pass,files)):injection_p_w_picpath=self.p_w_picpath_backend.p_w_picpath(instance,'disk'+suffix,p_w_picpath_type)img_id=instance.p_w_picpath_refifnotinjection_p_w_picpath.check_p_w_picpath_exists():LOG.warn(_LW('Image%snotfoundondiskstorage.''Continuewithoutinjectingdata'),injection_p_w_picpath.path,instance=instance)return
其实主要问题是,nova boot from rbd volume的时候,虚拟机的系统盘是在云硬盘那里的,所以必须先定位云硬盘的位置,才可以注入密码。默认情况下boot from p_w_picpath,系统盘名字是<instance-uuid>_disk,boot from volume名字是volume-<volume-uuid>。
nova/virt/libvirt/p_w_picpathbackend.py
classRbd(Image):SUPPORTS_CLONE=Truedef__init__(self,instance=None,disk_name=None,path=None,**kwargs):super(Rbd,self).__init__("block","rbd",is_block_dev=False)ifpath:try:self.rbd_name=path.split('/')[1]exceptIndexError:raiseexception.InvalidDevicePath(path=path)else:self.rbd_name='%s_%s'%(instance.uuid,disk_name)ifnotCONF.libvirt.p_w_picpaths_rbd_pool:raiseRuntimeError(_('Youshouldspecify''p_w_picpaths_rbd_pool''flagtouserbdp_w_picpaths.'))self.pool=CONF.libvirt.p_w_picpaths_rbd_poolself.discard_mode=CONF.libvirt.hw_disk_discardself.rbd_user=CONF.libvirt.rbd_userself.ceph_conf=CONF.libvirt.p_w_picpaths_rbd_ceph_conf#这里的判断逻辑不是很严谨,纯碎演示ifnotinstance.p_w_picpath_ref:context=nova_context.get_admin_context()#获取bdmsbdms=(objects.BlockDeviceMappingList.get_by_instance_uuid(context,instance.uuid))connection_info=jsonutils.loads(bdms[0].connection_info)#获得系统盘volume-id,cinderrbdpoolself.rbd_name=connection_info['data']['name'].split('/')[1]self.pool=connection_info['data']['name'].split('/')[0]
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。