[PATCH 00/21] Fix compatibility with netdev-add in qemu-5.0
by Peter Krempa
This is based on top of
tests: qemu: Detect deprecation in the QMP schema (deprecation part 1)
https://www.redhat.com/archives/libvir-list/2020-April/msg01444.html
Both can be fetched at:
git fetch https://gitlab.com/pipo.sk/libvirt.git netdev_add-validate
QEMU-5.0 released a fully QAPIfied 'netdev_add' command. Since we didn't
format the arguments in a way qemu now thinks we should do them network
device hotplug broke. Fix it by modifying our internals slightly and add
some testing.
This series also adds schema testing of -blockdev arguments and prepares
for a simple addition of schema testing for arguments of -device and
-object if qemu ever finishes the qapification of those. Theoretically
we can even do it pre-emtptively but it's almost guaranteed to fail at
least for -device. I just hope that qemu let's us know in advance as
-device will be harder.
Note that if the loading of the schema in the tests I've added will be
deemed to be slow I'll add caching.
Peter Krempa (21):
qemu: domain: Forbid unsupported 'tftp' protocol and handle tests
qemuMonitorJSONParseKeywords: remove constant argument
qemuBuildChannelsCommandLine: Use typecasted switch for channel type
qemuBuildChannelsCommandLine: Extract common formatting of 'chardev'
qemuBuildChannelChrDeviceStr: Remove formatting of properties for
-netdev
qemuBuildHostNetStr: Stop using 'ipv6-net' convenience argument
virQEMUBuildCommandLineJSON: Allow skipping certain keys
virQEMUBuildCommandLineJSON: Add possibility for using 'on/off'
instead of 'yes/no'
virCommand: Introduce virCommandGetArgList
util: json: Introduce virJSONValueObjectAppendStringPrintf
testCompareXMLToArgv: Split out preparation and command formatting
qemuMonitorJSON(Add|Remove)Netdev: Refactor cleanup
util: virqemu: Introduce virQEMUBuildNetdevCommandlineFromJSON
qemu: command: Generate -netdev command line via JSON->cmdline
conversion
virQEMUBuildNetdevCommandlineFromJSON: Prepare for quirky 'guestfwd'
qemuBuildChannelGuestfwdNetdevProps: Convert to generating JSON props
qemuMonitorAddNetdev: Convert to the native JSON props object
qemu: Prepare for testing of 'netdev_add' props via qemuxml2argvtest
testQEMUSchemaLoad: Rename to testQEMUSchemaLoadLatest
testutilsqemuschema: Allow loading non-latest schema
qemuxml2argvtest: Add QAPI/QMP schema validation for -blockdev and
-netdev
src/libvirt_private.syms | 3 +
src/qemu/qemu_command.c | 289 +++++++++++-------
src/qemu/qemu_command.h | 22 +-
src/qemu/qemu_domain.c | 10 +
src/qemu/qemu_driver.c | 2 +-
src/qemu/qemu_hotplug.c | 31 +-
src/qemu/qemu_monitor.c | 8 +-
src/qemu/qemu_monitor.h | 2 +-
src/qemu/qemu_monitor_json.c | 76 ++---
src/qemu/qemu_monitor_json.h | 2 +-
src/qemu/qemu_process.c | 11 +-
src/qemu/qemu_process.h | 1 +
src/util/vircommand.c | 23 ++
src/util/vircommand.h | 1 +
src/util/virjson.c | 17 ++
src/util/virjson.h | 2 +
src/util/virqemu.c | 119 +++++++-
src/util/virqemu.h | 18 +-
tests/Makefile.am | 2 +-
tests/qemublocktest.c | 2 +-
tests/qemucommandutiltest.c | 2 +-
tests/qemuhotplugtest.c | 2 +-
tests/qemumonitorjsontest.c | 6 +-
.../qemuxml2argvdata/disk-cdrom-network.args | 3 -
.../disk-cdrom-network.x86_64-2.12.0.args | 3 -
.../disk-cdrom-network.x86_64-latest.args | 17 +-
tests/qemuxml2argvdata/disk-cdrom-network.xml | 9 -
tests/qemuxml2argvdata/net-user-addr.args | 3 +-
tests/qemuxml2argvtest.c | 236 +++++++++-----
tests/testutilsqemu.c | 5 +
tests/testutilsqemu.h | 1 +
tests/testutilsqemuschema.c | 66 ++--
tests/testutilsqemuschema.h | 5 +-
33 files changed, 667 insertions(+), 332 deletions(-)
--
2.26.2
4 years, 6 months
[libvirt PATCH 0/2] fix a leak in virQEMUDriverConfigLoadMemoryEntry
by Ján Tomko
Thanks to valgrind
Ján Tomko (2):
qemu: do not leak the directory in virQEMUDriverConfigLoadMemoryEntry
qemu: only return two values in virQEMUDriverConfigLoadMemoryEntry
src/qemu/qemu_conf.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
--
2.25.4
4 years, 6 months
[PATCH v2] qemuProcessStop: Reattach NVMe disks a domain is mirroring into
by Michal Privoznik
In v5.10.0-rc1~42 (which was later fixed in v6.0.0-rc1~487) I am
removing XATTRs for a file that QEMU is mirroring a disk into but
it is killed meanwhile. Well, we can call
qemuSecurityRestoreImageLabel() which will not only remove XATTRs
but also use them to restore the original owner of the file.
Moreover, if the mirror destination is not a file but a NVMe
disk, then call qemuHostdevReAttachOneNVMeDisk() to reattach the
NVMe back to the host.
All of this would be done by blockjob code when the job finishes,
but in this case the job won't finish - QEMU is killed meanwhile.
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1825785
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
v2 of:
https://www.redhat.com/archives/libvir-list/2020-May/msg00210.html
diff to v1:
- per Peter's review, instead of calling qemuDomainStorageSourceAccessRevoke()
call only some functions it would call.
src/qemu/qemu_process.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 8ea470f75f..65d51e58c9 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -7604,8 +7604,13 @@ void qemuProcessStop(virQEMUDriverPtr driver,
for (i = 0; i < def->ndisks; i++) {
virDomainDiskDefPtr disk = def->disks[i];
- if (disk->mirror)
- qemuBlockRemoveImageMetadata(driver, vm, disk->dst, disk->mirror);
+ if (disk->mirror) {
+ if (qemuSecurityRestoreImageLabel(driver, vm, disk->mirror, false) < 0)
+ VIR_WARN("Unable to restore security label on %s", disk->dst);
+
+ if (virStorageSourceChainHasNVMe(disk->mirror))
+ qemuHostdevReAttachOneNVMeDisk(driver, vm->def->name, disk->mirror);
+ }
qemuBlockRemoveImageMetadata(driver, vm, disk->dst, disk->src);
}
--
2.26.2
4 years, 6 months
[libvirt PATCH v2 00/10] qemu: block: basic implementation of deletion of external snapshots
by Pavel Mores
Deleting external snapshots has been unimplemented so far. This series aims
to enable limited functionality in that direction, handling just the common
cases for now. The intention is to subsequently build upon this to eventually
cover the more complex/exotic cases as well.
It works by blockcommitting the snapshot to be deleted into its parent.
Handles both deleting children as well and deleting children only (by
committing the children into the snapshot referred to by snapshot-delete
argument). If the necessary block commit operations turns out to be active
(the snapshot referred to by snapshot-delete argument is current, or
deleting children is requested) pivot is performed as well.
This implemetation is limited to the straightforward case which assumes no
branching snapshot chains below the snapshot to be deleted, and the current
snapshot has to be the leaf of the (linear) chain starting at the snapshot
to be deleted. These requirements are checked and enforced at the top of
qemuDomainSnapshotDeleteExternal(). They might even be too restrictive for
the case where deletion of children is not requested as in that case,
requiring that the parent of the snapshot to be deleted not be a branching
point in snapshot tree should be enough.
The above limitations do not appear too severe under the current state of
matters where a major source of branching snapshot structures,
snapshot-revert, is not even implemented for external snapshots yet. The
only other known cause of branching in external snapshots thus seems to be
if a user creates branching by manually creating snapshot images and
metadata and applies them using snapshot-create --redefine.
Also, the snapshot images involved basically have to be files. This does
not seem overly limiting either, at least for the time being, because it's
a limitation shared with the underlying blockcommit code. Just as the
existing code, the new code ultimately relies on
virStorageFileChainLookup() as its image comparison and look-up engine and
is affected by its limitaions.
At any rate, this work should be understood as just a first step to a full
support of deleting external snapshots.
The first 5 commits of this series are just refactors used by the last 5
commits which actually implement snapshot deletion. However, the
qemuDomainBlockCommit() refactor (the initial 2 commits of this series) was
affected by a rather hairy merge on rebasing to the current master and
although I tried to do my best to get the merge right I still feel a
careful review is in order for these two commits.
Pavel Mores (10):
qemu: block: factor implementation out of qemuDomainBlockCommit()
qemu: block: refactor blockcommit so that it's callable with storage
sources
qemu: block: factor implementation out of qemuDomainBlockJobAbort()
conf: rename virDomainMomentFindLeaf() to
virDomainMomentObjListFindLeaf()
conf: add virDomainMomentFindLeaf() which operates on
virDomainMomentObjPtr
qemu: block: add function to collect blockcommit params and verify
them
qemu: block: add function to launch all prepared blockcommits
qemu: block: add function to wait for blockcommits and collect results
qemu: block: add external snapshot-delete top-level algorithm
qemu: block: add actual invocation of external snapshot-delete
src/conf/virdomaincheckpointobjlist.c | 2 +-
src/conf/virdomainmomentobjlist.c | 27 +-
src/conf/virdomainmomentobjlist.h | 3 +-
src/libvirt_private.syms | 1 +
src/qemu/qemu_driver.c | 552 ++++++++++++++++++++++----
5 files changed, 485 insertions(+), 100 deletions(-)
--
2.24.1
4 years, 6 months
[PATCH] RFC: Support network interface downscript
by Chen Hanxiao
https://gitlab.com/libvirt/libvirt/-/issues/13
Add support for downscript:
<interface type='ethernet'>
<mac address='00:11:22:33:44:55'/>
<script path='/etc/qemu-ifup'/>
<downscript path='/path/to/my/downscript'/>
</interface>
But -net ...,script=/etc/qemu-ifup has some limitation:
https://github.com/qemu/qemu/blob/035b448b84f3557206abc44d786c5d3db2638f7...
Maybe virNetDevRunEthernetScript is another choice.
Signed-off-by: Chen Hanxiao <chen_han_xiao(a)126.com>
---
src/conf/domain_conf.c | 7 +++++++
src/conf/domain_conf.h | 1 +
src/qemu/qemu_extdevice.c | 2 ++
3 files changed, 10 insertions(+)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c201fc9..5cb39a3 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2520,6 +2520,7 @@ virDomainNetDefClear(virDomainNetDefPtr def)
VIR_FREE(def->teaming.persistent);
VIR_FREE(def->virtPortProfile);
VIR_FREE(def->script);
+ VIR_FREE(def->downscript);
VIR_FREE(def->domain_name);
VIR_FREE(def->ifname);
VIR_FREE(def->ifname_guest);
@@ -11977,6 +11978,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
g_autofree char *ifname_guest = NULL;
g_autofree char *ifname_guest_actual = NULL;
g_autofree char *script = NULL;
+ g_autofree char *downscript = NULL;
g_autofree char *address = NULL;
g_autofree char *port = NULL;
g_autofree char *localaddr = NULL;
@@ -12149,6 +12151,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
} else if (!script &&
virXMLNodeNameEqual(cur, "script")) {
script = virXMLPropString(cur, "path");
+ } else if (!downscript &&
+ virXMLNodeNameEqual(cur, "downscript")) {
+ downscript = virXMLPropString(cur, "path");
} else if (!domain_name &&
virXMLNodeNameEqual(cur, "backenddomain")) {
domain_name = virXMLPropString(cur, "name");
@@ -12482,6 +12487,8 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
if (script != NULL)
def->script = g_steal_pointer(&script);
+ if (downscript != NULL)
+ def->downscript = g_steal_pointer(&downscript);
if (domain_name != NULL)
def->domain_name = g_steal_pointer(&domain_name);
if (ifname != NULL)
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index ddc75d8..e152c59 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1055,6 +1055,7 @@ struct _virDomainNetDef {
unsigned long sndbuf;
} tune;
char *script;
+ char *downscript;
char *domain_name; /* backend domain name */
char *ifname; /* interface name on the host (<target dev='x'/>) */
int managed_tap; /* enum virTristateBool - ABSENT == YES */
diff --git a/src/qemu/qemu_extdevice.c b/src/qemu/qemu_extdevice.c
index 2096272..f8e440a 100644
--- a/src/qemu/qemu_extdevice.c
+++ b/src/qemu/qemu_extdevice.c
@@ -234,6 +234,8 @@ qemuExtDevicesStop(virQEMUDriverPtr driver,
if (slirp)
qemuSlirpStop(slirp, vm, driver, net);
+ if (net->downscript)
+ virNetDevRunEthernetScript(net->ifname, net->downscript);
}
for (i = 0; i < def->nfss; i++) {
--
1.8.3.1
4 years, 6 months
[PATCH] Unlock the storage pool objects after looking it up
by Yi Li
The lock should be released.
Signed-off-by: Yi Li <yili(a)winhong.com>
---
src/conf/virstorageobj.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c
index 13b75b648d..9f24ae67ca 100644
--- a/src/conf/virstorageobj.c
+++ b/src/conf/virstorageobj.c
@@ -2077,8 +2077,10 @@ virStoragePoolObjListExport(virConnectPtr conn,
virObjectRWLockRead(poolobjs);
- if (pools && VIR_ALLOC_N(data.pools, virHashSize(poolobjs->objs) + 1) < 0)
- goto error;
+ if (pools && VIR_ALLOC_N(data.pools, virHashSize(poolobjs->objs) + 1) < 0) {
+ virObjectRWUnlock(poolobjs);
+ return -1;
+ }
virHashForEach(poolobjs->objs, virStoragePoolObjListExportCallback, &data);
virObjectRWUnlock(poolobjs);
--
2.25.3
4 years, 6 months
[PATCH trivial 1/1] qemu_alias.c: fix qemuAssingDeviceMemballoonAlias() typo
by Daniel Henrique Barboza
Signed-off-by: Daniel Henrique Barboza <danielhb413(a)gmail.com>
---
src/qemu/qemu_alias.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c
index b0ea62af39..d6527cb046 100644
--- a/src/qemu/qemu_alias.c
+++ b/src/qemu/qemu_alias.c
@@ -390,7 +390,7 @@ qemuAssignDeviceSmartcardAlias(virDomainSmartcardDefPtr smartcard,
static int
-qemuAssingDeviceMemballoonAlias(virDomainMemballoonDefPtr memballoon,
+qemuAssignDeviceMemballoonAlias(virDomainMemballoonDefPtr memballoon,
int idx)
{
if (memballoon->info.alias)
@@ -662,7 +662,7 @@ qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps)
}
if (def->memballoon &&
def->memballoon->model != VIR_DOMAIN_MEMBALLOON_MODEL_NONE) {
- if (qemuAssingDeviceMemballoonAlias(def->memballoon, 0) < 0)
+ if (qemuAssignDeviceMemballoonAlias(def->memballoon, 0) < 0)
return -1;
}
for (i = 0; i < def->nrngs; i++) {
--
2.26.2
4 years, 6 months
[PATCH v3 0/9] Introducing TPM Proxy device support for PPC64
by Daniel Henrique Barboza
changes in v3 after reviews from Stefan Berger:
- new patch 4: trivial change to allow g_autoptr() with
virDomainTPMDefPtr
- patch 5 (former 4): added g_autoptr(), removed VIR_FREE() calls
- changed wording in patches 1 and 9 (former 8) to make it
clear for users that this new device brings no benefits unless
the guest is running on specialized PPC64 hardware
- fixed identation in patch 6 (former 5). Added Stefan's r-b
v2 link: https://www.redhat.com/archives/libvir-list/2020-May/msg00604.html
v1 link: https://www.redhat.com/archives/libvir-list/2020-May/msg00604.html
Daniel Henrique Barboza (9):
docs: documentation and schema for the new TPM Proxy model
qemu: Extend QEMU capabilities with 'spapr-tpm-proxy'
conf, qemu: adding 'tpmproxy' in domain definition
conf, domain: register AUTOPTR_CLEANUP_FUNC for virDomainTPMDef
domain_conf.c: XML parsing for VIR_DOMAIN_TPM_MODEL_SPAPR_PROXY
tests: add XML schema tests for the TPM Proxy device
qemu: build command line for the TPM Proxy device
tests/qemuxml2argvtest.c: add TPM Proxy command line tests
docs/news.xml: update for the new TPM Proxy device
docs/formatdomain.html.in | 18 +++++-
docs/news.xml | 17 +++++
docs/schemas/domaincommon.rng | 1 +
src/conf/domain_audit.c | 3 +
src/conf/domain_conf.c | 63 +++++++++++++++++--
src/conf/domain_conf.h | 3 +
src/qemu/qemu_alias.c | 16 +++++
src/qemu/qemu_capabilities.c | 4 ++
src/qemu/qemu_capabilities.h | 3 +
src/qemu/qemu_cgroup.c | 12 +++-
src/qemu/qemu_command.c | 21 +++++++
src/qemu/qemu_domain.c | 9 +--
src/qemu/qemu_validate.c | 12 ++++
src/security/security_dac.c | 14 +++++
src/security/security_selinux.c | 11 ++++
.../qemucapabilitiesdata/caps_4.2.0.ppc64.xml | 1 +
.../qemucapabilitiesdata/caps_5.0.0.ppc64.xml | 1 +
tests/qemuxml2argvdata/ppc64-tpm-double.xml | 34 ++++++++++
.../ppc64-tpmproxy-double.xml | 38 +++++++++++
.../ppc64-tpmproxy-single.ppc64-latest.args | 34 ++++++++++
.../ppc64-tpmproxy-single.xml | 33 ++++++++++
.../ppc64-tpmproxy-with-tpm.ppc64-latest.args | 37 +++++++++++
.../ppc64-tpmproxy-with-tpm.xml | 36 +++++++++++
tests/qemuxml2argvtest.c | 15 +++++
.../ppc64-tpmproxy-single.ppc64-latest.xml | 42 +++++++++++++
.../ppc64-tpmproxy-with-tpm.ppc64-latest.xml | 46 ++++++++++++++
tests/qemuxml2xmltest.c | 2 +
27 files changed, 514 insertions(+), 12 deletions(-)
create mode 100644 tests/qemuxml2argvdata/ppc64-tpm-double.xml
create mode 100644 tests/qemuxml2argvdata/ppc64-tpmproxy-double.xml
create mode 100644 tests/qemuxml2argvdata/ppc64-tpmproxy-single.ppc64-latest.args
create mode 100644 tests/qemuxml2argvdata/ppc64-tpmproxy-single.xml
create mode 100644 tests/qemuxml2argvdata/ppc64-tpmproxy-with-tpm.ppc64-latest.args
create mode 100644 tests/qemuxml2argvdata/ppc64-tpmproxy-with-tpm.xml
create mode 100644 tests/qemuxml2xmloutdata/ppc64-tpmproxy-single.ppc64-latest.xml
create mode 100644 tests/qemuxml2xmloutdata/ppc64-tpmproxy-with-tpm.ppc64-latest.xml
--
2.26.2
4 years, 6 months
[libvirt PATCH] qemu: prevent attempts to detach a device on a controller with hotplug='off'
by Laine Stump
Although the original patches to support controllers with
hotplug='off' were checking during hotplug/attach requests that the
device was being plugged into a PCI controller that didn't have
hotplug disabled, but I forgot to do the same for device detach (the
main impetus for adding the feature was to prevent unplugs originating
from within the guest, so it slipped my mind). So although the guest
OS was ultimately unable to honor the unplug request, libvirt could
still be used to make such a request, and since device attach/detach
are asynchronous operations, the caller to libvirt would receive a
success status back (the device would stubbornly/correctly remain in
the domain status XML however)
This patch remedies that, by looking at the controller for the device
in the detach request, and immediately failing the operation if that
controller has hotplug=off.
r changes. Lines starting
Signed-off-by: Laine Stump <laine(a)redhat.com>
---
src/qemu/qemu_hotplug.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index ab5a7aef84..5fe125b1a7 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -5891,6 +5891,33 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm,
return -1;
}
+ if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
+ int controllerIdx = virDomainControllerFind(vm->def,
+ VIR_DOMAIN_CONTROLLER_TYPE_PCI,
+ info->addr.pci.bus);
+ if (controllerIdx < 0) {
+ virReportError(VIR_ERR_OPERATION_FAILED,
+ _("cannot hot unplug %s device with PCI guest address: "
+ VIR_PCI_DEVICE_ADDRESS_FMT
+ " - controller not found"),
+ virDomainDeviceTypeToString(detach.type),
+ info->addr.pci.domain, info->addr.pci.bus,
+ info->addr.pci.slot, info->addr.pci.function);
+ return -1;
+ }
+
+ if (vm->def->controllers[controllerIdx]->opts.pciopts.hotplug
+ == VIR_TRISTATE_SWITCH_OFF) {
+ virReportError(VIR_ERR_OPERATION_FAILED,
+ _("cannot hot unplug %s device with PCI guest address: "
+ VIR_PCI_DEVICE_ADDRESS_FMT
+ " - not allowed by controller"),
+ virDomainDeviceTypeToString(detach.type),
+ info->addr.pci.domain, info->addr.pci.bus,
+ info->addr.pci.slot, info->addr.pci.function);
+ return -1;
+ }
+ }
/*
* Issue the qemu monitor command to delete the device (based on
* its alias), and optionally wait a short time in case the
--
2.25.4
4 years, 6 months
Firmware auto-select limitation
by GUOQING LI
Hi everyone and Martin
I would like to confirm the conversation we had in regard the possible limitation of firmware auto-select feature that’s been released since v5.20. I recall you saying that there were a lot of issues with auto select and later they shipped it into a Json file , it still didn’t solve all the problems, did it?
Is it better to explicitly specify the loader and nvram path than using auto-select ?
Just today, I encountered the issue of using firmware=“efi” on libvirt 5.4.0
I am running Ubuntu eoan 19.10, I am wondering how did it happen.
Detailed error
Error starting domain: internal error: process exited while connecting to monitor: 2020-05-15T14:19:06.033267Z qemu-system-x86_64: -drive file=/usr/share/OVMF/OVMF_CODE.fd,if=pflash,format=raw,unit=0,readonly=on: Failed to lock byte 100
Traceback (most recent call last):
File "/usr/share/virt-manager/virtManager/asyncjob.py", line 75, in cb_wrapper
callback(asyncjob, *args, **kwargs)
File "/usr/share/virt-manager/virtManager/asyncjob.py", line 111, in tmpcb
callback(*args, **kwargs)
File "/usr/share/virt-manager/virtManager/object/libvirtobject.py", line 66, in newfn
ret = fn(self, *args, **kwargs)
File "/usr/share/virt-manager/virtManager/object/domain.py", line 1279, in startup
self._backend.create()
File "/usr/lib/python3/dist-packages/libvirt.py", line 1080, in create
if ret == -1: raise libvirtError ('virDomainCreate() failed', dom=self)
libvirt.libvirtError: internal error: process exited while connecting to monitor: 2020-05-15T14:19:06.033267Z qemu-system-x86_64: -drive file=/usr/share/OVMF/OVMF_CODE.fd,if=pflash,format=raw,unit=0,readonly=on: Failed to lock byte 100
4 years, 6 months