[PATCH v2 0/2] Introduce hardware UUID (hwuuid) element

Following on from the discussions at [1] and more recently [2], this series introduces a new hardware UUID (hwuuid) element that allows an external UUID to be provided to the guest, as opposed to the libvirt domain UUID. The use case for this feature is to allow a domain to cloned and then restarted without changing its guest-visible UUID e.g. via dmidecode. Patch 1 introduces the new hardware UUID (hwuuid) element along with an implementation for the QEMU driver, whilst patch 2 adds additional tests to ensure the hwuuid functionality is working as expected. Note that from reading the source it doesn't appear as if all virtualisation platforms will support this feature: I've included the relevant changes for the QEMU driver since that is what we use here at Nutanix. Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com> [1] https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/thread/YXN2L... [2] https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/thread/HGFTR... v2: - Rebase onto master - Rework if() logic in virSysinfoSystemParseXML() in patch 1 as suggested by Daniel - Add R-B tag from Daniel to patch 2 Mark Cave-Ayland (2): conf: introduce hardware UUID (hwuuid) element qemuxmlconftest: add tests for new hardware UUID (hwuuid) element docs/formatdomain.rst | 7 +++ src/conf/domain_conf.c | 43 ++++++++++++++++--- src/conf/domain_conf.h | 1 + src/conf/schemas/domaincommon.rng | 5 +++ src/qemu/qemu_command.c | 6 ++- ...hwuuid-smbios-uuid-match.x86_64-latest.err | 1 + .../hwuuid-smbios-uuid-match.xml | 36 ++++++++++++++++ .../qemuxmlconfdata/hwuuid.x86_64-latest.args | 35 +++++++++++++++ .../qemuxmlconfdata/hwuuid.x86_64-latest.xml | 41 ++++++++++++++++++ tests/qemuxmlconfdata/hwuuid.xml | 30 +++++++++++++ tests/qemuxmlconftest.c | 3 ++ 11 files changed, 202 insertions(+), 6 deletions(-) create mode 100644 tests/qemuxmlconfdata/hwuuid-smbios-uuid-match.x86_64-latest.err create mode 100644 tests/qemuxmlconfdata/hwuuid-smbios-uuid-match.xml create mode 100644 tests/qemuxmlconfdata/hwuuid.x86_64-latest.args create mode 100644 tests/qemuxmlconfdata/hwuuid.x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/hwuuid.xml -- 2.43.0

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@nutanix.com> --- docs/formatdomain.rst | 7 +++++ src/conf/domain_conf.c | 43 +++++++++++++++++++++++++++---- src/conf/domain_conf.h | 1 + src/conf/schemas/domaincommon.rng | 5 ++++ src/qemu/qemu_command.c | 6 ++++- 5 files changed, 56 insertions(+), 6 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 ba0d4a7b12..420525558a 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -13102,6 +13102,7 @@ static int virSysinfoSystemParseXML(xmlNodePtr node, xmlXPathContextPtr ctxt, virSysinfoSystemDef **sysdef, + unsigned char *hwUUID, unsigned char *domUUID, bool uuid_generated) { @@ -13126,10 +13127,18 @@ virSysinfoSystemParseXML(xmlNodePtr node, } if (uuid_generated) { memcpy(domUUID, uuidbuf, VIR_UUID_BUFLEN); - } else if (memcmp(domUUID, uuidbuf, VIR_UUID_BUFLEN) != 0) { - virReportError(VIR_ERR_XML_DETAIL, "%s", + } else if (virUUIDIsValid(hwUUID)) { + if (memcmp(hwUUID, uuidbuf, VIR_UUID_BUFLEN) != 0) { + virReportError(VIR_ERR_XML_DETAIL, "%s", + _("UUID mismatch between <hwuuid> and <sysinfo>")); + return -1; + } + } else { + if (memcmp(domUUID, uuidbuf, VIR_UUID_BUFLEN) != 0) { + virReportError(VIR_ERR_XML_DETAIL, "%s", _("UUID mismatch between <uuid> and <sysinfo>")); - return -1; + return -1; + } } /* Although we've validated the UUID as good, virUUIDParse() is * lax with respect to allowing extraneous "-" and " ", but the @@ -13267,6 +13276,7 @@ virSysinfoChassisParseXML(xmlNodePtr node, static int virSysinfoParseSMBIOSDef(virSysinfoDef *def, xmlXPathContextPtr ctxt, + unsigned char *hwUUID, unsigned char *domUUID, bool uuid_generated) { @@ -13280,7 +13290,7 @@ virSysinfoParseSMBIOSDef(virSysinfoDef *def, /* Extract system related metadata */ if ((tmpnode = virXPathNode("./system[1]", ctxt)) != NULL) { - if (virSysinfoSystemParseXML(tmpnode, ctxt, &def->system, + if (virSysinfoSystemParseXML(tmpnode, ctxt, &def->system, hwUUID, domUUID, uuid_generated) < 0) return -1; } @@ -13367,6 +13377,7 @@ virSysinfoParseFWCfgDef(virSysinfoDef *def, static virSysinfoDef * virSysinfoParseXML(xmlNodePtr node, xmlXPathContextPtr ctxt, + unsigned char *hwUUID, unsigned char *domUUID, bool uuid_generated) { @@ -13381,7 +13392,8 @@ virSysinfoParseXML(xmlNodePtr node, switch (def->type) { case VIR_SYSINFO_SMBIOS: - if (virSysinfoParseSMBIOSDef(def, ctxt, domUUID, uuid_generated) < 0) + if (virSysinfoParseSMBIOSDef(def, ctxt, hwUUID, domUUID, + uuid_generated) < 0) return NULL; break; @@ -18671,6 +18683,21 @@ virDomainDefParseIDs(virDomainDef *def, VIR_FREE(tmp); } + /* Extract hardware uuid (optional). For some use cases e.g. cloning a + * domain from a snapshot, the hardware uuid must remain constant and + * separate from the domain uuid. */ + tmp = virXPathString("string(./hwuuid[1])", ctxt); + if (tmp) { + if (virUUIDParse(tmp, def->hw_uuid) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("malformed hwuuid element")); + return -1; + } + VIR_FREE(tmp); + } else { + memset(def->hw_uuid, 0, VIR_UUID_BUFLEN); + } + /* Extract domain genid - a genid can either be provided or generated */ if ((n = virXPathNodeSet("./genid", ctxt, &nodes)) < 0) return -1; @@ -20136,6 +20163,7 @@ virDomainDefParseXML(xmlXPathContextPtr ctxt, for (i = 0; i < n; i++) { virSysinfoDef *sysinfo = virSysinfoParseXML(nodes[i], ctxt, + def->hw_uuid, def->uuid, uuid_generated); if (!sysinfo) @@ -28907,6 +28935,11 @@ virDomainDefFormatInternalSetRootName(virDomainDef *def, virUUIDFormat(uuid, uuidstr); virBufferAsprintf(buf, "<uuid>%s</uuid>\n", uuidstr); + if (virUUIDIsValid(def->hw_uuid)) { + virUUIDFormat(def->hw_uuid, uuidstr); + virBufferAsprintf(buf, "<hwuuid>%s</hwuuid>\n", uuidstr); + } + if (def->genidRequested) { char genidstr[VIR_UUID_STRING_BUFLEN]; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 6008ec66d3..c3492a5f66 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3116,6 +3116,7 @@ struct _virDomainDef { int virtType; /* enum virDomainVirtType */ int id; unsigned char uuid[VIR_UUID_BUFLEN]; + unsigned char hw_uuid[VIR_UUID_BUFLEN]; unsigned char genid[VIR_UUID_BUFLEN]; bool genidRequested; diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index 2d6e15f144..e39dacfff7 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -47,6 +47,11 @@ <ref name="UUID"/> </element> </optional> + <optional> + <element name="hwuuid"> + <ref name="UUID"/> + </element> + </optional> <optional> <element name="genid"> <choice> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index fc6ce4dd91..d6ed21c136 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -10718,7 +10718,11 @@ qemuBuildCommandLine(virDomainObj *vm, qemuBuildNumaCommandLine(cfg, def, cmd, priv) < 0) return NULL; - virUUIDFormat(def->uuid, uuid); + if (virUUIDIsValid(def->hw_uuid)) { + virUUIDFormat(def->hw_uuid, uuid); + } else { + virUUIDFormat(def->uuid, uuid); + } virCommandAddArgList(cmd, "-uuid", uuid, NULL); if (qemuBuildSmbiosCommandLine(cmd, driver, def) < 0) -- 2.43.0

Add new 'hwuuid' and 'hwuuid-smbios-uuid-match' tests to verify that the new hardware UUID (hwuuid) element is working as intended. In particular the 'hwuuid-smbios-uuid-match' test is designed to ensure that the hwuuid and smbios UUIDs are always identical, similar to the existing logic works for the domain UUID and the smbios UUID. Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> --- ...hwuuid-smbios-uuid-match.x86_64-latest.err | 1 + .../hwuuid-smbios-uuid-match.xml | 36 ++++++++++++++++ .../qemuxmlconfdata/hwuuid.x86_64-latest.args | 35 ++++++++++++++++ .../qemuxmlconfdata/hwuuid.x86_64-latest.xml | 41 +++++++++++++++++++ tests/qemuxmlconfdata/hwuuid.xml | 30 ++++++++++++++ tests/qemuxmlconftest.c | 3 ++ 6 files changed, 146 insertions(+) create mode 100644 tests/qemuxmlconfdata/hwuuid-smbios-uuid-match.x86_64-latest.err create mode 100644 tests/qemuxmlconfdata/hwuuid-smbios-uuid-match.xml create mode 100644 tests/qemuxmlconfdata/hwuuid.x86_64-latest.args create mode 100644 tests/qemuxmlconfdata/hwuuid.x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/hwuuid.xml diff --git a/tests/qemuxmlconfdata/hwuuid-smbios-uuid-match.x86_64-latest.err b/tests/qemuxmlconfdata/hwuuid-smbios-uuid-match.x86_64-latest.err new file mode 100644 index 0000000000..10a98baf4b --- /dev/null +++ b/tests/qemuxmlconfdata/hwuuid-smbios-uuid-match.x86_64-latest.err @@ -0,0 +1 @@ +UUID mismatch between <hwuuid> and <sysinfo> diff --git a/tests/qemuxmlconfdata/hwuuid-smbios-uuid-match.xml b/tests/qemuxmlconfdata/hwuuid-smbios-uuid-match.xml new file mode 100644 index 0000000000..0fe95b4ed8 --- /dev/null +++ b/tests/qemuxmlconfdata/hwuuid-smbios-uuid-match.xml @@ -0,0 +1,36 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>f1449954-3a7e-48f8-aa7f-1f25fd6fa38f</uuid> + <hwuuid>af2d912f-5f99-4036-a9a1-8739b1f34518</hwuuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu placement='static'>1</vcpu> + <sysinfo type='smbios'> + <system> + <entry name='uuid'>22173deb-d53e-4db9-b874-93f5bba6e98b</entry> + </system> + </sysinfo> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + <boot dev='hd'/> + <smbios mode='sysinfo'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='block' device='disk'> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxmlconfdata/hwuuid.x86_64-latest.args b/tests/qemuxmlconfdata/hwuuid.x86_64-latest.args new file mode 100644 index 0000000000..fa3eb6b163 --- /dev/null +++ b/tests/qemuxmlconfdata/hwuuid.x86_64-latest.args @@ -0,0 +1,35 @@ +LC_ALL=C \ +PATH=/bin \ +HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \ +USER=test \ +LOGNAME=test \ +XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-x86_64 \ +-name guest=QEMUGuest1,debug-threads=on \ +-S \ +-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \ +-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \ +-accel tcg \ +-cpu qemu64 \ +-m size=219136k \ +-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \ +-overcommit mem-lock=off \ +-smp 1,sockets=1,cores=1,threads=1 \ +-uuid 5d5b0f1d-128b-4517-8e65-b258a8734c1d \ +-display none \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \ +-mon chardev=charmonitor,id=monitor,mode=control \ +-rtc base=utc \ +-no-shutdown \ +-boot strict=on \ +-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \ +-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-1-storage","read-only":false}' \ +-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-1-storage","id":"ide0-0-0","bootindex":1}' \ +-audiodev '{"id":"audio1","driver":"none"}' \ +-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \ +-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \ +-msg timestamp=on diff --git a/tests/qemuxmlconfdata/hwuuid.x86_64-latest.xml b/tests/qemuxmlconfdata/hwuuid.x86_64-latest.xml new file mode 100644 index 0000000000..a0cc12f698 --- /dev/null +++ b/tests/qemuxmlconfdata/hwuuid.x86_64-latest.xml @@ -0,0 +1,41 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>33721861-ccee-4dc2-858c-5f1e4629771f</uuid> + <hwuuid>5d5b0f1d-128b-4517-8e65-b258a8734c1d</hwuuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <cpu mode='custom' match='exact' check='none'> + <model fallback='forbid'>qemu64</model> + </cpu> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='block' device='disk'> + <driver name='qemu' type='raw'/> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> + </controller> + <controller type='usb' index='0' model='piix3-uhci'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> + </controller> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <audio id='1' type='none'/> + <memballoon model='virtio'> + <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> + </memballoon> + </devices> +</domain> diff --git a/tests/qemuxmlconfdata/hwuuid.xml b/tests/qemuxmlconfdata/hwuuid.xml new file mode 100644 index 0000000000..6bd052b9ad --- /dev/null +++ b/tests/qemuxmlconfdata/hwuuid.xml @@ -0,0 +1,30 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>33721861-ccee-4dc2-858c-5f1e4629771f</uuid> + <hwuuid>5d5b0f1d-128b-4517-8e65-b258a8734c1d</hwuuid> + <memory unit='KiB'>219100</memory> + <currentMemory unit='KiB'>219100</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type arch='x86_64' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu-system-x86_64</emulator> + <disk type='block' device='disk'> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <controller type='ide' index='0'/> + <controller type='usb' index='0'/> + <controller type='pci' index='0' model='pci-root'/> + <input type='mouse' bus='ps2'/> + <input type='keyboard' bus='ps2'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c index ae8efd58f8..fa8d62846f 100644 --- a/tests/qemuxmlconftest.c +++ b/tests/qemuxmlconftest.c @@ -3027,6 +3027,9 @@ mymain(void) DO_TEST_CAPS_LATEST("schema-reorder-domain-subelements"); + DO_TEST_CAPS_LATEST("hwuuid"); + DO_TEST_CAPS_LATEST_PARSE_ERROR("hwuuid-smbios-uuid-match"); + /* check that all input files were actually used here */ if (testConfXMLCheck(existingTestCases) < 0) ret = -1; -- 2.43.0

On 18/07/2025 09:44, Mark Cave-Ayland wrote:
Following on from the discussions at [1] and more recently [2], this series introduces a new hardware UUID (hwuuid) element that allows an external UUID to be provided to the guest, as opposed to the libvirt domain UUID.
The use case for this feature is to allow a domain to cloned and then restarted without changing its guest-visible UUID e.g. via dmidecode.
Patch 1 introduces the new hardware UUID (hwuuid) element along with an implementation for the QEMU driver, whilst patch 2 adds additional tests to ensure the hwuuid functionality is working as expected.
Note that from reading the source it doesn't appear as if all virtualisation platforms will support this feature: I've included the relevant changes for the QEMU driver since that is what we use here at Nutanix.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
Ping? Any further comments? I could post a v3 with the documentation updated to reference 11.7.0 if that helps?
v2: - Rebase onto master - Rework if() logic in virSysinfoSystemParseXML() in patch 1 as suggested by Daniel - Add R-B tag from Daniel to patch 2
Mark Cave-Ayland (2): conf: introduce hardware UUID (hwuuid) element qemuxmlconftest: add tests for new hardware UUID (hwuuid) element
docs/formatdomain.rst | 7 +++ src/conf/domain_conf.c | 43 ++++++++++++++++--- src/conf/domain_conf.h | 1 + src/conf/schemas/domaincommon.rng | 5 +++ src/qemu/qemu_command.c | 6 ++- ...hwuuid-smbios-uuid-match.x86_64-latest.err | 1 + .../hwuuid-smbios-uuid-match.xml | 36 ++++++++++++++++ .../qemuxmlconfdata/hwuuid.x86_64-latest.args | 35 +++++++++++++++ .../qemuxmlconfdata/hwuuid.x86_64-latest.xml | 41 ++++++++++++++++++ tests/qemuxmlconfdata/hwuuid.xml | 30 +++++++++++++ tests/qemuxmlconftest.c | 3 ++ 11 files changed, 202 insertions(+), 6 deletions(-) create mode 100644 tests/qemuxmlconfdata/hwuuid-smbios-uuid-match.x86_64-latest.err create mode 100644 tests/qemuxmlconfdata/hwuuid-smbios-uuid-match.xml create mode 100644 tests/qemuxmlconfdata/hwuuid.x86_64-latest.args create mode 100644 tests/qemuxmlconfdata/hwuuid.x86_64-latest.xml create mode 100644 tests/qemuxmlconfdata/hwuuid.xml
ATB, Mark.

On Fri, Aug 01, 2025 at 10:19:11AM +0100, Mark Cave-Ayland wrote:
On 18/07/2025 09:44, Mark Cave-Ayland wrote:
Following on from the discussions at [1] and more recently [2], this series introduces a new hardware UUID (hwuuid) element that allows an external UUID to be provided to the guest, as opposed to the libvirt domain UUID.
The use case for this feature is to allow a domain to cloned and then restarted without changing its guest-visible UUID e.g. via dmidecode.
Patch 1 introduces the new hardware UUID (hwuuid) element along with an implementation for the QEMU driver, whilst patch 2 adds additional tests to ensure the hwuuid functionality is working as expected.
Note that from reading the source it doesn't appear as if all virtualisation platforms will support this feature: I've included the relevant changes for the QEMU driver since that is what we use here at Nutanix.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
Ping? Any further comments? I could post a v3 with the documentation updated to reference 11.7.0 if that helps?
This is now pushed. 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 :|

On 01/08/2025 18:30, Daniel P. Berrangé wrote:
On Fri, Aug 01, 2025 at 10:19:11AM +0100, Mark Cave-Ayland wrote:
On 18/07/2025 09:44, Mark Cave-Ayland wrote:
Following on from the discussions at [1] and more recently [2], this series introduces a new hardware UUID (hwuuid) element that allows an external UUID to be provided to the guest, as opposed to the libvirt domain UUID.
The use case for this feature is to allow a domain to cloned and then restarted without changing its guest-visible UUID e.g. via dmidecode.
Patch 1 introduces the new hardware UUID (hwuuid) element along with an implementation for the QEMU driver, whilst patch 2 adds additional tests to ensure the hwuuid functionality is working as expected.
Note that from reading the source it doesn't appear as if all virtualisation platforms will support this feature: I've included the relevant changes for the QEMU driver since that is what we use here at Nutanix.
Signed-off-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>
Ping? Any further comments? I could post a v3 with the documentation updated to reference 11.7.0 if that helps?
This is now pushed.
With regards, Daniel
Thanks Daniel! ATB, Mark.
participants (2)
-
Daniel P. Berrangé
-
Mark Cave-Ayland