|  | QEMU VM templating | 
|  | ================== | 
|  |  | 
|  | This document explains how to use VM templating in QEMU. | 
|  |  | 
|  | For now, the focus is on VM memory aspects, and not about how to save and | 
|  | restore other VM state (i.e., migrate-to-file with ``x-ignore-shared``). | 
|  |  | 
|  | Overview | 
|  | -------- | 
|  |  | 
|  | With VM templating, a single template VM serves as the starting point for | 
|  | new VMs. This allows for fast and efficient replication of VMs, resulting | 
|  | in fast startup times and reduced memory consumption. | 
|  |  | 
|  | Conceptually, the VM state is frozen, to then be used as a basis for new | 
|  | VMs. The Copy-On-Write mechanism in the operating systems makes sure that | 
|  | new VMs are able to read template VM memory; however, any modifications | 
|  | stay private and don't modify the original template VM or any other | 
|  | created VM. | 
|  |  | 
|  | !!! Security Alert !!! | 
|  | ---------------------- | 
|  |  | 
|  | When effectively cloning VMs by VM templating, hardware identifiers | 
|  | (such as UUIDs and NIC MAC addresses), and similar data in the guest OS | 
|  | (such as machine IDs, SSH keys, certificates) that are supposed to be | 
|  | *unique* are no longer unique, which can be a security concern. | 
|  |  | 
|  | Please be aware of these implications and how to mitigate them for your | 
|  | use case, which might involve vmgenid, hot(un)plug of NIC, etc.. | 
|  |  | 
|  | Memory configuration | 
|  | -------------------- | 
|  |  | 
|  | In order to create the template VM, we have to make sure that VM memory | 
|  | ends up in a file, from where it can be reused for the new VMs: | 
|  |  | 
|  | Supply VM RAM via memory-backend-file, with ``share=on`` (modifications go | 
|  | to the file) and ``readonly=off`` (open the file writable). Note that | 
|  | ``readonly=off`` is implicit. | 
|  |  | 
|  | In the following command-line example, a 2GB VM is created, whereby VM RAM | 
|  | is to be stored in the ``template`` file. | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| [...] -m 2g \\ | 
|  | -object memory-backend-file,id=pc.ram,mem-path=template,size=2g,share=on,... \\ | 
|  | -machine q35,memory-backend=pc.ram | 
|  |  | 
|  | If multiple memory backends are used (vNUMA, DIMMs), configure all | 
|  | memory backends accordingly. | 
|  |  | 
|  | Once the VM is in the desired state, stop the VM and save other VM state, | 
|  | leaving the current state of VM RAM reside in the file. | 
|  |  | 
|  | In order to have a new VM be based on a template VM, we have to | 
|  | configure VM RAM to be based on a template VM RAM file; however, the VM | 
|  | should not be able to modify file content. | 
|  |  | 
|  | Supply VM RAM via memory-backend-file, with ``share=off`` (modifications | 
|  | stay private), ``readonly=on`` (open the file readonly) and ``rom=off`` | 
|  | (don't make the memory readonly for the VM). Note that ``share=off`` is | 
|  | implicit and that other VM state has to be restored separately. | 
|  |  | 
|  | In the following command-line example, a 2GB VM is created based on the | 
|  | existing 2GB file ``template``. | 
|  |  | 
|  | .. parsed-literal:: | 
|  |  | 
|  | |qemu_system| [...] -m 2g \\ | 
|  | -object memory-backend-file,id=pc.ram,mem-path=template,size=2g,readonly=on,rom=off,... \\ | 
|  | -machine q35,memory-backend=pc.ram | 
|  |  | 
|  | If multiple memory backends are used (vNUMA, DIMMs), configure all | 
|  | memory backends accordingly. | 
|  |  | 
|  | Note that ``-mem-path`` cannot be used for VM templating when creating the | 
|  | template VM or when starting new VMs based on a template VM. | 
|  |  | 
|  | Incompatible features | 
|  | --------------------- | 
|  |  | 
|  | Some features are incompatible with VM templating, as the underlying file | 
|  | cannot be modified to discard VM RAM, or to actually share memory with | 
|  | another process. | 
|  |  | 
|  | vhost-user and multi-process QEMU | 
|  | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | vhost-user and multi-process QEMU are incompatible with VM templating. | 
|  | These technologies rely on shared memory, however, the template VMs | 
|  | don't actually share memory (``share=off``), even though they are | 
|  | file-based. | 
|  |  | 
|  | virtio-balloon | 
|  | ~~~~~~~~~~~~~~ | 
|  |  | 
|  | virtio-balloon inflation and "free page reporting" cannot discard VM RAM | 
|  | and will repeatedly report errors. While virtio-balloon can be used | 
|  | for template VMs (e.g., report VM RAM stats), "free page reporting" | 
|  | should be disabled and the balloon should not be inflated. | 
|  |  | 
|  | virtio-mem | 
|  | ~~~~~~~~~~ | 
|  |  | 
|  | virtio-mem cannot discard VM RAM that is managed by the virtio-mem | 
|  | device. virtio-mem will fail early when realizing the device. To use | 
|  | VM templating with virtio-mem, either hotplug virtio-mem devices to the | 
|  | new VM, or don't supply any memory to the template VM using virtio-mem | 
|  | (requested-size=0), not using a template VM file as memory backend for the | 
|  | virtio-mem device. | 
|  |  | 
|  | VM migration | 
|  | ~~~~~~~~~~~~ | 
|  |  | 
|  | For VM migration, "x-release-ram" similarly relies on discarding of VM | 
|  | RAM on the migration source to free up migrated RAM, and will | 
|  | repeatedly report errors. | 
|  |  | 
|  | Postcopy live migration fails discarding VM RAM on the migration | 
|  | destination early and refuses to activate postcopy live migration. Note | 
|  | that postcopy live migration usually only works on selected filesystems | 
|  | (shmem/tmpfs, hugetlbfs) either way. |