내 환경
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}')