Skip to the content.

热插拔后,如何热迁移

  1. 迁移前已经热插入的设备

设备在 realize 时会把自己的 VMStateDescription 注册进迁移框架,因此启动时创建和后 来热插入的设备,在迁移层面没有本质区别:

热插拔的工作是 libvirt 的工作

两份源码都看完了。结论:目标端 QEMU 的命令行在”设备层面”会包含热插的设备(比如 热插的内存会以 -object memory-backend-* + -device pc-dimm 出现),但并不是和源 端逐字节一模一样。两边分工如下:

QEMU 侧:一致性不靠 QEMU 保证,靠管理层;不一致就拒绝迁移

目标端是一个全新进程,先按命令行把整台机器建好(qemu_init_board 完成后才进入 incoming,system/vl.c:2821-2848),收到迁移流后只做字符串匹配,不会从流里重建 任何设备:

所以:如果目标端命令行漏了热插的内存,迁移不是”静默丢状态”,而是直接失败(落在 ramblock 匹配上)。

libvirt 侧:目标端命令行由源端 live XML 重建,自动包含热插设备

和源端命令行的刻意差异

虽然由同一份 XML 构建,但目标端会:

• 多一个 -incoming defer; • monitor socket、pidfile、chardev/logfile 等运行时路径按目标端主机重新生成; • 内存后端文件路径按目标端 qemu.conf(hugetlbfs 挂载点、memory_backing_dir)重 算; • TLS creds、NBD server 等迁移相关对象不走命令行,启动后经 QMP 添加。

一句话总结:设备构成(含热插的 dimm)一致,但参数不是一模一样——QEMU 要求的是” 配置可匹配”(idstr/RAMBlock/地址对得上),逐字节相同从来不是要求,也不可能(两 端路径本就不同)。

测试效果

8G 热插 4G ,然后对 target 端启动的结果:

	-m size=8388608k,slots=255,maxmem=4194304000k
	-object memory-backend-ram,id=memdimm0,size=4294967296
	-device pc-dimm,node=0,memdev=memdimm0,id=dimm0,slot=0,addr=9663676416

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。