Block Copy指的是虚拟机存储迁移。迁移时,采用Snapshot+Block stream完成存储迁移。首先通过对虚拟机进行在线外部快照,然后通过BlockStream技术合并快照,完成存储热迁移。BlockStream可以将backing file合并至active
示例:
qemu 运行虚拟机
qemu-system-x86_64 -m 1024 1.img
ctrl+alt+2切换到qemu命令行下
使用info block 查看块设备信息
块设备为 ide-hd0 使用的镜像是1.img
创建一个外置快照
再使用info block 查看块设备,此时ide0-hd0 使用的文件已经是刚才创建的快照文件了,下面还有一行注意,backing file 1.img说明 这个快照文件是依赖原来的镜像文件的
接下来使用 block_stream 命令把backing file 合并到快照中
此时马上使用info block查看可以看到快照还是依赖原来的镜像文件,稍等一会再使用info block查看,此时快照已经不再依赖原来的镜像文件了
此时存储迁移已经完成
迁移后的镜像格式只能为qcow2,源文件格式可以为qcow2和raw
已测试从本地文件系统迁到本地文件系统,本地文件系统和nfs之间相互迁
xml格式
测试代码
python
import libvirt
conn=libvirt.open("qemu:///system")
p = conn.lookupByName()
flags=libvirt.VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY
p.blockJobAbort("/var/lib/oe-instances-disk/7733b525-62d4-44b9-bf06-a2fe361d8f63",0)
xml="
<domainsnapshot> \
<name>snap1</name> \
<description>snap1-desc</description> \
<disks> \
<disk name='hdb' snapshot='external'> \
<source file='/root/1359.img'/> \
</disk> \
</disks> \
</domainsnapshot> "
p.snapshotCreateXML(xml, flags)
p.blockPull("hdb", 0, 0)
p.blockJobInfo("hdb", 0)
//获取进度信息,输出
p.blockJobInfo("hdb", 0)
{'end': 21474836480L, 'bandwidth': 0L, 'type': 1, 'cur': 7534346240L}
>>> p.blockJobInfo("hdb", 0)
{'end': 21474836480L, 'bandwidth': 0L, 'type': 1, 'cur': 7556366336L}
>>> p.blockJobInfo("hdb", 0)
{'end': 21474836480L, 'bandwidth': 0L, 'type': 1, 'cur': 7577337856L}
>>> p.blockJobInfo("hdb", 0)
{'end': 21474836480L, 'bandwidth': 0L, 'type': 1, 'cur': 12414615552L}
>>> p.blockJobInfo("hdb", 0)
{}