KVM虚拟机快照研究(二)

使用Python脚本操作快照

上一篇中介绍了KVM虚拟机各种快照的原理和命令行操作方法,由于磁盘外部快照最实用,所以本篇主要讲怎么利用Libvirt api操作磁盘外部快照。其中会涉及一些Libvirt api的基本用法,也会一起介绍。

操作环境

环境同上篇。Python与libvirt服务交互用的是libvirt模块;操作虚拟机的XML描述文件用的是xml.dom模块。

创建快照

我们要完成的功能是,给出一个虚拟机的名称,创建这个虚拟机的磁盘快照。

首先建立与libvirt服务的连接,然后根据虚拟机名称获取该domain对象:


conn = libvirt.open("qemu:///system")

dom = conn.lookupByName('vm')

domain对象的方法snapshotCreateXML()实现了通过一个XML描述文件创建快照的功能,该方法接收的参数是一个描述快照的XML字符串(不是文件)和标志位flags。快照的XML描述文件一般是下面这种格式:


<domainsnapshot>

<name>snapshot01</name>

<description>test api</description>

<disks>

<disk name='/path/diskname'>

</disk>

<disk name='/path/diskname'>

</disk>

</disks>

</domainsnapshot>

可以看出,构建快照的XML描述文件需要首先获取到虚拟机的磁盘文件名,获取方法是读取并解析虚拟机的xml文件:


xml = dom.XMLDesc(0)

doc = minidom.parseString(xml)

disks = doc.getElementsByTagName('disk')

for disk in disks:

if disk.getAttribute('device') == 'disk':

diskfile = disk.getElementsByTagName('source')[0].getAttribute('file')

print diskfile

这段代码的输出结果是:


[root@localhost snapshot]# python test.py

/data/vm.img

/data/data.img

然后把磁盘文件的名字填到快照xml里,存放在文件snapshot01.xml中:


<domainsnapshot>

<name>snapshot01</name>

<description>test api</description>

<disks>

<disk name='/data/vm.img'>

</disk>

<disk name='/data/data.img'>

</disk>

</disks>

</domainsnapshot>

另一个参数是标志位flags,Libvirt定义了一系列标志位控制创建快照的行为,每一位的作用可以通过查看Libvirt官方文档得知。Libvirt官方文档只有C语言的api文档,Python api的用法基本跟C语言的一致,所以不影响我们参考。标志位的取值及含义如下:


#Restore or alter metadata

VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE    =   1

#With redefine, make snapshot current

VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT =   2

#Make snapshot without remembering it

VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA =   4

#Stop running guest after snapshot

VIR_DOMAIN_SNAPSHOT_CREATE_HALT =   8

#disk snapshot, not system checkpoint

VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY   =   16

#reuse any existing external files

VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT   =   32

#use guest agent to quiesce all mounted file systems   within the domain

VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE =   64

#atomically avoid partial changes

VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC  =   128

#create the snapshot while the guest is running

VIR_DOMAIN_SNAPSHOT_CREATE_LIVE =   256

我们需要用到的标志有VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA,VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY和VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC,分别对应virsh snapshot-create-as命令的参数--disk-only,--no-metadata和--atmotic。多个标志位叠加是通过二进制按位或操作,换算成十进制下的操作就是相加,所以flags的值为4+16+128=148。


snapshotXML = open('snapshot01.xml','rb').read()

dom.snapshotCreateXML(snapshotXML,flags=148)

脚本内容汇总如下:


#!/usr/bin/python

import libvirt

import sys

from xml.dom import minidom

def getDom(vm):

try:

conn = libvirt.open("qemu:///system")

dom = conn.lookupByName(vm)

return dom

except Exception,e:

print "Get domain   object of vm %s failed: %s" % (vm,str(e))

sys.exit(1)

def getDiskfile(vm):

dom = getDom(vm)

xml = dom.XMLDesc(0)

doc = minidom.parseString(xml)

disks = doc.getElementsByTagName('disk')

diskfiles = []

for disk in disks:

if disk.getAttribute('device') == 'disk':

diskfile = disk.getElementsByTagName('source')[0].getAttribute('file')

diskfiles.append(diskfile)

return diskfiles

def createXML(vm):

diskfiles = getDiskfile(vm)

xml = """<domainsnapshot>

<name>snapshot01</name>

<description>test api</description>

<disks>

<disk   name='%s'>

</disk>

<disk   name='%s'>

</disk>

</disks>

</domainsnapshot>""" % (diskfiles[0],diskfiles[1])

with open('snapshot01.xml','w') as f:

f.write(xml)

def createSnapshot(vm):

dom = getDom(vm)

snapshotXML = open('snapshot01.xml','rb').read()

dom.snapshotCreateXML(snapshotXML,flags=148)

if __name__ == "__main__":

createXML('vm')

createSnapshot('vm')

合并快照文件

首先为虚拟机创建4个快照,现在磁盘文件形成了如下back chain(原理见上篇文章):

base<-snapshot01<-snapshot02<-snapshot03<-snapshot04*

我们要通过api把snapshot03合并到snapshot02,用到的方法是blockCommit(),该方法有3个必须提供的参数disk,base和top,分别对应virsh blockcommit命令的参数--path,--base和--top。把命令virsh blockcommit --domain vm –path vda --base /data/vm.snapshot02 --top /data/vm.snapshot03翻译成Python代码就是:


dom.blockCommit('vda','/data/vm.snapshot02','/data/vm.snapshot03')

合并快照文件可能需要很长时间,但是blockCommit是异步的,执行完立即返回,如果我们想查看后台的这个合并任务,需要用blockJobInfo()方法查看合并任务是否已完成。

脚本内容汇总如下:


#!/usr/bin/python

import libvirt

import sys

def getDom(vm):

try:

conn = libvirt.open("qemu:///system")

dom = conn.lookupByName(vm)

return dom

except Exception,e:

print "Get domain   object of vm %s failed: %s" % (vm,str(e))

sys.exit(1)

if __name__ == "__main__":

dom = getDom('vm')

dom.blockCommit('vda','/data/vm.snapshot02','/data/vm.snapshot03')

dom.blockCommit('vdb','/data/data.snapshot02','/data/data.snapshot03')

原文地址:http://blog.51cto.com/3646344/2096351

时间: 2024-11-06 03:45:28

KVM虚拟机快照研究(二)的相关文章

KVM虚拟机快照研究(一)

KVM虚拟机的快照用来保存虚拟机在某个时间点的内存.磁盘或者设备状态,如果将来有需要可以把虚拟机的状态回滚到这个时间点. 根据被做快照的对象不同,快照可以分为磁盘快照和内存快照,两者加起来构成了一个系统还原点,记录虚拟机在某个时间点的全部状态:根据做快照时虚拟机是否在运行,快照又可以分为在线快照和离线快照. 磁盘快照根据存储方式的不同,又分为内部快照和外部快照:内部快照只支持qcow2格式的虚拟机镜像,把快照及后续变动都保存在原来的qcow2文件内:外部快照在创建时,快照被保存在单独一个文件中,

kvm 虚拟机快照备份

raw相比qcow2就缺乏的三个功能,但都能通过别的方式解决:1.加密功能:把raw本身就当普通文件加密之搞定2.快照功能:把raw加入版本管理目录中,具体需要的设置可能稍微有点多.3.宿主机不支持按需打孔模式(hole):这个可以自己根据使用情况来扩展raw的最大值4.硬盘压缩:就当普通电脑文件压缩之即可 而raw有qcow2所无法媲美的功能:1.效率高于qcow22.直接读写虚拟机硬盘里面的文件,这比较"暴力",但既然可以这么暴力,那么也就不怕虚拟机出任何问题了.3.通用性好,是转

KVM虚拟机快照链创建,合并,删除及回滚研究

1 QEMU,KVM,libvirt关系 QEMU QEMU提供了一个开源的服务器全虚拟化解决方案,它可以使你在特定平台的物理机上模拟出其它平台的处理器,比如在X86 CPU上虚拟出Power的CPU,此时的guest OS感觉不到虚拟机的存在,就像运行在物理机上,QEMU可以单独使用模拟CPU和各种外设,也可以作为一个用户空间工具和运行在内核中的KVM结合使用以充分发挥KVM的功能,QEMU的wiki KVM KVM是一个基于内核的虚拟机(Linux中一个可加载模块),在硬件支持虚拟化(int

KVM虚拟机快照备份

KVM 快照的定义:快照就是将虚机在某一个时间点上的磁盘.内存和设备状态保存一下,以备将来之用.它包括以下几类: (1)磁盘快照:磁盘的内容(可能是虚机的全部磁盘或者部分磁盘)在某个时间点上被保存,然后可以被恢复. 磁盘数据的保存状态: 在一个运行着的系统上,一个磁盘快照很可能只是崩溃一致的(crash-consistent) 而不是完整一致(clean)的,也是说它所保存的磁盘状态可能相当于机器突然掉电时硬盘数据的状态,机器重启后需要通过 fsck 或者别的工具来恢复到完整一致的状态(类似于

KVM虚拟机快照(持续更新)

以前使用vmware和virtualbox时快照是常用的功能,并且也很好用.KVM的虚拟机操作方式: 一.内置快照     # 创建快照 [[email protected] ~]$ qemu-img snapshot -c networkNode_justInstall.img networkNode.img  # 查看虚拟机快照 [[email protected] ~]$ qemu-img snapshot -l networkNode.img  Snapshot list: ID    

KVM虚拟机快照

KVM默认的文件格式是raw,也就是使用文件来模拟实际的硬盘(当然也可以使用一块真实的硬盘或一个分区),不过raw格式只支持内存快照(就是启动的 时候加-snapshot,所有更改都写到内存),重启之后就没了. raw格式不支持磁盘快照,因此要使用qcow或qcow2文件格式. 1.kvm创建快照 创建快照有两个命令都能实现 a.snapshot-create # virsh snapshot-create rhel6.3 Domain snapshot 1420722577 created #

CentOS 6.9下KVM虚拟机快照创建、删除、恢复(转)

使用文件快照的方式实现文件备份,但单说快照(snapshot)的话,他是某一时间点(版本)你能看到的该时间点备份文件状态的全貌,通过文件的快照(全貌)你能恢复到特定时间点(版本)的文件状态. 创建虚拟机centos6的快照 virsh snapshot-create centos6 查看格式 qemu-img info /data/kvm/centos6.img 编辑centos6虚拟机的配置 比如转换格式 virsh edit centos6 创建快照要先转换为qcow2 格式 qemu-im

kvm虚拟机快照基本用法

virsh snapshot-create 虚拟机名称 ##创建快照 virsh snapshot-list 虚拟机名称 ##查看快照 virsh snapshot-revert 虚拟机名称 快照名 ##利用快照恢复数据 [[email protected] ~]# clone-vm7.4 请输入虚拟机号码:100正在创建镜像........[ok]正在创建虚拟机.......[ok][[email protected] ~]# virsh start host100 ##开虚拟机域 host1

kvm虚拟机克隆&amp;&amp;快照

KVM虚拟机克隆: 克隆前先关机,创建好分区. 语法: virt-clone -o 原虚拟机 -n 新虚拟机 -f 存储路径   (.img镜像后缀) 例如:virt-clone -o cetos7 -n centos7-1 -f /var/lib/libvirt/images/centos7-1.img(默认路径) ll -h 一台KVM虚拟机组成:虚拟机配置文件和镜像.img组成. ls /etc/libvirt/qemu  (配置文件) KVM虚拟机快照: 作用:热备.灾难恢复. 注意:由