我们常常遇到需要迁移虚拟机的问题,比如需要维护某台设备,会将设备上的一切应用迁移到另一台设备。但是如何将虚拟机进行迁移呢?好比说,虚拟机中正在运行一个程序,这个程序有源源不断的数据访问,怎么使得在不影响这些访问的情况下把虚拟机迁移到领一台服务器上呢?
尤其是当远程迁移的时候,怎么在虚拟机不崩溃的情况下迁移走所有的状态?
快照技术
snapshot(快照)就是将虚拟机的各种状态全部记录下来,存进硬盘里,等待下一次开启虚拟机的时候读取,这些状态包括:
- vCPU 状态(寄存器等)
- I/O设备状态
- 虚拟磁盘状态(利用写时拷贝技术)
- 所有的内存状态(实现最困难)
内存迁移
内存是最难处理的,因为它一直在变化。内存实时读写,导致我们没有办法截取某一时刻对内存进行拷贝。这就形成了两种处理方法:
pre-copy
- 将当前时刻所有的内存状态复制并发送到远程服务器,先不管实时更新的内存状态;
- 将新时刻的已改变的内存复制并发送到远程服务器:
(1).VMM会对所有的页进行写保护,当有数据改变时,标记该页为“赃页”;
(2).VMM将所有“赃页”拷贝进缓冲区,将缓冲区通过网络发送到远程服务器;
(3). 由于相关联的内存的局部性,赃页的数目很小,先设为 D t ( M ) D_{t(M)} D