外部快照的创建

实验环境

CentOS 7

  • 升级QEMU

CentOS 7自带的qemu版本太低需要升级

$ sudo yum install -y gcc
$ sudo yum install -y zlib-devel
$ sudo yum install -y glib2-devel
$ sudo yum install -y spice-server-devel.x86_64
$ sudo yum install -y usbredir-devel $ ./configure --target-list=x86_64-softmmu --enable-spice --enable-usb-redir --enable-vnc --enable-kvm --disable-docs
$ make
$ make install
$ sudo yum remove qemu-kvm $ ln -s qemu-kvm /usr/local/bin/qemu-system-x86_64
# sed -e 's/SELINUX=.*/SELINUX=disabled/g' -i /etc/selinux/config && reboot
# sed -e 's/\#user = "root"/user = "root"/' /etc/libvirt/qemu.conf
# sed -e 's/\#group = "root"/group = "root"/' /etc/libvirt/qemu.conf
# service libvirtd restart
# /usr/libexec/qemu-kvm -M ?
# virsh edit domain
# 根据上面的结果修改machine
# <os>
# <type arch='x86_64' machine=''>hvm</type>
# </os>

创建外部快照

  • 查询主机上的虚拟机
# virsh list --all
Id 名称 状态
----------------------------------------------------
2 mos running
- ubuntu 关闭
- winxp 关闭
  • 查询虚拟机快照列表
# virsh snapshot-list mos
名称 生成时间 状态
----------------------------------------------------
  • 查询虚拟机的磁盘
# virsh domblklist mos
目标 源
------------------------------------------------
hda /var/lib/libvirt/images/mos.qcow2
hdb -
  • 创建外部快照
# virsh snapshot-create-as mos fsnap "first snapshot" --atomic --disk-only --diskspec hda,snapshot=external,file=/var/lib/libvirt/images/snapshot.qcow2
# virsh snapshot-list mos
名称 生成时间 状态
------------------------------------------------------------
fsnap 2016-07-03 10:52:15 +0800 disk-snapshot

外部快照文件

  • 快照文件

拍摄快照后会自动生成对应的快照文件,快照文件的根元素<domainsnapshot>下的<disks>元素记录了参与快照的磁盘信息;<domain>记录了快照前虚拟机的状态,即快照前virsh dumpxml domain的信息。通过快照文件我们可以知道哪些磁盘在快照中发生了变化,以及拍摄快照前磁盘的状态。

# pwd
/var/lib/libvirt/qemu/snapshot/mos
# ls
fsnap.xml

外部快照的恢复

目前virsh还不支持外部快照的恢复,所以直接使用virsh snapshot-revert命令是不行的,那么如何手工恢复到快照前的状态呢?

Active层

虚拟机磁盘链的最末端就是Active层,也就是保存磁盘数据变化的层

  • 快照前
mos.qcow2(Active)
  • 快照后
mos.qcow2(fsnap) <==[backing_file]== snapshot.qcow2(Active)

快照后新的磁盘变化将被写入snapshot.qcow2中,mos.qcow2的文件内容将不再改变

  • 再次快照
mos.qcow2(fsnap) <==[backing_file]== snapshot.qcow2(ssnap) <==[backing_file]== active.qcow2(Active)
  • 恢复快照

从上面可以看出,恢复到快照fsnap,就是要再次重复次快照后的动作,以mos.qcow2作为backing_file再创建一个新的Active层。虽然fsnap保存了Active层的磁盘信息,但是Active层并不是快照,原先的Active层没有办法再回去,所以要删除对应磁盘文件。

恢复步骤

  • 查询要恢复快照的状态

根据域名和文件名在/var/lib/libvirt/qemu/snapshot/找到对应的快照文件,并找到参与快照的磁盘在<domain>元素中的file信息

<source file='/var/lib/libvirt/images/mos.qcow2'/>
  • 创建新的Active层

以找到的磁盘文件为backing_file创建新的Active层

# qemu-img create -f qcow2 -o backing_file=/var/lib/libvirt/images/mos.qcow2,backing_fmt=qcow2 /var/lib/libvirt/images/revert_fsnap.qcow2
  • 编辑虚拟机配置文件

根据新创建的Active层磁盘文件信息修改虚拟机的当前磁盘信息

file='/var/lib/libvirt/images/snapshot.qcow2'
修改为
file='/var/lib/libvirt/images/revert_fsnap.qcow2'
  • 编辑虚拟机快照文件

根据新创建的Active层磁盘文件信息使用命令virsh snapshot-edit修改根元素<domainsnapshot>下的<disks>元素

file='/var/lib/libvirt/images/snapshot.qcow2'
修改为
file='/var/lib/libvirt/images/revert_fsnap.qcow2'
  • 修改虚拟机当前快照

使用virsh snapshot-current命令修改虚拟机当前快照

# virsh snapshot-current mos fsnap
已将快照 fsnap 设定为 current
  • 删除旧Active层的磁盘文件
# rm -rf snapshot.qcow2

外部快照的删除

假设虚拟机当前快照如下,要删除的快照为ssnap

mos.qcow2(fsnap) <==[backing_file]== snapshot.qcow2(ssnap) <==[backing_file]== active.qcow2(Active)
  • 合并Active层

因为blockcommit的速度比blockpull要快,所以使用blockcommitActive层的磁盘文件合并到待删除的磁盘文件snapshot.qcow2,并自动更新Active层

# virsh blockcommit mos hda --base snapshot.qcow2 --pivot --active
# virsh domblklist mos
目标 源
------------------------------------------------
hda /var/lib/libvirt/images/snapshot.qcow2

如果快照链很长,只是删除其中的某个元素,那么不能从Active层开始合并,需要指定--top参数

  • 删除快照ssnap元数据
# virsh snapshot-delete mos ssnap --metadata
已删除域快照 ssnap
  • 删除Active层的磁盘文件
# rm -rf active.qcow2

问题处理

虚拟机在启动后,很快就自动进入paused状态

### 解决办法:检查虚拟机对应的qemu日志,查看是否存在磁盘读写问题

Libvirt外部快照的更多相关文章

  1. kvm+libvirt虚拟机快照浅析[转]

    浅析snapshots, blockcommit,blockpull 作者:Kashyap Chamarthy <kchamart#redhat.com> Date: Tue, 23 Oc ...

  2. KVM 介绍(7):使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照 (Nova Instances Snapshot Libvirt)

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  3. KVM(七)使用 libvirt 做 QEMU/KVM 快照和 Nova 实例的快照

    本文将梳理 QEMU/KVM 快照相关的知识,以及在 OpenStack Nova 中使用 libvirt 来对 QEMU/KVM 虚机做快照的过程. 1. QEMU/KVM 快照 1.1 概念 QE ...

  4. qemu-img 快照的一些总结

    qemu-img 快照的一些总结 http://www.openext.org/2014/06/qemu-img-snapshot-re http://blog.csdn.net/muge0913/a ...

  5. 使用virsh命令创建KVM虚拟机快照

    查看虚拟机所在主机和虚拟机名称:[root@node-1 ~]# nova show a88dcf5d-c8b2-46a5-af27-a176d8235c9d|grep hyper| OS-EXT-S ...

  6. 使用libvirtAPI打快照原理

    参考: https://blog.51cto.com/3646344/2096347 https://blog.51cto.com/3646344/2096351(磁盘外部快照) API接口: htt ...

  7. OpenStack虚拟机快照和增量备份实现

    1 快照的概念一般对快照的理解就是能够将系统还原到某个瞬间,这就是快照的作用.快照针对要保存的数据分为内存快照和磁盘快照,内存快照就是保存当前内存的数据,磁盘快照就是保存硬盘的数据.快照针对保存方式又 ...

  8. KVM&amp;Libvirt基本概念及开发杂谈

    导读 大家好,本次肖力分享的主题是KVM&Libvirt基本概念及开发杂谈,内容有些凌乱松散,主要基于自己早期整理的笔记内容和实践感悟,有些内容难免有失偏颇,望见谅.前面先介绍下需要了解的基本 ...

  9. KVM虚拟机快照备份

    KVM 快照的定义:快照就是将虚机在某一个时间点上的磁盘.内存和设备状态保存一下,以备将来之用.它包括以下几类: (1)磁盘快照:磁盘的内容(可能是虚机的全部磁盘或者部分磁盘)在某个时间点上被保存,然 ...

随机推荐

  1. cocos2d-x3.0rc打包apk遇到的一些问题记录

    下载cocos2d-x3.0rc后根据官方教程进行环境配置等等一系列过程没有遇到什么问题 打包apk时出现一些问题: 按照官方教程cmd下运行cocos run -p android -m relea ...

  2. 解析XML(3)

    SAXReader reader = new SAXReader(); Document doc = reader.read(new FileInputStream("emplist.xml ...

  3. mybatis学习(四)

    创建mybatis工程 工程目录: 具体步骤: 1.创建sqlMapConfig.xml文件,配置mybatis的运行环境,事物,数据源,加载mapper映射文件等. 2.创建po类(查询或者返回的属 ...

  4. js 格式华货币

    /*货币格式化*/ function formatMoney(num) { num = num.toString().replace(/\$|\,/g,''); if(isNaN(num)) { nu ...

  5. django admin扩展user表password验证及set_password

    一般如果扩展了django user内置表,在admin后台创建新用户的时候密码将会变成明文,故而导致登录不成功.所以我们在admin.py可以通过form自定义进行对password进行操作,可以双 ...

  6. BZOJ4676 Xor-Mul棋盘

    传送门 题目大意懒得写了,题目说的挺明白的了 题解 主要的难点在于异或意义下的最大值和很玄学,但不难发现这道题中让你定义的$D_{i,j}$只参与异或运算,所以我们可以逐位进行讨论.所以我们每一位就只 ...

  7. [HDU5290]Bombing plan

    vjudge sol 树DP. 首先把模型转换成:每个点可以控制与它距离不超过\(w_i\)的点,先要求选出数量最少的点控制所有点. 设\(f[i][-100...100]\)表示\(i\)号点向上还 ...

  8. NOIP2018爆炸记

    又是一年\(NOIP\),可能是梦结束的地方? 之所以咕了这么久是得先确定自己不会退役,因为分太低了. 和去年一样在学校门前照了相,然后上车走了.高三回来考的只剩下\(p2oileen\)学姐了.新一 ...

  9. 霍夫变换Hough

    http://blog.csdn.net/sudohello/article/details/51335237 霍夫变换Hough 霍夫变换(Hough)是一个非常重要的检测间断点边界形状的方法.它通 ...

  10. docker-建立私有registry

    我们知道可以使用hub.docker.com作为我们公共或者私有的registry.但由于服务器在国外的原因,网速会非常的慢.所以我们在利用docker开发构建容器服务时,我们希望能够建立自己的私有r ...