(Thanks to Eric Blake for his explanation.) Purpose: Demonstrate the use of '--reuse-external', '--shallow' flags with blockcopy. The benefits are (a) You can control what the backing file is, as long as the top of that backing file chain has identical guest contents to what the original chain sees as its backing file. (b) You can use the different file to be a different backing chain depth or even different format. Assuming you have a qcow2 chain: base.qcow2 <-- sn1.qcow2 <-- sn2.qcow2 Then, perform the blockcopy --reuse-external --shallow allows you to have: base.qcow2 <-- sn1.qcow2 <-- sn2.qcow2 = = flat-sn1-base.raw <-- copy.qcow2 * * * Example (of the above concept) to demonstrate control over backing files (and their format) using --reuse-external --shallow ------------------------------------------------------------------------ (1) Check the existing block device $ virsh domblklist vm1 (2) Create two external snapshots (each with distinct contents): $ virsh snapshot-create-as --domain vm1 sn1 \ --diskspec vda,file=/export/images/sn1.qcow2 \ --disk-only --atomic --no-metadata $ virsh snapshot-create-as --domain vm1 sn2 \ --diskspec vda,file=/export/images/sn2.qcow2 \ --disk-only --atomic --no-metadata So, a chain like this is created: [base] <- [sn1] <- [sn2] (3) Flatten [base] <- [sn1] into a single image: flat-sn1-base.raw $ qemu-img convert -f qcow2 -O raw sn1.qcow2 flat-sn1-base.raw -p (4) Create an empty QCOW2 wrapper around the flattened Raw file $ qemu-img create -f qcow2 \ -o backing_file=flat-sn1-base.raw,backing_fmt=raw copy.qcow2 (5) Check the backing chain: $ qemu-img info --backing-chain copy.qcow2 (6) Make the domain trainsient: $ virsh dumpxml vm1 > /var/tmp/vm1.xml $ virsh undefine vm1 (7) Perform blockcopy with --reuse-external --shallow $ virsh blockcopy --domain vm1 vda /export/images/copy.qcow2 \ --reuse-external --shallow --wait --verbose --finish (8) Define the geust back: $ virsh define /var/tmp/vm1.xml End result: base <-- sn1 <-- sn2 = = flat-sn1-base <-- copy