代码版本: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数据。
未完 -- 待续。