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

以下内容已屏蔽图片优化访问速度
KVM的镜像也是可以像孙悟空说“定”一样保存下当前的状态的,也是可以有层级的,层级之间是可以灵活操作的,这些操作在KVM里面叫做snapshot。


Snapshot广义来讲分为三个级别:
Volume Manager级别:常见的是LVM的snapshot,在openstack中,对block storage进行snapshot对应这个级别
lvcreate --size 100M --snapshot --name snap /dev/vg00/lvol1
文件系统级别: OCFS2,常用的ext3不支持
文件级别:raw文件不支持snapshot,qcow2支持snapshot,分两种
Internal Snapshot: snapshot保存在qcow2文件的内部
VM State snapshot: snapshot整个VM,而不仅仅是disk
Disk State snapshot: 仅仅snapshot这个disk
External Snapshot: 原来的qcow2成为read-only的模式,新的改变保存到另外的qcow2文件


一、Internal Snapshot中的VM State snapshot


启动一个虚拟机
[IMG]
在虚拟机里面启动一个python进程,里面无限循环
[IMG]
将VM State保存在一个文件里面



virsh save ubuntutest ubuntutest_vmstate


完毕后虚拟机被关闭
[IMG]


直接启动虚拟机


virsh start ubuntutest


启动一个全新的虚拟机,python进程不存在


恢复虚拟机


virsh restore ubuntutest_vmstate


虚拟机启动了


VNC登录虚拟机,发现python进行和原来的状态一样


[IMG]


二、Internal Snapshot中的Disk State snapshot


这种snapshot是在虚拟机在运行状态下进行的


查看snapshot的信息,为空


virsh snapshot-list ubuntutest


创建snapshot


virsh snapshot-create ubuntutest


创建过程中虚拟机处于pause的状态


[IMG]


查看snapshot的信息


[IMG]


查看Image的信息



[IMG]


创建了internal snapshot后,vm无法undefined


virsh destroy ubuntutest


[IMG]


删除snapshot


virsh snapshot-delete ubuntutest 1412782509


[IMG]


三、External Snapshot


查看block storage


virsh domblklist ubuntutest –details


[IMG]


创建一个snapshot


virsh snapshot-create-as ubuntutest snap1-ubuntutest "snap1 description" --diskspec vda,file=/home/openstack/snap1-ubuntutest.qcow2 --disk-only --atomic


如果报下面的错误,则是apparmor在作怪,参考下面的操作:


[IMG]


修改/etc/libvirt/qemu.conf,其中security_driver = [ “selinux”, “apparmor” ]改为security_driver = "none“



重启libvirt: service libvirt-bin restart


重启虚拟机:virsh destroy ubuntutest,virsh start ubuntutest
可以正确执行了


[IMG]



虚拟机使用新的snapshot作为硬盘,在snapshot后创建一个512M的文件


[IMG]


再创建两个snapshot,每打一次snapshot都创建一个512M的文件


virsh snapshot-create-as ubuntutest snap2-ubuntutest "snap2 description" --diskspec vda,file=/home/openstack/snap2-ubuntutest.qcow2 --disk-only --atomic


virsh snapshot-create-as ubuntutest snap3-ubuntutest "snap3 description" --diskspec vda,file=/home/openstack/snap3-ubuntutest.qcow2 --disk-only --atomic


[IMG]


虚拟机使用新的snapshot作为硬盘


查看文件backing_file链
查看snapshot



[IMG]


四、管理qcow2 backing chain


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


[IMG]


方式一: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)


完成后结果如下:


[IMG]


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


完成后结果如下:


[IMG]


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


完成后结果如下:


[IMG]


最顶层的和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中


[IMG]


方式二: virsh blockpull/virDomainBlockRebase


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


[IMG]


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


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


[IMG]


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


[IMG]


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


[IMG]


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


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


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


[IMG]


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


[IMG]


创建一个transient的domain


virsh create ubuntutest_transient.xml


[IMG]


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


[IMG]


创建一个空的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


[IMG]


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



这里必须创建transient domain,否则会报如下错误
error: Requested operation is not valid: domain is not transient
商人马东的撕裂:当底牌只剩《奇葩说》 为什么阿里、华为都爱招这样的外地年轻人? 赵薇黄有龙终结篇 坐牢10多年的劳改犯,总统总理却为他点赞,还月赚450万?! 有了Openvswitch和Docker,终于可以做《TCPIP详解》的实验了!
好看吗?
总执行时间0.07314157485961914,文章查询时间0.046868085861206055,分类查询时间0.009813547134399414,其他脚本0.0003159046173095703,模板渲染0.0161440372467041