External (and Live) snapshots with libvirt
list all the block devices associated with the guest
$ virsh domblklist testvm --details Type Device Target Source ------------------------------------------------ file disk vda /export/vmimgs/testvm.qcow2
let’s create a snapshot(disk-only) of the guest
$ virsh snapshot-create-as testvm snap1-testvm "snap1 description" \ --diskspec vda,file=/export/vmimgs/snap1-testvm.qcow2 \ --disk-only --atomic
– ‘–atomic’ just ensures either the snapshot is run completely or fails w/o making any changes
$ qemu-img info /export/vmimgs/snap1-testvm.qcow2 image: /export/vmimgs/snap1-testvm.qcow2 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 2.5M cluster_size: 65536 backing file: /export/vmimgs/testvm.qcow2 $
created 2 more snapshots
$ virsh snapshot-list testvm --tree snap1-testvm | +- snap2-testvm | +- snap3-testvm
image file chain[ base<-snap1<-snap2<-snap3 ]:
#--------------------------------------------# $ qemu-img info /export/vmimgs/snap3-testvm.qcow2 image: /export/vmimgs/snap3-testvm.qcow2 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 129M cluster_size: 65536 backing file: /export/vmimgs/snap2-testvm.qcow2 #--------------------------------------------# $ qemu-img info /export/vmimgs/snap2-testvm.qcow2 image: /export/vmimgs/snap2-testvm.qcow2 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 3.6M cluster_size: 65536 backing file: /export/vmimgs/snap1-testvm.qcow2 #--------------------------------------------# $ qemu-img info /export/vmimgs/snap1-testvm.qcow2 image: /export/vmimgs/snap1-testvm.qcow2 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 2.5M cluster_size: 65536 backing file: /export/vmimgs/testvm.qcow2 $ #--------------------------------------------#
Now, if we do not need snap2 any more, and want to pull all the data from snap1 into snap3, making snap1 as snap3’s backing file, we can do a virsh blockpulloperation as below:
$ virsh blockpull --domain testvm \ --path /export/vmimgs/snap3-testvm.qcow2 \ --base /export/vmimgs/snap1-testvm.qcow2 \ --wait --verbose Block Pull: [100 %] Pull complete
可以看到snap3的backup为snap1
$ qemu-img info /export/vmimgs/snap3-testvm.qcow2 image: /export/vmimgs/snap3-testvm.qcow2 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 145M cluster_size: 65536 backing file: /export/vmimgs/snap1-testvm.qcow2
但snapshot-list 仍显示snap2
$ virsh snapshot-list testvm --tree snap1-testvm | +- snap2-testvm | +- snap3-testvm
所以仍可以恢复为
base <- snap123
External disk-snapshots(live) using RAW as original image:
源disk image 不变为raw,而snapshot为qcow2
internal snapshots会导致源disk image变成qcow2