Virtualization Hardware Enablement Stack¶
Starting from Ubuntu Resolute 26.04, we introduce the hardware enablement (HWE) stack for virtualization components:
qemu-hwe: Hypervisor and system emulation
libvirt-hwe: Virtualization management library and tools
edk2-hwe: Firmware for UEFI support
seabios-hwe: BIOS firmware for compatibility
During the first 2 years of each Ubuntu LTS, this stack is upgraded every 6 months to have the latest upstream version supported in Ubuntu.
Helper package¶
We provide the helper script ubuntu_virt_helper via the new package ubuntu-helper-virt-hwe as a management tool of the HWE stack
root@enticed-cichlid:~# apt install ubuntu-helper-virt-hwe
On a freshly installed system, running ubuntu_virt_helper gives the following output:
root@enticed-cichlid:~# ubuntu_virt_helper
Installed variant: none
1 packages:
- ubuntu-helper-virt-hwe (1:10.2.1+ds-1ubuntu4, src:qemu-hwe)
Impact on current usage¶
The HWE stack is opt-in, so existing systems continue to work as-is. The base stack remains the default, and selecting HWE is an explicit action. For example, installing qemu-system-x86 pulls in the base virtualization packages:
root@enticed-cichlid:~# apt install qemu-system-x86
These are the virtualization components installed as dependencies of qemu-system-x86:
root@enticed-cichlid:~# ubuntu_virt_helper --verbose
Installed variant: base
15 packages:
- ovmf (2025.11-3ubuntu7, src:edk2, auto)
- ovmf-amdsev (2025.11-3ubuntu7, src:edk2, auto)
- ovmf-generic (2025.11-3ubuntu7, src:edk2, auto)
- ovmf-inteltdx (2025.11-3ubuntu7, src:edk2, auto)
- qemu-block-extra (1:10.2.1+ds-1ubuntu3, src:qemu, auto)
- qemu-system-common (1:10.2.1+ds-1ubuntu3, src:qemu, auto)
- qemu-system-data (1:10.2.1+ds-1ubuntu3, src:qemu, auto)
- qemu-system-gui (1:10.2.1+ds-1ubuntu3, src:qemu, auto)
- qemu-system-modules-opengl (1:10.2.1+ds-1ubuntu3, src:qemu, auto)
- qemu-system-modules-spice (1:10.2.1+ds-1ubuntu3, src:qemu, auto)
- qemu-system-x86 (1:10.2.1+ds-1ubuntu3, src:qemu, manual)
- qemu-utils (1:10.2.1+ds-1ubuntu3, src:qemu, auto)
- seabios (1.17.0-1ubuntu1, src:seabios, auto)
- ubuntu-helper-virt-hwe (1:10.2.1+ds-1ubuntu4, src:qemu-hwe, manual)
- ubuntu-virt (1:10.2.1+ds-1ubuntu3, src:qemu, auto)
The output indicates the apt mark for each package: ubuntu-helper-virt-hwe and qemu-system-x86 are marked as manual because they were directly installed, while the other packages are marked as auto as they were pulled in as dependencies.
Uncontrolled variant switches and dependency management implications¶
Since the 2 stacks are mutually exclusive and one package can be individually requested for installation, one variant can be selected by installing any package from this variant:
root@enticed-cichlid:~# apt install qemu-utils-hwe
The following packages were automatically installed and are no longer required:
adwaita-icon-theme libflac14
…
x11-common
Use 'sudo apt autoremove' to remove them.
Installing:
qemu-utils-hwe
Installing dependencies:
qemu-block-extra-hwe ubuntu-virt-hwe
REMOVING:
ovmf ovmf-inteltdx qemu-system-data qemu-system-modules-spice seabios
ovmf-amdsev qemu-block-extra qemu-system-gui qemu-system-x86 ubuntu-virt
ovmf-generic qemu-system-common qemu-system-modules-opengl qemu-utils
Summary:
Upgrading: 0, Installing: 3, Removing: 14, Not Upgrading: 9
Download size: 2496 kB
Freed space: 118 MB
Continue? [Y/n]
In this specific example, installing qemu-utils-hwe does not automatically install the HWE counterparts for several related packages, as they aren’t part of qemu-utils-hwe’s dependencies. Consequently, APT issues a warning, noting that packages have been removed but have not been replaced with their respective HWE counterparts:
Get:1 http://archive.ubuntu.com/ubuntu resolute/main amd64 ubuntu-virt-hwe all 1:10.2.1+ds-1ubuntu4 [11.6 kB]
Get:2 http://archive.ubuntu.com/ubuntu resolute/main amd64 qemu-utils-hwe amd64 1:10.2.1+ds-1ubuntu4 [2389 kB]
Get:3 http://archive.ubuntu.com/ubuntu resolute/main amd64 qemu-block-extra-hwe amd64 1:10.2.1+ds-1ubuntu4 [95.4 kB]
Fetched 2496 kB in 1s (3358 kB/s)
Virt: switch of the ubuntu-virt[-hwe] stack is detected and there are orphaned removals (no counterpart being installed):
- ovmf
- ovmf-amdsev
- ovmf-generic
- ovmf-inteltdx
- qemu-system-x86
- qemu-system-modules-spice
- qemu-system-common
- qemu-system-data
- qemu-system-gui
- qemu-system-modules-opengl
- seabios
Virt: Please install them back and use the ubuntu-virt-helper script to switch between ubuntu-virt[-hwe] packages.
(Reading database ... 96412 files and directories currently installed.)
Removing ovmf (2025.11-3ubuntu7) ...
Removing ovmf-amdsev (2025.11-3ubuntu7) ...
Removing ovmf-generic (2025.11-3ubuntu7) ...
The result can be an incomplete stack (in this case missing 11 packages when compared to before), as shown below:
root@enticed-cichlid:~# ubuntu_virt_helper --verbose
Installed variant: hwe
4 packages:
- qemu-block-extra-hwe (1:10.2.1+ds-1ubuntu4, src:qemu-hwe, auto)
- qemu-utils-hwe (1:10.2.1+ds-1ubuntu4, src:qemu-hwe, manual)
- ubuntu-helper-virt-hwe (1:10.2.1+ds-1ubuntu4, src:qemu-hwe, manual)
- ubuntu-virt-hwe (1:10.2.1+ds-1ubuntu4, src:qemu-hwe, auto)
Proper variant switch using the helper script¶
Manual un-managed switch can break existing workflows that make use of the virtualization features. To avoid such partial exchanges, instead use the helper for a complete and safe switch. The example starts from the same conditions as above:
root@enticed-cichlid:~# ubuntu_virt_helper switch
Switching from base to hwe variant...
Installing:
ovmf-amdsev-hwe ovmf-inteltdx-hwe qemu-system-data-hwe qemu-system-modules-spice-hwe seabios-hwe
ovmf-generic-hwe qemu-block-extra-hwe qemu-system-gui-hwe qemu-system-x86-hwe ubuntu-virt-hwe
ovmf-hwe qemu-system-common-hwe qemu-system-modules-opengl-hwe qemu-utils-hwe
Suggested packages:
samba vde2 passt
REMOVING:
ovmf ovmf-generic qemu-block-extra qemu-system-data qemu-system-modules-opengl qemu-system-x86 seabios
ovmf-amdsev ovmf-inteltdx qemu-system-common qemu-system-gui qemu-system-modules-spice qemu-utils ubuntu-virt
Summary:
Upgrading: 0, Installing: 14, Removing: 14, Not Upgrading: 9
Download size: 25.5 MB
Freed space: 7168 B
Continue? [Y/n]
The helper performs a one-to-one replacement, preserving dependencies and preventing partial transitions. It also preserves each package’s auto/manual install mark, making the switch transparent to users:
root@enticed-cichlid:~# ubuntu_virt_helper --verbose
Installed variant: hwe
15 packages:
- ovmf-amdsev-hwe (2025.11-3ubuntu8, src:edk2-hwe, auto)
- ovmf-generic-hwe (2025.11-3ubuntu8, src:edk2-hwe, auto)
- ovmf-hwe (2025.11-3ubuntu8, src:edk2-hwe, auto)
- ovmf-inteltdx-hwe (2025.11-3ubuntu8, src:edk2-hwe, auto)
- qemu-block-extra-hwe (1:10.2.1+ds-1ubuntu4, src:qemu-hwe, auto)
- qemu-system-common-hwe (1:10.2.1+ds-1ubuntu4, src:qemu-hwe, auto)
- qemu-system-data-hwe (1:10.2.1+ds-1ubuntu4, src:qemu-hwe, auto)
- qemu-system-gui-hwe (1:10.2.1+ds-1ubuntu4, src:qemu-hwe, auto)
- qemu-system-modules-opengl-hwe (1:10.2.1+ds-1ubuntu4, src:qemu-hwe, auto)
- qemu-system-modules-spice-hwe (1:10.2.1+ds-1ubuntu4, src:qemu-hwe, auto)
- qemu-system-x86-hwe (1:10.2.1+ds-1ubuntu4, src:qemu-hwe, manual)
- qemu-utils-hwe (1:10.2.1+ds-1ubuntu4, src:qemu-hwe, auto)
- seabios-hwe (1.17.0-1ubuntu2, src:seabios-hwe, auto)
- ubuntu-helper-virt-hwe (1:10.2.1+ds-1ubuntu4, src:qemu-hwe, manual)
- ubuntu-virt-hwe (1:10.2.1+ds-1ubuntu4, src:qemu-hwe, auto)