There are two types of disk snapshots in libvirt: internal and external. Internal snapshots (virsh default) store all data in one file. With external snapshots, base data and snapshot data is stored separately: base disk file is left intact, and all changes are written into a separate snapshot overlay file. For me, this is the way 😉 Unfortunately, external snapshots support in virsh is limited, virt-manager GUI can't create / use them, and reverting external snapshots involves manual editing config xml to change disk file path.
The manual xml editing part was what irritated me most, so I figured I'd just save VM config with virsh dumpxml before creating a snapshot, and then restore it with virsh define if / when I'd need to revert. Then I decided to wrap this and other routine commands needed to work with external snapshots into a script, virsh-snap.sh.
Installation
-
Download script:
wget -P ~/.local/bin https://github.com/shvchk/virsh-external-snapshots/raw/main/virsh-snap.sh
-
Make it executable:
chmod +x ~/.local/bin/virsh-snap.sh
Usage
-
Create snapshot named
snapshot-1ofvm-42:virsh-snap.sh create vm-42 snapshot-1Snapshot name is optional, by default current date and time is used as a name, e.g.
2022.07.29_23.55.12.
-
List snapshots of
vm-42:virsh-snap.sh list vm-42Note that this is not the same as
virsh snapshot-list. Snapshots are created without metadata and won't be shown withvirsh snapshot-list.
-
Revert and delete
snapshot-1ofvm-42:virsh-snap.sh revert vm-42 snapshot-1
-
Revert, but don't delete
snapshot-1ofvm-42:virsh-snap.sh soft-revert vm-42 snapshot-1This allows to use this snapshot later with
unrevert.
-
Undo revert of a
snapshot-1ofvm-42, i.e. make it active again:virsh-snap.sh unrevert vm-42 snapshot-1
-
Delete snapshot
snapshot-1ofvm-42:virsh-snap.sh delete vm-42 snapshot-1Might be useful if you change your mind after
soft-revert.
-
Show help:
virsh-snap.sh helpvirsh-snap.sh: create and revert external libvirt snapshots easily Usage: virsh-snap.sh <action> <domain> [snapshot name] Actions: -------- create, c Create snapshot If no snapshot name is provided, current date and time is used list, ls, l List snapshots disk Show active disk revert, rev, r Revert snapshot and delete it (same as soft-revert + delete) soft-revert, srev, sr Revert snapshot without deleting it (allows unrevert) unrevert, unrev, ur Unrevert snapshot, i.e. make soft-reverted snapshot active again delete, del, rm Delete snapshot help, h This message Snapshots are created without metadata, so they won't be shown with `virsh snapshot-list`