**** TEST [21-oct-2012] . 'recursive' blockcommit on disk images **** Actual: base(qcow2) <- sn1 <- sn2 <- sn3 <- sn3(active) Desired: base(qcow2) <- sn3(active) - by doing: blockcommit sn3 into sn2 ; blockcommit sn2 into sn1 ; blockcommit sn1 into base - The above way, sn1, sn2, sn3 will remain valid 0] List the block dev [root@moon vmimgs2]# virsh domblklist optimized-base-f17 Target Source ----------------------------------------------------- vda /export/vmimgs2/optimized-base-f17.qcow2 [root@moon vmimgs2]# 1] - Before taking snap1, do : #mkdir /export ; touch /export/file1.txt ; echo foo > /export/file1.txt - Take snapshot1 ; list the blockdevices of the domain [root@moon vmimgs2]# virsh snapshot-create-as --domain optimized-base-f17 snap1 snap1-desc --disk-only --diskspec vda,snapshot=external,file=/export/vmimgs2/snap1-optbase.qcow2 --atomic Domain snapshot snap1 created [root@moon vmimgs2]# [root@moon vmimgs2]# virsh domblklist optimized-base-f17 Target Source ------------------------------------------------ vda /export/vmimgs2/snap1-optbase.qcow2 [root@moon vmimgs2]# 2] - Before taking snap2, do : cp /export/file1.txt /export/file2.txt - Take snapshot2 ; list the blockdevices of the domain [root@moon vmimgs2]# virsh snapshot-create-as --domain optimized-base-f17 snap2 snap2-desc --disk-only --diskspec vda,snapshot=external,file=/export/vmimgs2/snap2-optbase.qcow2 --atomic Domain snapshot snap1 created [root@moon vmimgs2]# [root@moon vmimgs2]# virsh domblklist optimized-base-f17 Target Source ------------------------------------------------ vda /export/vmimgs2/snap2-optbase.qcow2 [root@moon vmimgs2]# 3] - Before taking snap3, do : cp /export/file1.txt /export/file3.txt - Take snapshot3 ; list the blockdevices of the domain [root@moon vmimgs2]# virsh snapshot-create-as --domain optimized-base-f17 snap3 snap3-desc --disk-only --diskspec vda,snapshot=external,file=/export/vmimgs2/snap3-optbase.qcow2 --atomic Domain snapshot snap1 created [root@moon vmimgs2]# [root@moon vmimgs2]# virsh domblklist optimized-base-f17 Target Source ------------------------------------------------ vda /export/vmimgs2/snap3-optbase.qcow2 [root@moon vmimgs2]# 4] - Before taking snap4, do : cp /export/file1.txt /export/file4.txt - Take snapshot4 ; list the blockdevices of the domain [root@moon vmimgs2]# virsh snapshot-create-as --domain optimized-base-f17 snap4 snap4-desc --disk-only --diskspec vda,snapshot=external,file=/export/vmimgs2/snap4-optbase.qcow2 --atomic Domain snapshot snap1 created [root@moon vmimgs2]# 4.1] After taking a snapshot, do cp /export/file1.txt /export/file4.txt [root@moon vmimgs2]# virsh domblklist optimized-base-f17 Target Source ------------------------------------------------ vda /export/vmimgs2/snap4-optbase.qcow2 [root@moon vmimgs2]# => Do a qemu monitor 'query-block' of the guest ======== [root@moon ~]# virsh qemu-monitor-command optimized-base-f17 --pretty '{"execute":"query-block"}' { "return": [ { "io-status": "ok", "device": "drive-virtio-disk0", "locked": false, "removable": false, "inserted": { "iops_rd": 0, "iops_wr": 0, "ro": false, "backing_file_depth": 4, "drv": "qcow2", "iops": 0, "bps_wr": 0, "backing_file": "/export/vmimgs2/snap3-optbase.qcow2", "encrypted": false, "bps": 0, "bps_rd": 0, "file": "/export/vmimgs2/snap4-optbase.qcow2", "encryption_key_missing": false }, "type": "unknown" } ], "id": "libvirt-7" } [root@moon ~]# ======== => list files in base & all snapshots BEFORE 'blockcommit' ======== [root@moon vmimgs2]# guestfish --ro -i -a /export/vmimgs2/optimized-base-f17.qcow2 ls /export file1.txt [root@moon vmimgs2]# guestfish --ro -i -a /export/vmimgs2/snap1-optbase.qcow2 ls /export file1.txt file2.txt [root@moon vmimgs2]# guestfish --ro -i -a /export/vmimgs2/snap2-optbase.qcow2 ls /export file1.txt file2.txt file3.txt [root@moon vmimgs2]# guestfish --ro -i -a /export/vmimgs2/snap3-optbase.qcow2 ls /export file1.txt file2.txt file3.txt file4.txt [root@moon vmimgs2]# guestfish --ro -i -a /export/vmimgs2/snap4-optbase.qcow2 ls /export file1.txt file2.txt file3.txt file4.txt file5.txt [root@moon vmimgs2]# ======== => List the sizes of disk images BEFORE blockcommit: ======== [root@moon vmimgs2]# ls -lash /export/vmimgs2/optimized-base-f17.qcow2 1.1G -rw-r--r--. 1 qemu qemu 1.1G Oct 21 17:17 /export/vmimgs2/optimized-base-f17.qcow2 [root@moon vmimgs2]# ls -lash /export/vmimgs2/*-optbase* 392K -rw-------. 1 qemu qemu 448K Oct 21 17:21 /export/vmimgs2/snap1-optbase.qcow2 776K -rw-------. 1 qemu qemu 832K Oct 21 17:22 /export/vmimgs2/snap2-optbase.qcow2 840K -rw-------. 1 qemu qemu 896K Oct 21 17:26 /export/vmimgs2/snap3-optbase.qcow2 904K -rw-------. 1 qemu qemu 960K Oct 21 17:43 /export/vmimgs2/snap4-optbase.qcow2 [root@moon vmimgs2]# ======== ======== [root@moon vmimgs2]# virsh snapshot-list optimized-base-f17 Name Creation Time State ------------------------------------------------------------ snap1 2012-10-21 17:18:46 +0530 disk-snapshot snap2 2012-10-21 17:21:52 +0530 disk-snapshot snap3 2012-10-21 17:23:10 +0530 disk-snapshot snap4 2012-10-21 17:26:42 +0530 disk-snapshot [root@moon vmimgs2]# ======== [Test-1]: Negative: Try to pass the active layer into its backing file: =================== [root@moon vmimgs2]# virsh blockcommit --domain optimized-base-f17 vda --base /export/vmimgs2/snap3-optbase.qcow2 --top /export/vmimgs2/snap4-optbase.qcow2 --wait --verbose error: internal error unable to execute QEMU command 'block-commit': Top image as the active layer is currently unsupported [root@moon vmimgs2]# =================== => Disk image backing chain BEFORE 'blockcommit' =================== [kashyap@moon qemu-n]$ sudo ./qemu-img info --backing-chain /export/vmimgs2/snap4-optbase.qcow2 image: /export/vmimgs2/snap4-optbase.qcow2 file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 904K cluster_size: 65536 backing file: /export/vmimgs2/snap3-optbase.qcow2 backing file format: qcow2 image: /export/vmimgs2/snap3-optbase.qcow2 file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 904K cluster_size: 65536 backing file: /export/vmimgs2/snap2-optbase.qcow2 backing file format: qcow2 image: /export/vmimgs2/snap2-optbase.qcow2 file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 1.0M cluster_size: 65536 backing file: /export/vmimgs2/snap1-optbase.qcow2 backing file format: qcow2 image: /export/vmimgs2/snap1-optbase.qcow2 file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 392K cluster_size: 65536 backing file: /export/vmimgs2/optimized-base-f17.qcow2 backing file format: qcow2 image: /export/vmimgs2/optimized-base-f17.qcow2 file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 1.0G cluster_size: 65536 [kashyap@moon qemu-n]$ =================== [Test-2]: Positive: Recursively merge merge overlays into their spective backing files: sn3 into sn2 ; sn2 into sn1 ; sn1 into base => Merge Snap3 into Snap1, and check the backing chain info: =========================== [root@moon vmimgs2]# virsh blockcommit --domain optimized-base-f17 vda --base /export/vmimgs2/snap2-optbase.qcow2 --top /export/vmimgs2/snap3-optbase.qcow2 --wait --verbose Block Commit: [100 %] Commit complete [root@moon vmimgs2]# =========================== [kashyap@moon qemu-n]$ sudo ./qemu-img info --backing-chain /export/vmimgs2/snap4-optbase.qcow2 image: /export/vmimgs2/snap4-optbase.qcow2 file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 904K cluster_size: 65536 backing file: /export/vmimgs2/snap2-optbase.qcow2 backing file format: qcow2 image: /export/vmimgs2/snap2-optbase.qcow2 file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 1.0M cluster_size: 65536 backing file: /export/vmimgs2/snap1-optbase.qcow2 backing file format: qcow2 image: /export/vmimgs2/snap1-optbase.qcow2 file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 392K cluster_size: 65536 backing file: /export/vmimgs2/optimized-base-f17.qcow2 backing file format: qcow2 image: /export/vmimgs2/optimized-base-f17.qcow2 file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 1.0G cluster_size: 65536 [kashyap@moon qemu-n]$ =========================== => Now, blockcommit snap2 into snap1, and check the backing chain info: =========================== [root@moon vmimgs2]# virsh blockcommit --domain optimized-base-f17 vda --base /export/vmimgs2/snap1-optbase.qcow2 --top /export/vmimgs2/snap2-optbase.qcow2 --wait --verbose Block Commit: [100 %] Commit complete [root@moon vmimgs2]# =========================== [kashyap@moon qemu-n]$ sudo ./qemu-img info --backing-chain /export/vmimgs2/snap4-optbase.qcow2 image: /export/vmimgs2/snap4-optbase.qcow2 file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 904K cluster_size: 65536 backing file: /export/vmimgs2/snap1-optbase.qcow2 backing file format: qcow2 image: /export/vmimgs2/snap1-optbase.qcow2 file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 1.1M cluster_size: 65536 backing file: /export/vmimgs2/optimized-base-f17.qcow2 backing file format: qcow2 image: /export/vmimgs2/optimized-base-f17.qcow2 file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 1.0G cluster_size: 65536 [kashyap@moon qemu-n]$ =========================== => Now, blockcommit snap1 into snap2, and check the backing chain info: =========================== [root@moon vmimgs2]# virsh blockcommit --domain optimized-base-f17 vda --base /export/vmimgs2/optimized-base-f17.qcow2 --top /export/vmimgs2/snap1-optbase.qcow2 --wait --verbose Block Commit: [100 %] Commit complete [root@moon vmimgs2]# =========================== [kashyap@moon qemu-n]$ sudo ./qemu-img info --backing-chain /export/vmimgs2/snap4-optbase.qcow2 image: /export/vmimgs2/snap4-optbase.qcow2 file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 904K cluster_size: 65536 backing file: /export/vmimgs2/optimized-base-f17.qcow2 backing file format: qcow2 image: /export/vmimgs2/optimized-base-f17.qcow2 file format: qcow2 virtual size: 1.0G (1073741824 bytes) disk size: 1.0G cluster_size: 65536 [kashyap@moon qemu-n]$ =========================== The above shows clearly the effect of blockcommit -- where the backingchain is reduced => list files in base & all snapshots AFTER 'blockcommit' =========================== [root@moon vmimgs2]# guestfish --ro -i -a /export/vmimgs2/optimized-base-f17.qcow2 ls /export file1.txt file2.txt file3.txt file4.txt [root@moon vmimgs2]# guestfish --ro -i -a /export/vmimgs2/snap1-optbase.qcow2 ls /export file1.txt file2.txt file3.txt file4.txt [root@moon vmimgs2]# guestfish --ro -i -a /export/vmimgs2/snap2-optbase.qcow2 ls /export file1.txt file2.txt file3.txt file4.txt [root@moon vmimgs2]# guestfish --ro -i -a /export/vmimgs2/snap3-optbase.qcow2 ls /export file1.txt file2.txt file3.txt file4.txt [root@moon vmimgs2]# =========================== Blockcommit shows => List the sizes of disk images BEFORE blockcommit: ======== [root@moon vmimgs2]# ls -lash /export/vmimgs2/*-optbase* 1.1M -rw-------. 1 qemu qemu 1.2M Oct 21 17:52 /export/vmimgs2/snap1-optbase.qcow2 1.1M -rw-------. 1 qemu qemu 1.1M Oct 21 17:49 /export/vmimgs2/snap2-optbase.qcow2 840K -rw-------. 1 qemu qemu 896K Oct 21 17:26 /export/vmimgs2/snap3-optbase.qcow2 904K -rw-------. 1 qemu qemu 960K Oct 21 17:54 /export/vmimgs2/snap4-optbase.qcow2 [root@moon vmimgs2]# ======== => Now, after the 'blockcommit', we could delete the snapshot metadata, so that it reflects the new reality of disk-snapshots: ======== [root@moon vmimgs2]# virsh snapshot-delete --domain optimized-base-f17 snap3 --metadata Domain snapshot snap3 deleted [root@moon vmimgs2]# virsh snapshot-delete --domain optimized-base-f17 snap2 --metadata Domain snapshot snap2 deleted [root@moon vmimgs2]# virsh snapshot-delete --domain optimized-base-f17 snap1 --metadata Domain snapshot snap1 deleted [root@moon vmimgs2]# ======== ======== [root@moon optimized-base-f17]# virsh snapshot-list optimized-base-f17 Name Creation Time State ------------------------------------------------------------ snap4 2012-10-21 17:26:42 +0530 disk-snapshot [root@moon optimized-base-f17]# ========