Virtualization Hardware Enablement Stack

Starting from Ubuntu Resolute 26.04, we introduce the hardware enablement (HWE) stack for virtualization components:

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)