KVM External Snapshots
With external snapshots, a new file is created where all future changes are written to (the "delta" file), and the original file is stored in a read-only saved state.
Advantages of External over Internal
- Much faster creation (creating an empty file to store future data and setting up links).
- Can be performed on both qcow2 and raw disk based guests.
- Allows for live backups of guests.
- The disk (and possibly state) of the guest at the point of the snapshot is now in read-only file that can be copied to an external host whilst the guest is still running.
virsh snapshot-revert on external snapshots. However, you can get work around this manually.
How To Take An External Snapshot
External snapshots are taken in the same manner as internal snapshots, but with the additional
--disk-only parameters specifying where to save the disk and state files, or whether we are only saving the disk. You cannot specify
--diskspec alone without one of the other two parameters which should be used depending on whether the VM is running or not.
Below is a script I use to automatically determine whether a VM is running or not in order to take the appropriate type of snapshot. It also automatically creates a folder structure whereby snapshots are stored in a
snapshots folder which has subfolders of the timestamps of when the snapshots were taken. Feel free to use/adapt it to your needs.
#!/bin/bash DOMAIN="test" TIMESTAMP=`date +%s` SNAPSHOT_NAME=$TIMESTAMP VM_FOLDER="/path/to/vms" SNAPSHOT_FOLDER="`echo $VM_FOLDER`/`echo $DOMAIN`/snapshots/`echo $TIMESTAMP`" mkdir -p $SNAPSHOT_FOLDER MEM_FILE="`echo $SNAPSHOT_FOLDER`/mem.qcow2" DISK_FILE="`echo $SNAPSHOT_FOLDER`/disk.qcow2" # Find out if running or not STATE=`virsh dominfo $DOMAIN | grep "State" | cut -d " " -f 11` if [ "$STATE" = "running" ]; then virsh snapshot-create-as \ --domain $DOMAIN $SNAPSHOT_NAME \ --diskspec vda,file=$DISK_FILE,snapshot=external \ --memspec file=$MEM_FILE,snapshot=external \ --atomic else virsh snapshot-create-as \ --domain $DOMAIN $SNAPSHOT_NAME \ --diskspec vda,file=$DISK_FILE,snapshot=external \ --disk-only \ --atomic fi
Taking It Further
Now you have learnt about external snapshots, why not use this new power to create thinly provisioned guests.