Xen动态迁移的命令为:
xl migrate 2 192.168.3.102
命令中的2表示待迁移的虚拟机的DomainID, 后面的为迁移目的地的IP地址。需要注意,Dom0作为一个特殊的虚拟机是不能被迁移的。
我看的源码版本为xen-4.8.0,虚拟机动态迁移的函数位于tools/libxl/目录下的xl_cmdimpl.c文件中。入后函数是main_migrate函数。
在main_migrate函数中,首先是一系列的初始化。获取domid,和host的值。然后给rune赋值,以以上的迁移命令为例。则rune初始赋值为:
exec ssh 192.168.3.102 xl -t migrate-receive
然后main_migrate调用migrate_domain函数。参数主要有domid,rune,debug(0),config_filename。后面两个参数的值,我们不需要太多关心。debug应该是是否调试,一般为0。没有特别的参数config_filename的值一般为NULL。
在migrate_domain中,首先调用save_domain_core_begin函数读取待迁移虚拟机的config,然后转换格式存储到变量config_data_r中,传输到了函数外。
接着,调用create_migration_child函数。首先,创建了send和recv两组管道。然后创建一个子进程,。该子进程通过ssh连接到接收端负责接受VM,父进程返回。并且,子进程从send管道中读取数据,并且向recv管道中写入数据。而父进程向send管道中写入数据,并从recv管道中读取数据。子进程连接到接收端以后,继续执行xl -t migrate-receive,对应的函数是main_migrate_reveive。前面是一些参数的处理,可以不管。关键就是最后调用的migrate_receive函数。
在migrate_receive函数中,首先调用了
CHK_ERRNOVAL(libxl_write_exactly(
ctx, send_fd,
migrate_receiver_banner,
sizeof(migrate_receiver_banner)-1,
"migration ack stream", "banner") );
这个函数忘发送端传送了一串字符串,即migrate_receiver_banner,该字符串定义在文件开头。而发送端,在成功创建了子进程以后,父进程发挥继续执行migrate_do_preamble函数。发送端调用migrate_read_fixedmessage函数接收“虚拟机接受端”发出的信息,并且验证是否正确。如果正确,则调用save_domain_core_writeconfig函数。该函数将config_data_r的配置文件信息传送到接收端。然后接收端开始初始化dom_info, 在create_domain中接收config信息
未完待续.
-----------------------------
经过几天的实验与阅读,发现这部分代码并没有实现动态迁移的特性,现在的做法类似与save和restore。将虚拟机直接挂起,然后在目的端重新创建虚拟机,并且重新打开正在运行的程序。