QEMU/KVM: 런타임에 비디오 장치를 추가하는 방법

QEMU/KVM: 런타임에 비디오 장치를 추가하는 방법

내 환경

Kubuntu 20.04, WIN10 게스트 가상 머신 관리자 2.2.1, virsh 버전 6.0.0, 원격 뷰어 버전 7.0 포함

무슨 일이야?

현재 유형=QXL로 정의된 3개의 모니터와 3개의 비디오 노드가 있습니다.

부팅하고 가상 머신에 연결했습니다.

 virsh start win10
 remote-viewer -f spice://localhost:5900 

모두 괜찮습니다.

내 질문

cli(virsh start win10)에서 가상 머신을 시작하고 구성 파일의 비디오 노드 수를 어떻게 정의할 수 있습니까?

virsh start --add-video=type=qxl win10

분명히 --add-video가 존재하지 않습니다

나는 아무것도 묻지 않는다

버쉬 사용법편집하다cli의 구성 파일.

답변1

따라서 제가 거의 알지 못하는 주제에 대한 연구 결과에 따르면 virsh만으로는 구성 파일을 직접 편집하는 것이 불가능합니다.

Python을 빠르게 살펴본 후 이 스크립트를 함께 사용하여 작업을 수행할 수 있었습니다.

#!/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}')

관련 정보