不仅Docker有镜像,KVM也有多种方式操作镜像(2)

叁叁肆2018-11-06 15:54

此文已由作者刘超授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。


四、管理qcow2 backing chain


上面创建的镜像直接的逻辑关系如下:



方式一:virsh blockcommit/virDomainBlockCommit


将内容从snapshot commit到base


virsh blockcommit ubuntutest vda --base /home/openstack/images/ubuntutest.qcow2 --top /home/openstack/snap1-ubuntutest.qcow2 --wait --verbose


virDomainBlockCommit(dom, "vda", "ubuntutest.qcow2", "snap1-ubuntutest.qcow2", 0, 0)


完成后结果如下:



virDomainBlockCommit(dom, "vda", "snap1-ubuntutest.qcow2 ", "snap2-ubuntutest.qcow2", 0, 0)


完成后结果如下:



virDomainBlockCommit(dom, "vda", " ubuntutest.qcow2", "snap2-ubuntutest.qcow2", 0, 0)


完成后结果如下:



最顶层的和base的都不能被commit,因而commit之后的结果最少有两层,一层base,一层top


virsh blockcommit ubuntutest vda --base /home/openstack/images/ubuntutest.qcow2 --top /home/openstack/snap2-ubuntutest.qcow2 --wait --verbose


Snap2和snap1的512M都合并到了ubuntutest.qcow2中



方式二: virsh blockpull/virDomainBlockRebase


将内容从base pull到snapshot。还是以上面的例子开始。



virsh blockpull ubuntutest  --path /home/openstack/snap3-ubuntutest.qcow2 --base /home/openstack/images/ubuntutest.qcow2 --wait –verbose


virDomainBlockRebase(dom, "vda", NULL, 0, 0)



virDomainBlockRebase(dom, "vda", "ubuntutest.qcow2", 0, 0)



virDomainBlockRebase(dom, "vda", "snap1-ubuntutest.qcow2", 0, 0)



仅仅能够pull到top的image,而不能是其他的snapshot


virsh blockpull ubuntutest  --path /home/openstack/snap3-ubuntutest.qcow2 --wait --verbose


Ubuntutest.qcow2的内容并入snap3-ubuntutest.qcow2,snap3独立存在,是虚拟机的当前active硬盘



Libvirt对backing_file链和snapshot列表是分开管理的,backing_file链的改变并不会改变snapshot-list


这个时候virsh snapshot-list ubuntutest –tree还是原来的结果


如果在改变backing_file链之后,要删除snapshot-list,可以只删除metadata


virsh snapshot-delete --metadata ubuntutest snap1-ubuntutest


当然也可以在创建snapshot的时候,不创建metadata


virsh snapshot-create --no-metadata


方式三:blockcopy,将内容复制到另一个Image


Openstack中snapshot就是这样实现的


通常有一个base Image: /home/openstack/images/ubuntutest.qcow2


为每一个虚拟机创建一个单独的硬盘


qemu-img create -f qcow2 -o backing_file=/home/openstack/images/ubuntutest.qcow2 ubuntutest_origin.qcow2


创建transient domain的xml


ubuntutest_transient.xml



创建一个transient的domain


virsh create ubuntutest_transient.xml



在虚拟机里面创建512M的文件,dd if=/dev/zero of=hello.img bs=1024k count=500



创建一个空的snapshot文件,指向base Image


qemu-img create -f qcow2 -o backing_file=/home/openstack/images/ubuntutest.qcow2 ubuntutest_snapshot.qcow2


进行block copy


virsh blockcopy --domain ubuntutest_transient --path /home/openstack/images/ubuntutest_origin.qcow2 --dest /home/openstack/images/ubuntutest_snapshot.qcow2 --shallow --reuse-external --wait –verbose



从ubuntu_snapshot.qcow2启动查看,hello.img存在


这里必须创建transient domain,否则会报如下错误

error: Requested operation is not valid: domain is not transient


容器服务是网易云提供的无服务器容器服务,让企业能够快速部署业务,轻松运维服务。容器服务支持弹性伸缩、垂直扩容、灰度升级、服务发现、服务编排、错误恢复及性能监测等功能。点击可免费试用


免费体验云安全(易盾)内容安全、验证码等服务

11.1—11.15云计算基础服务全场5折起

更多网易技术、产品、运营经验分享请点击