---
myst:
html_meta:
description: Installing the hardware enablement (HWE) virtualization stack.
---
(virt-hwe)=
# Virtualization Hardware Enablement Stack
Starting from [Ubuntu Resolute 26.04](https://releases.ubuntu.com/resolute/), we introduce the hardware enablement (HWE) stack for virtualization components:
- [**qemu-hwe**](https://launchpad.net/ubuntu/+source/qemu-hwe): Hypervisor and system emulation
- [**libvirt-hwe**](https://launchpad.net/ubuntu/+source/libvirt-hwe): Virtualization management library and tools
- [**edk2-hwe**](https://launchpad.net/ubuntu/+source/edk2-hwe): Firmware for UEFI support
- [**seabios-hwe**](https://launchpad.net/ubuntu/+source/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
```bash
root@enticed-cichlid:~# apt install ubuntu-helper-virt-hwe
```
On a freshly installed system, running **ubuntu_virt_helper** gives the following output:
```bash
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:
```bash
root@enticed-cichlid:~# apt install qemu-system-x86
```
These are the virtualization components installed as dependencies of **qemu-system-x86**:
```bash
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:
```bash
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:
```bash
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:
```bash
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:
```bash
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:
```bash
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)
```