在云计算中,热迁移是一项比较重要的feature。它的应用场景比较多也比较重要,比如负载均衡。在qemu中,热迁移(live migration)只是其多种迁移(migration)功能的一项。经过一个月的有关migration的调试,也算对migration有了一个大体上的了解。
在我初次接触虚拟机迁移时发现网上的资料多事热迁移相关的,足见其在所有迁移方式中是最为重要的,但是我所调试的并非热迁移,所以颇费了一番周折才搞清楚,记下来给有需要的人看。
在qemu的manu里我们可以看到所有起支持的migration种类,因为migration一般是与-incoming选项一起配合使用,因此搜索incoming可以看到:
-incoming tcp:[host]:port[,to=maxport][,ipv4][,ipv6]
-incoming rdma:host:port[,ipv4][,ipv6]
Prepare for incoming migration, listen on a given tcp port.
-incoming unix:socketpath
Prepare for incoming migration, listen on a given unix socket.
-incoming fd:fd
Accept incoming migration from a given filedescriptor.
-incoming exec:cmdline
Accept incoming migration as an output from specified external command.
-incoming defer
Wait for the URI to be specified via migrate_incoming. The monitor can be used to change settings (such as migration parameters)
prior to issuing the migrate_incoming to allow the migration to begin.
tcp那一项就是热迁移所使用的,是通过网络实现迁移的,我所调试的是exec那一项,是在同一个host上的迁移,其他的没有接触,等了解了在说。由于热迁移的资料较多,下面主要谈谈有关exec迁移。
使用qemu进行虚拟机的迁移主要可以分成两个部分:第一是起源虚拟机,第二是起目的虚拟机。使用不同的方式具体操作是不一样的,但是绕不开源和目的虚机。使用exec方式主要的应用是保存一个模板虚机之后启动的虚拟机可以从这个模板中克隆,从而加快启动速度。很像快照。具体示例如下:
制作虚拟机模板:
mkdir /tmp/template; 创建template文件
将template挂载为tmpfs,这样就可以用来存放memory文件。
mount -o tmpfs -size 2G /tmp/template
qemu-kvm \
.... \
-object memory-backend-file,id=dimm1,size=1G,mem-path=/tmp/template/memory,share=on \
-monitor unix:qemu-monitor-socket,server,nowait \
上面的qemu命令行添加了一个memory后端文件,用来保存虚机的memory。出来memory里面的信息,虚机里面的设备信息也要保存,这就需要虚机的devicestate信息保存下来,这就需要迁移功能。这个功能不是在起虚拟机的时候用的,而是需要从虚拟机的监控端注入,这就需要qemu的monitor或qmp。这里我们使用monitor演示。上面的命令行中我们添加了monitor项,这就会在本地产生一个跟monitor通信的socket文件。
使用命令:socat - unix-connect:qemu-monitor-socket进入monitor。
在monitor中使用命令:migrate exec:cat>/tmp/template/state
等一会命令结束在对应目录下来就会生成state文件了,使用q命令退出虚拟机。可以在/tmp/template/下看到两个文件memory和state,这就是虚拟机的模板了。
clone虚拟机模板:
如何恢复模板开启新的虚拟机。这就只需要在qemu的命令行中用“-incoming”命令
qemu-kvm \
... \
-object memory-backend-file,id=dimm1,size=2048M,mem-path=/run/vc/vm/template/memory,share=on \
-incoming exec:cat /tmp/template/state
因为虚拟机可以直接从模板虚拟机的保存点启动,迁移的速度一般是快于虚拟机直接启动的速度的,所以会加快新虚拟机的启动速度。
有一点是要非常注意的,那就是模板虚拟机和clone虚拟机的启动的命令行要基本一致,否则clone就会失败。如果实验的时候失败,就要好好检查一下是不是命令行不一致导致的。