Chinaunix首页 | 论坛 | 博客
  • 博客访问: 127084
  • 博文数量: 25
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 251
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-29 14:18
个人简介

不以物喜,勿以己悲;乐观向上,持之以恒。

文章分类

全部博文(25)

文章存档

2015年(25)

我的朋友

分类: 云计算

2015-08-21 15:26:59


代码版本:
qemu-kvm-1.5.3

目标:
迁移本地虚拟机

背景说明:
1. 虚拟机系统盘disk0为本地qcow2文件
2. 虚拟机数据盘disk1为本地raw文件或者lvm设备

发起端运行虚拟机:
/usr/libexec/qemu-kvm -name vt01 -drive file=disk0,if=none,id=drive-virtio-disk0,format=qcow2,cache=none -drive file=disk1,if=none,id=drive-virtio-disk1,format=raw,cache=none 

接收端运行虚拟机:
/usr/libexec/qemu-kvm -name vt01 -drive file=disk0,if=none,id=drive-virtio-disk0,format=qcow2,cache=none -drive file=disk1,if=none,id=drive-virtio-disk1,format=raw,cache=none -incoming tcp:[::]:49152 
注:-incoming tcp:[::]:49152 创建了一个TCP连接,监听0.0.0.0:49152。
      整条命令主要是创建TCP连接,准备接受源端虚拟机的数据传入,在数据迁移完成之前,虚拟机状态为paused,迁移完成后变成running,而源端则变成shut off。
 
Libvirt触发的命令:
调用了以下命令用于内存、数据、状态迁移:
1. qmp_drive_mirror命令,用于迁移数据盘数据,有几个磁盘要迁移,就调用几次此函数。
2. qmp_migrate命令,用于迁移内存数据。
其中qmp_drive_mirror命令libvirt代码中调用方式如下:
cmd = qemuMonitorJSONMakeCommand("drive-mirror",
         "s:device", device,
         "s:target", file,
         "U:speed", speed,
         "s:sync", shallow ? "top" : "full",
         "s:mode",
         reuse ? "existing" : "absolute-paths",
         format ? "s:format" : NULL, format,
         NULL);
相当于命令virsh qemu-monitor-command --hmp vt1 'drive-mirror device target'

libvirt中上述命令中参数中带冒号的部分介绍如下:
s:string,i:int,u:unsigned int,I:long long,U:long long,d:double,b:boolean

 
qmp_drive_mirror命令支持参数[-n] [-f] device target [format]
-n flag requests QEMU to reuse the image found in new-image-file, instead of recreating it from scratch.
-f flag requests QEMU to copy the whole disk, so that the result does not need a backing file.

查找libvirtd 得到的进程号pid:ps aux |grep libvirtd 
通过gdb /usr/sbin/libvirtd pid 增加断点break qemuMonitorJSONDriveMirror可获取到:
device信息如:drive-virtio-disk1 (迁移数据盘disk1)
target file信息如:nbd:dest_compute_hostname:49153:exportname=drive-virtio-disk1
因为flags=3,所以shallow=1,reuse=1,即sync=“top”,reuse=“existing”;format=0
 
其中qmp_migrate命令libvirt代码中调用方式如下:
cmd = qemuMonitorJSONMakeCommand("migrate",
         "b:detach", flags & QEMU_MONITOR_MIGRATE_BACKGROUND ? 1 : 0,
         "b:blk", flags & QEMU_MONITOR_MIGRATE_NON_SHARED_DISK ? 1 : 0,
         "b:inc", flags & QEMU_MONITOR_MIGRATE_NON_SHARED_INC ? 1 : 0,
         "s:uri", uri,
         NULL);
相当于命令virsh qemu-monitor-command --hmp vt1 'migrate -d uri'
 
qmp_migrate命令支持参数[-d] [-b] [-i] uri
-d|detach  not wait for completion
-b|blk  for migration without shared storage with full copy of disk
-i|inc  for migration without shared storage with incremental copy of disk(base image shared between src and destination)
 
通过gdb /usr/sbin/libvirtd pid 增加断点break qemuMonitorJSONMigrate可获取到:
几个参数信息如:flags=1,所以detach=1,blk=0,inc=0;uri="fd:migrate"
因为使用drive-mirror迁移数据盘,所以不需要再设置b:blk或者b:inc来迁移disk数据。

未完 -- 待续。
阅读(5992) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~