top of page
Black Chips
Search

Fixing Missing SMBIOS UUID in Windows VMs on KVM/QEMU 8.1+

  • Writer: Josue Valentin
    Josue Valentin
  • Dec 23, 2025
  • 3 min read


Overview


After upgrading to QEMU 8.1 or newer, Windows virtual machines running on KVM/libvirt may no longer expose their SMBIOS UUID to the guest operating system. As a result, Windows WMI queries return no UUID.


This issue directly affects software that depends on a stable system UUID, including:

  • Veeam Backup and Replication

  • Veeam Service Provider Console (VSPC)

  • Veeam Agents

  • SQL-backed applications that bind configuration or licensing to UUID

  • Certain Windows activation and hardware identification workflows


This is not a SQL corruption issue and not a Veeam defect. It is caused by a hypervisor-level SMBIOS behavior change.


Symptoms


Inside the affected Windows VM, the following commands return empty results or No Instance(s) Available.


PowerShell

(Get-CimInstance Win32_ComputerSystemProduct).UUID
Get-CimInstance Win32_ComputerSystemProduct | Select-Object UUID

Command Prompt

wmic csproduct get uuid

Typical output:

No Instance(s) Available.

In Veeam environments, this commonly appears as:

  • Veeam services failing to rebind after hostname changes

  • SQL-backed Veeam components failing initialization

  • Duplicate or missing server identities in VSPC

  • Agent registration or licensing failures


Affected Environment


  • Hypervisor: KVM with libvirt

  • QEMU: 8.1 and newer (8.2.x confirmed)

  • Guest OS: Windows Server 2019, Windows Server 2022, Windows 10, Windows 11

  • Firmware: Legacy BIOS (non-UEFI)

  • Platforms: OpenStack, Proxmox, standalone libvirt


Root Cause



Starting with QEMU 8.1, the default SMBIOS entry point type changed.

QEMU Version

SMBIOS Entry Point

8.0 and earlier

32-bit (legacy)

8.1 to 8.2

64-bit

9.0 and newer

auto

Windows guests booted in legacy BIOS mode cannot read the 64-bit SMBIOS entry point, even though the SMBIOS tables are correctly populated by QEMU.



As a result:


  • The UUID exists at the hypervisor level

  • Windows cannot locate the SMBIOS entry point

  • WMI returns no UUID


Hypervisor Verification


The UUID is present in the VM definition.

virsh dumpxml <vm-name> | grep -A15 '<sysinfo'

Example:

<sysinfo type='smbios'>
  <system>
    <entry name='manufacturer'>OpenStack Foundation</entry>
    <entry name='product'>OpenStack Nova</entry>
    <entry name='uuid'>99ebd0f3-493b-4890-b3ce-895d0f4df819</entry>
  </system>
</sysinfo>

The data exists, but Windows cannot read it due to the SMBIOS entry point format.


Supported Fix


Force QEMU to use the legacy 32-bit SMBIOS entry point.


Required QEMU Argument

-machine smbios-entry-point-type=32

This immediately restores UUID visibility inside Windows.


Fix Options


Option 1: Single VM (Manual, Temporary)


  1. Stop the VM completely:

openstack server stop <server-id>
  1. Export the libvirt XML:

virsh dumpxml <vm-name> > /tmp/vm.xml
  1. Add the QEMU namespace to the <domain> tag:

<domain type="kvm" xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0">
  1. Add the following block before </domain>:

<qemu:commandline>
  <qemu:arg value="-machine"/>
  <qemu:arg value="smbios-entry-point-type=32"/>
</qemu:commandline>
  1. Redefine and start the VM:

virsh undefine <vm-name>
virsh define /tmp/vm.xml
virsh start <vm-name>
  1. Verify inside Windows:

(Get-CimInstance Win32_ComputerSystemProduct).UUID

Option 2: Global Fix (Recommended)


Because platforms such as OpenStack regenerate VM XML on each start, the correct long-term solution is a libvirt QEMU hook on every compute node.

Create the file /etc/libvirt/hooks/qemu:


#!/bin/bash

GUEST_NAME=$1
OPERATION=$2

if [ "$OPERATION" = "prepare" ]; then
    cat > /tmp/libvirt-hook-$$.xml

    if ! grep -q "smbios-entry-point-type" /tmp/libvirt-hook-$$.xml; then
        if grep -q "xmlns:qemu" /tmp/libvirt-hook-$$.xml; then
            sed -i 's|</domain>|<qemu:commandline><qemu:arg value="-machine"/><qemu:arg value="smbios-entry-point-type=32"/></qemu:commandline></domain>|' /tmp/libvirt-hook-$$.xml
        else
            sed -i 's|<domain type="kvm">|<domain type="kvm" xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0">|' /tmp/libvirt-hook-$$.xml
            sed -i 's|</domain>|<qemu:commandline><qemu:arg value="-machine"/><qemu:arg value="smbios-entry-point-type=32"/></qemu:commandline></domain>|' /tmp/libvirt-hook-$$.xml
        fi
    fi

    cat /tmp/libvirt-hook-$$.xml
    rm -f /tmp/libvirt-hook-$$.xml
else
    cat
fi

Make it executable:

chmod +x /etc/libvirt/hooks/qemu

Deploy this hook on every compute node.


Verification


Hypervisor

ps aux | grep smbios-entry-point-type

Expected output:

smbios-entry-point-type=32

Windows

wmic csproduct get uuid

Expected output:

99EBD0F3-493B-4890-B3CE-895D0F4DF819

Alternatives


Use UEFI (OVMF)

UEFI-based Windows VMs properly support 64-bit SMBIOS entry points and are not affected.


Upgrade to QEMU 9.0 or Newer


QEMU 9 defaults SMBIOS entry point handling to auto, which resolves the issue in most environments.


Summary


While we think Veeam Service Provider Console is broken it ends up being the UUID not letting SQL run properly and VSCP stays in limbo. Once you can see the UUID while the Windows OS runs in OpenStack (Ubuntu + KVM + Kolla) it just works.

Item

Outcome

Root cause

QEMU 8.1 defaulted to 64-bit SMBIOS

Affected systems

Windows VMs using legacy BIOS

Veeam impact

UUID missing, SQL and service rebinding failures

Fix

Force 32-bit SMBIOS entry point

Best practice

Global libvirt QEMU hook


 
 
 

Related Posts

See All
You can’t protect what you don’t monitor

Systems don’t fail overnight. They drift. Small changes accumulate. Signals fade. Visibility is lost. Continuous monitoring brings clarity and clarity brings control. Security isn’t guessing. It’s see

 
 
 
Untitled

Phishing Doesn’t Look Like an Attack Most phishing emails don’t look suspicious. They look familiar. A known sender. A normal request. A message that feels routine. That’s why phishing still works. St

 
 
 
Ransomware attacks rarely begin with a single click.

They start with small gaps: unpatched systems, excessive access, or configurations no one reviewed. Prevention isn’t about reacting faster. It’s about reducing exposure before it becomes an incident.

 
 
 

Comments

Rated 0 out of 5 stars.
No ratings yet

Add a rating

IT Services

Fully Managed IT Solutions
Custom IT Services
Cyber Security Services
Business Phone Systems

Contact Info

Address:
Chicopee, Massachusetts 01013
Email: sales
@technetne.com

Social

  • Facebook
  • LinkedIn
Minority Own Business

Copyright © 2025 TechNet New England. All Rights Reserved. | Terms and Conditions | Privacy Policy

bottom of page