虛拟機的遷移是指把一台VM上的OS遷移到另外一台VM,兩個VM可以run在不同的實體機上。
包括:Offline Migration和Live Migration。這裡講講比較常用的Live Migration(熱遷移)。
在熱遷移過程中,Guest OS完全無感,其運作的任務,在快速遷移過後能繼續運作。
首先,對于Guest OS從一個VM遷移到其他VM,涉及到對register配置,dirty cache,runtime context等資料的遷移。
如下圖Guest OS1從VM1到VM2遷移過程:先由qemu monitor發起live migration,PC1的QEMU程序執行precopy,對源Guest OS的register,dirty cache bitmap,runtime context進行備份,建立傳輸channel,包括RDMA, tcp socket(網絡),unix socket(程序間),exec stdin/stdout(程序間),fd(虛拟檔案)等類型。遷移過程中 dirty page bitmap由QEMU copy,send,recv,restore,SRC和DST的QEMU程序間負責互動。
- KVM ram live migration
qemu接收HMP CMD:hmp_migrate, 如下圖左上角的調用流程是基于tcp socket的migrate發送過程,建立migation_thread, 在SRC端發起precopy,層層調用到kvm KVG_GET_DIRTY_LOG,進入kernel mode之後,會調用vmx_flush_log_dirty,發生VM_ENTRY進入Guest OS mode,在Guest OS裡log sync相關cache dirty page,cpu state等,下一次VM_EXIT會把該dirty log拷貝到user space供qemu 程序進行migration。(這裡針對 intel VT-X技術)。
在intel cpu 中支援PML(Page Modification Logging )子產品用于記錄dirty page。
PML介紹
https://www.intel.com/content/www/us/en/processors/page-modification-logging-vmm-white-paper.htmlVMX dirty loging相關ops如下,位于linux/arch/x86/kvm/vmx/vmx.c
- Device ram live migration
這裡提下virtio-net & vhost的live migration中的rx log 遷移
首先,virtio & vhost是一種半虛拟化技術,分為f'ront-end, back-end,Guest OS 安裝front-end
driver virtio-net,Host OS 安裝back-end driver vhost-net。qemu維護通信channel vring。
如下:
+---------+------+--------+----------+--+
| +------+ +----------+ |
| user | | | | |
| space | | | guest | |
| | | | | |
| | qemu | | +-+------+ |
| | | | | virtio | |
| | | | | driver | |
| +------+ +-+---++---+ |
| | |
| | |
| v |
| |
+-+-----+---+-+----+------+----+--+-----+
| |tap | | vhost-net.ko| | kvm.ko |
| +---^-+ +------+----^-+ +----+---+
| |-------| kernel |-----------| |
+---------------------------------------+
- DIRTY LOG space MMAP & ioeventd init
QEMU的vhost初始化部分層層調用主要完成:使用者态log space映射到核心态;設定好VRING_KICK的eventfd,後續可用于QEMU和HOST OS的互相通知,eventfd好處是免除類似ioctl系統調用時使用者态和核心态的切換。通過ioctl VHOST_SET_LOG_BASE可配置kernel mode下的logbase,通過ioctl VHOST_SET_VRING_KICK可配置kick eventfd。(kick每次收發package 會發生)。
- rx dirty log記錄過程
在上面配置完EVENTFD之後,Guest OS安裝的virtio-net(virtio 前端),通過寫ioeventfd mem region(也就是預先配置好的memory區域用于ioeventfd映射),發起rx請求,在調用到kernel mode handle_rx_kick,這時候會發生記錄vhost_log_write并更新eventfd的region區域。
- dirty log MEMORY REGION标記
由QEMU HMP migration指令發起遷移,在precopy階段擷取到之前 mmap過的LOG_BASE開始的内容,标記為dirty-page,後續在遷移過程中會拷貝該page。