首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QEMU/KVM:如何在运行时添加视频设备

QEMU/KVM:如何在运行时添加视频设备
EN

Unix & Linux用户
提问于 2021-10-03 00:23:23
回答 1查看 233关注 0票数 0

我的环境

Kubuntu20.04,虚拟机管理器2.2.1和WIN10来宾,virsh版本6.0.0,远程查看器版本7.0

什么在起作用

目前,我已经有3个监视器和定义了3个视频节点与type=QXL。

我启动并附加到我的VM

代码语言:javascript
复制
 virsh start win10
 remote-viewer -f spice://localhost:5900 

一切都运转得很好。

我的问题

在cli (virsh win10)中,如何/我可以启动VM并在配置文件中定义视频节点的数量?

i.e

代码语言:javascript
复制
virsh start --add-video=type=qxl win10

显然--添加视频不存在。

我要问的不是

如何使用virsh从cli中编辑配置文件。

EN

回答 1

Unix & Linux用户

发布于 2021-10-03 23:19:57

因此,根据我对一个主题的研究,我对以下这个主题知之甚少:不可能单独使用virsh直接编辑配置文件。

在快速深入研究python之后,我能够将完成此工作的脚本组合在一起。

代码语言:javascript
复制
#!/usr/bin/python3

import xml.etree.ElementTree as ET
import libvirt
import sys
import os

desired_number_of_monitors = 3
domain_name = 'win10'
remote_viewer_config_path = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'remote-viewer-win10-connection.ini')

if not os.path.exists(remote_viewer_config_path):
    print(f'could not find {remote_viewer_config_path}: try again')
    sys.exit(1)

if len(sys.argv) >= 2:
    desired_number_of_monitors = int(sys.argv[1])

try:
    libvert_con = libvirt.open(None)
except libvirt.libvirt.libvirtError:
    print('Failed to open connection to the hypervisor')
    sys.exit(1)

try:
    win10_domain = libvert_con.lookupByName(domain_name)    
except libvirt.libvirtError:
    print(f'Failed to find domain {domain_name}')
    sys.exit(1)

try:
    raw_xml = win10_domain.XMLDesc(0)  
except libvirt.libvirtError:
    print(f'Failed to get xml from domain {domain_name}')
    sys.exit(1)

try:
    tree = ET.ElementTree(ET.fromstring(raw_xml))
    devices = tree.find('.//devices')

    #remove all video nodes
    for v in devices.findall('video'):
        devices.remove(v)
        
    #add the desired number of video nodes
    while desired_number_of_monitors  > len(devices.findall('video')):
        video = ET.Element('video')
        video.append(ET.fromstring("<model type='qxl'></model>"))
        video.append(ET.fromstring("<address type='pci'></address>"))
        devices.append(video)

    #the updated xml configuration
    output_xml = ET.tostring(tree.getroot(),encoding='unicode')
except Exception as e:
    print(f'failed to edit the xml for {domain_name} : {e}')

try:
    win10_domain = libvert_con.defineXML(output_xml)
    #if the domain is running stop exit
    if win10_domain.isActive():
        print(f'{win10_domain.name()} is running: try again')
        sys.exit(1)
    else:
        #start the vm? am I actually re-creating the vm or just starting it and does it matter
        if win10_domain.create() < 0:
            print(f'Failed to start the {win10_domain.name()} domain')
        else:
            print(f'{win10_domain.name()} vm started')
            os.system(f'remote-viewer -f {remote_viewer_config_path}')
except Exception as e2:
    print(f'failed to start update or start {domain_name} : {e2}')
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/671589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档