不仅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

启动一个虚拟机

e6f04566e3e2950ffa076121bdd4343a.png

在虚拟机里面启动一个python进程,里面无限循环

5f54287295173cdfd7d5c768d74afe27.png

将VM State保存在一个文件里面

virsh save ubuntutest ubuntutest_vmstate

完毕后虚拟机被关闭

05a606494c2f46026b04f6f5c32265b2.png

直接启动虚拟机

virsh start ubuntutest

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

恢复虚拟机

virsh restore ubuntutest_vmstate

虚拟机启动了

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

1ce23b44fd8d9df808624a34e93cf05a.png

二、Internal Snapshot中的Disk State snapshot

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

查看snapshot的信息,为空

virsh snapshot-list ubuntutest

创建snapshot

virsh snapshot-create ubuntutest

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

3ccf08892f630e11a94d675bfaec181e.png

查看snapshot的信息

507c9f0c0fb09ba06dec335d0871b435.png

查看Image的信息

b3c07654bf3c3f5617dc8be825370df9.png

创建了internal snapshot后,vm无法undefined

virsh destroy ubuntutest

617fcf05935e44c5f266e76aa4240a9c.png

删除snapshot

virsh snapshot-delete ubuntutest 1412782509

2aa8ab339418fb980f56315e2d575e39.png

三、External Snapshot

查看block storage

virsh domblklist ubuntutest –details

8f52fff18959081d6ccdd5fca14b73ad.png

创建一个snapshot

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

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

87672082cec2466f900e26df7ad0af89.png

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

重启libvirt: service libvirt-bin restart

重启虚拟机:virsh destroy ubuntutest,virsh start ubuntutest

可以正确执行了

15441f99870d5078ac983bff396d3dac.png

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

581c57b9829091ca1292bcff526ce567.png

再创建两个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

4b66fc232d84ae5ba54ca452deb0c965.png

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

查看文件backing_file链

查看snapshot

c3291053bb2e753edf94c80b1b7867e7.png

四、管理qcow2 backing chain

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

7301e48153659f008ea10fccc1acb984.png

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

完成后结果如下:

ef1bd87eda2c117e18e96cdae25b8bc1.png

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

完成后结果如下:

d7009fe4baebfb9d5cd8825ba78851b7.png

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

完成后结果如下:

71a6b93f3be1abf0d2b6dbb90dcc5dbe.png

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

fc165df910dc07f6764c1d6fee5c36df.png

方式二: virsh blockpull/virDomainBlockRebase

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

2e19229d4a1515326e1ad8060366e150.png

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

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

d40bcc389b43dcfb6acab248149306ca.png

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

10ac1671563ce50174ea2236264e0313.png

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

b08c6b2c58b5c375fd9cdb479b8efd01.png

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

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

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

f0b447bb5fed5c11aa7bcbe9513ec8cc.png

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

883f1c498fde7cf707c0c084feff5213.png

创建一个transient的domain

virsh create ubuntutest_transient.xml

dcc3875fea2d873b0ac3dfb8b125b300.png

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

0e0d3071a54af722a2750a9b9a7490b1.png

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

624e9cfa1c5c5182a8911973163db814.png

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

popsuper1982

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值