Chapter 13. Saving and restoring virtual machine state by using snapshots To save the current state of a virtual machine (VM), you can create a snapshot of the VM. Afterwards, you can revert to the snapshot to return the VM to the saved state. A VM snapshot contains the disk image of the VM. If you create a snapshot from a running VM (also known as a live snapshot ), the snapshot also contains the memory state of the VM, which includes running processes and applications. Creating snapshots can be useful, for example, for the following tasks: Saving a clean state of the guest operating system Ensuring that you have a restore point before performing a potentially destructive operation on the VM 13.1. Support limitations for virtual machine snapshots Red Hat supports the snapshot functionality for virtual machines (VMs) on RHEL only when you use external snapshots. Currently, external snapshots are created on RHEL only when all of the following requirements are met: Your host is using RHEL 9.4 or later. The VM is using file-based storage. You create the VM snapshot only in one of the following scenarios: The VM is shut-down. If the VM is running, you use the --disk-only --quiesce options or the --live --memspec options. Most other configurations create internal snapshots, which are deprecated in RHEL 9. Internal snapshots might work for your use case, but Red Hat does not provide full testing and support for them. Warning Do not use internal snapshots in production environments. To ensure that a snapshot is supported, display the XML configuration of the snapshot and check the snapshot type and storage: Example output of a supported snapshot: <domainsnapshot> <name>sample-snapshot-name-1<name> <state>shutoff</state> <creationTime>1706658764</creationTime> <memory snapshot=' no '/> <disks> <disk name='vda' snapshot=' external ' type=' file '> <driver type='qcow2'/> <source file='/var/lib/libvirt/images/vm-name.sample-snapshot-name-1'/> </disk> </disks> <domain type='kvm'> [...] Example output of an unsupported snapshot: <domainsnapshot> <name>sample-snapshot-name-2</name> <state>running</state> <creationTime>1653396424</creationTime> <memory snapshot= 'internal' /> <disks> <disk name='vda' snapshot=' internal '/> <disk name='sda' snapshot='no'/> </disks> <domain type='kvm'> [...] 13.2. Creating virtual machine snapshots by using the command line To save the state of a virtual machine (VM) in a snapshot, you can use the virsh snapshot-create-as command. Prerequisites Your host is using RHEL 9.4 or later. The VM uses file-based storage. To check whether this is the case, use the following command and ensure that for the disk device, it displays disk type as file : If you want to create a VM snapshot that includes the memory of a running VM, you must have sufficient disk space to store the memory of the VM. The minimum recommended space for saving the memory of a VM is equal to the VM's assigned RAM. For example, saving the memory of a VM with 32 GB RAM requires up to 32 GB of disk space. If the VM is under heavy I/O load, significant additional disk space might be required. If the VM has assigned VFIO passthrough devices, additional disk space might be required. If a snapshot is created without pausing the VM, additional disk space might be required. Warning Red Hat recommends not saving the memory of a running VMs that is under very high workload or that uses VFIO passthrough devices. Saving the memory of such VMs might fill up the host disk and degrade the system. Instead, consider creating snapshots without memory for such VMs. In addition, note that not all VFIO devices are capable of creating snapshot with memory. Currently, creating a snapshot with memory works correctly only in the following situations: The attached VFIO device is a Mellanox VF with the migration capability enabled. The attached VFIO device is an NVIDIA vGPU with the migration capability enabled. Procedure To create a VM snapshot with the required parameters, use the virsh snapshot-create-as command. To create a snapshot of a shut-down VM, use the --disk-only parameter. For example, the following command creates Snapshot1 from the current disk-state of the shut-down Testguest1 VM: To create a snapshot that saves the disk-state of a running VM but not its memory, use the --disk-only --quiesce parameters. For example, the following command creates Snapshot2 from the current disk state of the running Testguest2 VM, with the description clean system install : To create a snapshot that pauses a running VM and saves its disk-state and memory, use the --memspec parameter. For example, the following command pauses the Testguest3 VM and creates Snapshot3 from the current disk and memory state of the VM. The VM memory is saved in the /var/lib/libvirt/images/saved_memory.img file. When the snapshot is complete, the VM automatically resumes operation. Pausing the VM during the snapshot process creates downtime, but might work more reliably than creating a live snapshot of a running VM (by using the --live option), especially for VMs under a heavy load. To create a snapshot that saves the disk-state of a running VM as well as its live memory, use the --live --memspec parameters. For example, the following command creates Snapshot4 from the current disk and memory state of the running Testguest4 VM, and saves the memory state in the /var/lib/libvirt/images/saved_memory2.img file. Warning Saving the memory of a VM in a snapshot saves the state of the running processes in the guest operating system of the VM. However, when you revert to such a snapshot, the processes might fail due to a variety of factors, such as loss of network connectivity or unsynchronized system time. Verification List the snapshots associated with the specified VM: Verify that the snapshot has been created as external : If the output of this command includes snapshot='external' , the snapshot is external and therefore fully supported by Red Hat. steps Reverting to a VM snapshot by using the CLI Reverting to a VM snapshot by using the web console Additional resources Upstream libvirt information on snapshot metadata virsh man page on your system 13.3. Creating virtual machine snapshots by using the web console To save the state of a virtual machine (VM) in a snapshot, you can use the RHEL web console. Prerequisites You have installed the RHEL 9 web console. You have enabled the cockpit service. Your user account is allowed to log in to the web console. For instructions, see Installing and enabling the web console . Your host is using RHEL 9.4 or later. The web console VM plug-in is installed on your system . The VM uses file-based storage. To ensure that this is the case, perform the following steps: In the Virtual machines interface of the web console, click the VM of which you want to create a snapshot. In the Disks pane of the management overview, check the Source column of the listed devices. In all devices that list a source, this source must be File . Procedure Log in to the RHEL 9 web console. For details, see Logging in to the web console . In the Virtual machines interface of the web console, click the VM of which you want to create a snapshot. A management overview of the VM opens. In the Snapshots pane of the management overview, click the Create snapshot button. Enter a name for the snapshot, and optionally a description. Click Create . Verification To ensure that creating the snapshot has succeeded, check that the snapshot is now listed in the Snapshots pane of the VM. Verify that the snapshot has been created as external . To do so, use the following command on the command line of the host: If the output of this command includes snapshot='external' , the snapshot is external and therefore supported by Red Hat. steps Reverting to a VM snapshot by using the web console Reverting to a VM snapshot by using the command line 13.4. Reverting to a virtual machine snapshot by using the command line To return a virtual machine (VM) to the state saved in a snapshot, you can use the command-line-interface (CLI). Prerequisites A snapshot of the VM is available, which you have previously created in the web console or by using the command line . Optional: You have created a snapshot of the current state of the VM. If you revert to a snapshot without saving the current state, changes performed on the VM since the last snapshot will be lost. Procedure Use the virsh snapshot-revert utility and specify the name of the VM and the name of the snapshot to which you want to revert. For example: Verification Display the currently active snapshot for the reverted VM: 13.5. Reverting to a virtual machine snapshot by using the web console To return a virtual machine (VM) to the state saved in a snapshot, you can use the RHEL web console. Prerequisites You have installed the RHEL 9 web console. You have enabled the cockpit service. Your user account is allowed to log in to the web console. For instructions, see Installing and enabling the web console . The web console VM plug-in is installed on your system . A snapshot of the VM is available, which you have previously created in the web console or by using the command line . Optional: You have created a snapshot of the current state of the VM. If you revert to a snapshot without saving the current state, changes performed on the VM since the last snapshot will be lost. Procedure Log in to the RHEL 9 web console. For details, see Logging in to the web console . In the Virtual machines interface of the web console, click the VM whose state you want to revert. A management overview of the VM opens. In the Snapshots pane of the management overview, click the Revert button to the snapshot to which you want to revert. Wait until the revert operation finishes. Depending on the size of the snapshot and how different it is from the current state, this might take up to several minutes. Verification In the Snapshots pane, if a green check symbol now displays on the left side of the selected snapshot, you have successfully reverted to it. 13.6. Deleting virtual machine snapshots by using the command line When a virtual machine (VM) snapshot is no longer useful for you, you can delete it on the command line to free up the disk space that it uses. Prerequisites Optional: A child snapshot exists for the snapshot you want to delete. A child snapshot is created automatically when you have an active snapshot and create a new snapshot. If you delete a snapshot that does not have any children, you will lose any changes saved in the snapshot after it was created from its parent snapshot. To view the parent-child structure of snapshots in a VM, use the virsh snapshot-list --tree command. The following example shows Latest-snapshot as a child of Redundant-snapshot . Procedure Use the virsh snapshot-delete command to delete the snapshot. For example, the following command deletes Redundant-snapshot from the Testguest1 VM: Verification To ensure that the snapshot that you deleted is no longer present, display the existing snapshots of the impacted VM and their parent-child structure: In this example, Redundant-snapshot has been deleted and Latest-snapshot has become the child of Clean-install-snapshot . 13.7. Deleting virtual machine snapshots by using the web console When a virtual machine (VM) snapshot is no longer useful for you, you can delete it in the web console to free up the disk space that it uses. Prerequisites You have installed the RHEL 9 web console. You have enabled the cockpit service. Your user account is allowed to log in to the web console. For instructions, see Installing and enabling the web console . The web console VM plug-in is installed on your system . Optional: A child snapshot exists for the snapshot you want to delete. A child snapshot is created automatically when you have an active snapshot and create a new snapshot. If you delete a snapshot that does not have any children, you will lose any changes saved in the snapshot after it was created from its parent snapshot. To check that the snapshot has a child, confirm that the snapshot is listed in the Parent snapshot column of the Snapshots in the web console overview of the VM. Procedure In the Virtual machines interface of the web console, click the VM whose snapshot you want to delete. A management overview of the VM opens. In the Snapshots pane of the management overview, click the Delete button to the snapshot that you want to delete. Wait until the delete operation finishes. Depending on the size of the snapshot, this might take up to several minutes. Verification If the snapshot no longer appears in the Snapshots pane, it has been deleted successfully.

Commands:
virsh snapshot-dumpxml <vm-name> <snapshot-name>
<domainsnapshot> <name>sample-snapshot-name-1<name> <state>shutoff</state> <creationTime>1706658764</creationTime> <memory snapshot=' no '/> <disks> <disk name='vda' snapshot=' external ' type=' file '> <driver type='qcow2'/> <source file='/var/lib/libvirt/images/vm-name.sample-snapshot-name-1'/> </disk> </disks> <domain type='kvm'> [...]
<domainsnapshot> <name>sample-snapshot-name-2</name> <state>running</state> <creationTime>1653396424</creationTime> <memory snapshot= 'internal' /> <disks> <disk name='vda' snapshot=' internal '/> <disk name='sda' snapshot='no'/> </disks> <domain type='kvm'> [...]
virsh dumpxml <vm-name> | grep "disk type" <disk type=' file ' device='disk'> <disk type='file' device='cdrom'>
virsh snapshot-create-as <vm-name> <snapshot-name> <optional-description> <additional-parameters>
virsh snapshot-create-as Testguest1 Snapshot1 --disk-only Domain snapshot Snapshot1 created.
virsh snapshot-create-as Testguest2 Snapshot2 "clean system install" --disk-only --quiesce Domain snapshot Snapshot2 created.
virsh snapshot-create-as Testguest3 Snapshot3 --memspec /var/lib/libvirt/images/saved_memory.img Domain snapshot Snapshot3 created.
virsh snapshot-create-as Testguest4 Snapshot4 --live --memspec /var/lib/libvirt/images/saved_memory2.img Domain snapshot Snapshot4 created.
virsh snapshot-list <Testguest1> Name Creation Time State -------------------------------------------------------------- Snapshot1 2024-01-30 18:34:58 +0100 shutoff
virsh snapshot-dumpxml <Testguest1> <Snapshot1> | grep external <disk name='vda' snapshot=' external ' type=' file '>
virsh snapshot-dumpxml <Testguest1> <Snapshot1> | grep external <disk name='vda' snapshot=' external ' type=' file '>
virsh snapshot-revert Testguest2 clean-install Domain snapshot clean-install reverted
virsh snapshot-current Testguest2 --name clean-install
virsh snapshot-list --tree <vm-name> Clean-install-snapshot | +- Redundant-snapshot | +- Latest-snapshot
virsh snapshot-delete Testguest1 Redundant-snapshot Domain snapshot Redundant-snapshot deleted
virsh snapshot-list --tree <Testguest1> Clean-install-snapshot | +- Latest-snapshot