Upgrading the machine type of a virtual machine (VM) can be thought of in the same way as buying (virtual) hardware of the same spec but with a newer release date. Whereas to upgrade a physical machine you might buy an improved CPU, more RAM, or increased storage, with a virtual machine you can change the configuration to achieve the same results.
There are several reasons why you might want to update the machine type of an existing VM. For example, to:
- Improve performance with additional computing power
- Add a virtual GPU
- Scale up the allocated resources to cope with increased workloads
- Obtain the latest security fixes and features
- Continue using a guest created on a now-unsupported release
- Prepare for future expansion by upgrading in advance
It is generally recommended to update machine types when upgrading QEMU/KVM to a new major version. However, this can likely never be an automated task as the change is “guest visible”; the guest devices might change in appearance, new features will be announced to the guest, and so on.
Linux is usually very good at tolerating such changes – but, it depends so heavily on the setup and workload of the guest that this has to be evaluated by the owner/admin of the system.
Other operating systems were known to often be severely impacted by changing the hardware. Consider a machine type change as similar to replacing all devices and firmware of a physical machine to the latest revision. All of the considerations that apply to firmware upgrades apply to evaluating a machine type upgrade as well.
As usual, with major configuration changes it is wise to back up your guest definition and disk state to be able to do a rollback – just in case something goes wrong.
There is no integrated single command to update the machine type via
virsh or similar tools. It is a normal part of your machine definition, and therefore updated the same way as most others.
First shutdown your machine and wait until it has reached that state:
virsh shutdown <your_machine>
You can check the status of the machine with the following command:
virsh list --inactive
Once the machine is listed as “shut off”, you can then edit the machine definition and find the type in the
type tag given at the machine attribute.
virsh edit <your_machine>
<type arch='x86_64' machine='pc-i440fx-bionic'>hvm</type>
Change this to the value you want. If you need to check what machine types are available via the
kvm -M ? command first, then note that while upstream types are provided for convenience, only Ubuntu types are supported. There you can also see what the current default would be, as in this example:
$ kvm -M ?
pc-i440fx-xenial Ubuntu 16.04 PC (i440FX + PIIX, 1996) (default)
pc-i440fx-bionic Ubuntu 18.04 PC (i440FX + PIIX, 1996) (default)
We strongly recommend that you change to newer types (if possible), not only to take advantage of newer features, but also to benefit from bug fixes that only apply to the newer device virtualisation.
After this you can start your guest again. You can check the current machine type from guest and host depending on your needs.
virsh start <your_machine>
# check from host, via dumping the active xml definition
virsh dumpxml <your_machine> | xmllint --xpath "string(//domain/os/type/@machine)" -
# or from the guest via dmidecode (if supported)
sudo dmidecode | grep Product -A 1
Product Name: Standard PC (i440FX + PIIX, 1996)
If you keep non-live definitions around – such as
.xml files – remember to update those as well.
- This process is also documented along with some more constraints and considerations at the Ubuntu Wiki