On Wed, Jul 16, 2025 at 02:17:46PM +0100, Mark Cave-Ayland wrote:
The hardware UUID (hwuuid) element provides a mechanism to supply an
external
UUID to the guest, as opposed to the libvirt domain UUID. This is to allow
for the scenario whereby a domain can be stopped, cloned and then started as
a new domain without altering the guest-visible UUID.
Add the element, documentation and core code for the hwuuid feature along
with an implementation for the QEMU driver.
Signed-off-by: Mark Cave-Ayland <mark.caveayland(a)nutanix.com>
---
docs/formatdomain.rst | 7 ++++++
src/conf/domain_conf.c | 38 ++++++++++++++++++++++++++++---
src/conf/domain_conf.h | 1 +
src/conf/schemas/domaincommon.rng | 5 ++++
src/qemu/qemu_command.c | 6 ++++-
5 files changed, 53 insertions(+), 4 deletions(-)
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index 9a2f065590..7b10dfa3da 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -54,6 +54,13 @@ General metadata
:since:`Since 0.8.7`, it is also possible to provide the UUID via a
`SMBIOS System Information`_ specification.
+``hwuuid``
+ The optional ``hwuuid`` element can be used to supply an alternative UUID for
+ identifying the virtual machine from the domain ``uuid`` above. The difference
+ between using the ``hwuuid`` element and simply providing an alternative UUID
+ via a `SMBIOS System Information`_ specification is that the ``hwuuid`` affects
+ all devices that expose the UUID to the guest.
+ :since:`Since 11.6.0 QEMU/KVM only`
``genid``
:since:`Since 4.4.0`, the ``genid`` element can be used to add a Virtual
Machine Generation ID which exposes a 128-bit, cryptographically random,
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index bfc62b6270..63603ca527 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -13098,6 +13098,7 @@ static int
virSysinfoSystemParseXML(xmlNodePtr node,
xmlXPathContextPtr ctxt,
virSysinfoSystemDef **sysdef,
+ unsigned char *hwUUID,
unsigned char *domUUID,
bool uuid_generated)
{
@@ -13122,11 +13123,18 @@ virSysinfoSystemParseXML(xmlNodePtr node,
}
if (uuid_generated) {
memcpy(domUUID, uuidbuf, VIR_UUID_BUFLEN);
- } else if (memcmp(domUUID, uuidbuf, VIR_UUID_BUFLEN) != 0) {
+ } else if (!virUUIDIsValid(hwUUID) &&
+ memcmp(domUUID, uuidbuf, VIR_UUID_BUFLEN) != 0) {
virReportError(VIR_ERR_XML_DETAIL, "%s",
_("UUID mismatch between <uuid> and
<sysinfo>"));
return -1;
}
+ if (virUUIDIsValid(hwUUID) &&
+ memcmp(hwUUID, uuidbuf, VIR_UUID_BUFLEN) != 0) {
+ virReportError(VIR_ERR_XML_DETAIL, "%s",
+ _("UUID mismatch between <hwuuid> and
<sysinfo>"));
+ return -1;
+ }
I think it'd be slightly clearer to re-arrange the order
and nesting here
if (uuid_generated) {
...
} else if (virUUIDIsValid(hwUUID)) {
if (memcmp(....)) {
...err
}
} else {
if (memcmp(....)) {
...err
}
}
With regards,
Daniel
--
|:
https://berrange.com -o-
https://www.flickr.com/photos/dberrange :|
|:
https://libvirt.org -o-
https://fstop138.berrange.com :|
|:
https://entangle-photo.org -o-
https://www.instagram.com/dberrange :|