OpenStack桌面虚拟化支持USB重定向和声卡

公司测试OpenStack的桌面虚拟化,默认情况下生成的libvirt的xml是不支持USB重定向和声卡,最快捷的方法就是,Hack下源码,硬加进去: vim /usr/lib/python2.6/site-packages/nova/virt/libvirt/driver.py
    def to_xml(self, context, instance, network_info, disk_info,
               image_meta=None, rescue=None,
               block_device_info=None, write_to_disk=False):
        # We should get image metadata every time for generating xml
        if image_meta is None:
            (image_service, image_id) = glance.get_remote_image_service(
                                            context, instance['image_ref'])
            image_meta = compute_utils.get_image_metadata(
                                context, image_service, image_id, instance)
        # NOTE(danms): Stringifying a NetworkInfo will take a lock. Do
        # this ahead of time so that we don't acquire it while also
        # holding the logging lock.
        network_info_str = str(network_info)
        LOG.debug(_('Start to_xml '
                    'network_info=%(network_info)s '
                    'disk_info=%(disk_info)s '
                    'image_meta=%(image_meta)s rescue=%(rescue)s'
                    'block_device_info=%(block_device_info)s'),
                  {'network_info': network_info_str, 'disk_info': disk_info,
                   'image_meta': image_meta, 'rescue': rescue,
                   'block_device_info': block_device_info},
                  instance=instance)
        conf = self.get_guest_config(instance, network_info, image_meta,
                                     disk_info, rescue, block_device_info)
        pre_xml = conf.to_xml()
        hack_xml = """



  


  


  






  


"""
        tar_obj = ''
        libvit_obj = minidom.parseString(pre_xml)
        hack_obj = minidom.parseString(hack_xml)
        for c_lib_obj in libvit_obj.childNodes[0].childNodes:
            if (isinstance(c_lib_obj, minidom.Element) and c_lib_obj.tagName == 'devices'):
                c_lib_obj.childNodes.extend(hack_obj.childNodes[0].childNodes)

        xml = libvit_obj.toxml()
        if write_to_disk:
            instance_dir = libvirt_utils.get_instance_path(instance)
            xml_path = os.path.join(instance_dir, 'libvirt.xml')
            libvirt_utils.write_to_file(xml_path, xml)

        LOG.debug(_('End to_xml xml=%(xml)s'),
                  {'xml': xml}, instance=instance)
        return xml
简单的说,就是让Nova生成libvirt xml的时候,硬编码进去相关的xml标签,好暴力,但是高效好用!

8 个评论

班长好,我搭建的OpenStack环境也需要USB重定向,但是安装你的方法把代码加进去后,并没有在生成的实例xml文件中增加关于USB的标签信息,还是原来的那些内容? 我是关闭实例后重启,xml是重新生成了,但内容没变,不知是我那里配置的问题吗? 另外我的python是2.7(/usr/lib/python2.7/site-packages/nova/virt/libvirt/driver.py)
以下是我加的代码: ---------------------------------------------------------------------- def _get_guest_xml(self, context, instance, network_info, disk_info, image_meta, rescue=None, block_device_info=None, write_to_disk=False): # NOTE(danms): Stringifying a NetworkInfo will take a lock. Do # this ahead of time so that we don't acquire it while also # holding the logging lock. network_info_str = str(network_info) msg = ('Start _get_guest_xml ' 'network_info=%(network_info)s ' 'disk_info=%(disk_info)s ' 'image_meta=%(image_meta)s rescue=%(rescue)s ' 'block_device_info=%(block_device_info)s' % {'network_info': network_info_str, 'disk_info': disk_info, 'image_meta': image_meta, 'rescue': rescue, 'block_device_info': block_device_info}) # NOTE(mriedem): block_device_info can contain auth_password so we # need to sanitize the password in the message. LOG.debug(strutils.mask_password(msg), instance=instance) conf = self._get_guest_config(instance, network_info, image_meta, disk_info, rescue, block_device_info, context) pre_xml = conf.to_xml() hack_xml = """ <append> <controller type='usb' index='0' model='ich9-ehci1'/> <controller type='usb' index='0' model='ich9-uhci1'> <master startport='0'/> </controller> <controller type='usb' index='0' model='ich9-uhci2'> <master startport='2'/> </controller> <controller type='usb' index='0' model='ich9-uhci3'> <master startport='4'/> </controller> <redirdev bus='usb' type='spicevmc'/> <redirdev bus='usb' type='spicevmc'/> <redirdev bus='usb' type='spicevmc'/> <redirdev bus='usb' type='spicevmc'/> <sound model='ich6'> <alias name='sound0'/> </sound> </append> """ tar_obj = '' libvit_obj = minidom.parseString(pre_xml) hack_obj = minidom.parseString(hack_xml) for c_lib_obj in libvit_obj.childNodes[0].childNodes: if (isinstance(c_lib_obj, minidom.Element) and c_lib_obj.tagName == 'devices'): c_lib_obj.childNodes.extend(hack_obj.childNodes[0].childNodes) xml = libvit_obj.toxml() if write_to_disk: instance_dir = libvirt_utils.get_instance_path(instance) xml_path = os.path.join(instance_dir, 'libvirt.xml') libvirt_utils.write_to_file(xml_path, xml) LOG.debug('End _get_guest_xml xml=%(xml)s', {'xml': xml}, instance=instance) return xml -----------------------------------------------------------------------------------
demo

demo 回复 8happyer

把/usr/lib/python2.7/site-packages/nova/virt/libvirt/文件夹下的driver.pyc和driver.pyo文件删除或改个名,你修改的driver.py就可以生效了
班长好,请教个问题,在我的平台下没有/usr/lib/python2.6/site-packages这个目录,我找到一个/usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py文件,然后把你的code,贴到def _get_guest_xml里,然后关闭和重启实例后,发现use redirection还是没有打开,感觉实例启动的时候没有执行我修改的driver.py,请问这是为啥,我修改的文件不对吗?多谢回答。
大牛好,请教个问题,在我的平台下没有/usr/lib/python2.6/site-packages这个目录,我找到一个/usr/lib/python2.7/dist-packages/nova/virt/libvirt/driver.py文件,然后把你的code,贴到def _get_guest_xml里,然后关闭和重启实例后,发现use redirection还是没有打开,感觉实例启动的时候没有执行我修改的driver.py,请问这是为啥,我修改的文件不对吗?多谢回答。
但就用我的吧。
创建虚拟机,并成功创建,,所加xml的代码,并没有生成
openstack会先将py代码编译成pyc格式字节码以提高效率,光修改py代码不行,需要重新编译才能生效,删除pyc格式文件就可以了

要回复文章请先登录注册