基于Passthrough I/O的虚拟机动态迁移方法
技术领域
本发明属于虚拟机迁移领域,尤其涉及一种基于Passthrough I/O的虚拟机动态迁移方法。
背景技术
虚拟机迁移对于降低能耗开销和管理硬件来说是一个有效的手段,例如VMWare VMotion、Xen、KVM live migration等。当硬件需要维护时,正在运行的服务需要被迁移到其他的硬件平台运行,并且这一过程不能扰乱客户端的访问。这要求在源主机运行的虚拟机中的服务在快速迁移到目的主机上后可以准确无误的连接到一个相应的设备上去,以保证服务的正确性并且虚拟机的迁移时间最短。
随着虚拟化技术的不断发展,CPU虚拟化与内存虚拟化逐渐成熟,I/O性能成为限制虚拟机整体性能的瓶颈。I/O性能成为瓶颈是由于I/O数据流和控制流的传递造成了虚拟机和虚拟机监视器之间频繁的切换。因此,一些组织和供应商(VMWare等)提出了Passthrough I/O(直接设备访问模型)。
如图1所示,左边是Passthrough I/O的网卡访问过程,右边是虚拟I/O的网卡访问过程。Passthrough I/O是指在每个Guest(本发明中是对客户域虚拟机的简称)虚拟机内部能够直接对硬件进行操作。PassthroughI/O将设备独占式的分配给指定的Guest虚拟机,使该虚拟机具有最高的I/O访问性能,这样做的优点是:由于不需要模拟设备进行请求转换,所以访问速度高;虚拟机能根据最新硬件加载对应驱动,可充分发挥新硬件的功能。Passthrough I/O需要特殊的硬件支持(如Intel的VT-d等)以隔离和保护硬件资源给指定的虚拟机使用。
虽然Passthrough I/O的性能接近于真实的设备性能,但它是禁止迁移的,因为对于虚拟机监视器来说,设备的状态是不可知的,即一个真实设备驱动运行在Guest虚拟机中管理设备状态,而这个状态虚拟机监视器是无法获得的。并且目的主机可能拥有一个不同于源主机的Passthrough I/O设备或者它只使用虚拟I/O,由于虚拟机监视器不能访问驱动或者设备的状态,所以它不能正确的重新配置Guest虚拟机去访问一个在目的主机上不同的设备。
目前存在的关于Passthrough I/O迁移的解决方法是:借助于LinuxPCI热插拔接口,在迁移之前移除驱动并且在迁移之后重启它。这个方法通过在一个虚拟网络上利用Linux bonging驱动维护了客户端的连通性。但是这种方法只适用于网络设备(因为bonding驱动只支持网络驱动)并且依赖于额外的客户端连通性网络接口。Intel对于Passthrough I/O设备的迁移提供额外的硬件支持,但是这种方式使得迁移要依赖于特定的硬件设备并且需要修改Guest虚拟机的设备驱动去支持迁移。
发明内容
基于上述原因,本发明旨在不需要任何额外的客户端访问接口并且适合于任何种类的设备的情况下完成Passthrough I/O设备的迁移,同时不需要修改Guest虚拟机的设备驱动的源代码。
本发明的目的是提供一种支持Passthrough I/O设备进行动态迁移的处理机制,使得Guest虚拟机在保持网络连通性的情况下,缩短迁移的时间,并对用户体验不造成影响。
本发明的目的是避开对Guest虚拟机设备驱动源代码的修改,同时不需要额外的客户端接口,而是通过在Guest虚拟机中增加第三方驱动,并对虚拟机监视器进行适当修改的方式来实现Passthrough I/O设备的迁移,保证***的稳定运行。
本发明的目的是支持包括网络设备在内的多种Passthrough I/O设备之间进行迁移,支持在同种类不同型号的Passthrough I/O设备之间进行迁移,同时也支持在Passthrough I/O设备与虚拟设备之间进行迁移。
本发明采用的技术手段是:本发明以Passthrough I/O机制为基础,通过在Guest虚拟机中的Linux内核和设备驱动程序之间设计一个第三方驱动程序——影驱动来保证迁移可以正确快速的完成,这里的影驱动相当于一个内核代理——通过拦截***和驱动之间的函数调用来管理和存储驱动的状态。其实现的方法包括以下步骤:
1.修改虚拟机监视器,使得其允许使用Passthrough I/O设备的Guest虚拟机进行迁移,同时保证迁移后虚拟机监视器能够自动的连接Passthrough I/O设备。
2.迁移过程中,影驱动要能够持续的捕获驱动的状态,并记录捕获的第一个驱动状态及所有改变驱动状态的操作,直到源主机上的Guest虚拟机被暂停为止;源主机上的虚拟机与目的主机上的虚拟机进行状态同步(包括CPU寄存器和内存状态及磁盘状态),当两端的虚拟机状态完全相同时,暂停源主机上的虚拟机,恢复目的主机上的虚拟机运行。这时,虚拟机会通知影驱动已经迁移到目的主机。影驱动接到通知后,进行后续操作。
3.在迁移到目的主机后,影驱动代理设备驱动,在一个新驱动启动以前,它接收从内核发来的请求;同时影驱动卸载旧的驱动并初始化一个新的驱动,并将新驱动的状态设置为影驱动所记录的驱动状态,之后新驱动依次执行影驱动中记录的行为操作,直到影驱动中没有新的记录为止。
4.最后,当影驱动中所有的记录都被执行过后,影驱动停止工作,新驱动与内核之间直接通信。
本发明这样设计影驱动的好处是:第一,影驱动是在迁移后作为一个驱动的代理并配置新的驱动,确保将新驱动配置到迁移前的状态并确保了网络的连通性。第二,影驱动可以降低迁移的时间,因为我们不需要在迁移前卸载驱动,而是迁移后在目的主机做这个工作。
本发明的有益技术效果在于:现有的针对Passthrough I/O设备迁移的解决方案或者只支持特定的设备(例如只支持网络设备),或者需要修改Guest虚拟机中的设备驱动,它们都具有很大的局限性。而本发明适用于所有的Passthrough I/O设备,同时不需要对Guest虚拟机的设备驱动进行修改,并且本发明还适用于在同种类不同型号的Passthrough I/O设备之间进行迁移(例如源主机与目的主机上的网卡是由不同的厂商生产的)。本发明通过在虚拟机中的***内核和设备驱动之间添加影驱动,实现对数据流的监控与记录,并能够及时的卸载旧的驱动及加载新的驱动,在整个迁移的过程中始终保持网络的连通性。本发明在没有进行迁移的时候,不影响Guest虚拟机的正常运行。
附图说明
图1为Passthrough I/O和虚拟I/O的网卡访问过程图;
图2为本发明Passthrough I/O网卡设备的整个迁移过程图。
具体实施方式
为了使本发明的目的、技术方案及有益效果更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明以Passthrough I/O机制为基础,通过在Linux内核和设备驱动程序之间设计一个第三方驱动程序——影驱动,来保证迁移可以正确快速的完成。
下面结合附图2,通过对Passthrough I/O网卡设备的整个迁移过程的分析来对本发明作进一步的说明,但本发明不局限于下面的事例。
图2显示了在迁移的前、中、后三个阶段中影驱动发挥的作用,这里的影驱动相当于一个内核代理——通过拦截***和驱动之间的函数调用来管理和存储驱动的状态。为了在迁移中提供透明的恢复,影驱动需要具备两个决定性的特征。第一,影驱动持续的捕获驱动的状态并记录捕获的第一个驱动状态及所有改变驱动状态的操作,迁移后,影驱动初始化一个新的驱动并能够根据记录的驱动状态设置新驱动。第二,影驱动能够清理和卸载一个驱动,而不需要执行任何驱动代码。因此,对于没有热插拔支持的驱动,影驱动可以在Guest虚拟机中主动的卸载驱动,从而避免产生由于设备不存在而产生的故障。对于在没有进行迁移时的正常驱动操作,影驱动并不会在检查点对其进行拦截,因此它并不影响Guest虚拟机的正常运行。其实现方法包括以下步骤:
1.修改虚拟机监视器,使得其允许使用Passthrough I/O设备的Guest虚拟机进行迁移,同时保证迁移后虚拟机监视器能够自动的连接Passthrough I/O设备。
2.在迁移过程中,对于驱动的正常操作,影驱动通过检查点拦截Passthrough I/O驱动和Guest内核之间所有的函数调用,以记录驱动在迁移开始时的状态及所有改变驱动状态的行为操作,例如已经被驱动发送但是还不被设备所知的网络报文等。影驱动持续捕获设备的状态直到源主机上的Guest虚拟机被暂停为止。虚拟机监视器在目的主机启动一个新的虚拟机,并对源主机和目的主机上的虚拟机进行状态同步;当两端的虚拟机状态完全相同时,暂停源主机上的虚拟机,恢复目的主机上的虚拟机运行。这时,虚拟机会通知影驱动进行迁移后的操作。
3.迁移完成后,影驱动主要完成两个功能。第一,它代理设备驱动, 在一个新驱动启动以前,它接收从内核发来的请求,这样确保Guest内核和应用软件不会意识到网络设备正在被替换。第二,影驱动卸载已存在的Passthrough I/O设备驱动并且为目的主机的网络启动一个新的Passthrough I/O驱动。影驱动卸载旧的驱动是由于设备突然不存在了,而旧的驱动本身并不知道,所以它不会对自己进行卸载。在启动新的驱动时,影驱动将新驱动的状态设置为影驱动所记录的驱动状态,之后新驱动依次执行影驱动中记录的行为操作(包括已经从驱动发出但是还未到达设备的网络报文等),直到影驱动中没有新的记录为止。另外,影驱动有责任确保本地交换机意识到虚拟机的MAC地址发生了改变。在新驱动的状态被配置完成后,影驱动会从目的主机的网络接口主动的发送一个arp报文,之后再发送已经从驱动发出的但是还没有经过设备发送出去的报文。
4.最后,当影驱动中所有的记录都被执行过后,影驱动停止工作,新驱动与内核之间直接通信,影驱动进入到没有迁移发生时的工作状态并允许Guest虚拟机正常运行。
影驱动支持在多种不同型号的Passthrough I/O设备之间进行迁移,前提是影驱动必须对目的主机上的Passthrough I/O设备是了解的,所以它才可以从源主机传送正确的设备状态。
当源主机设备与目的主机设备支持不同的特征时(例如是否进行校验和检查等),影驱动是这样设计的:如果特征在源主机设备上是不存在的,那么它在目的主机设备上也是禁用的;在相反的情况下,当一个存在的特征在目的主机丢失了,那么将会导致驱动恢复失败。在一个可控制的环境中这是罕见的,因为所有的设备都是预先知道的。
本发明适用于在Passthrough I/O设备和虚拟设备之间进行迁移,适 用于半虚拟化的同时,也支持全虚拟化。本发明提供的Passthrough I/O设备迁移的处理机制,使得Guest虚拟机在保持网络连通性的前提下,不增加额外的迁移时间,对用户体验不造成影响,并且不需要特殊的硬件支持,也没有使用额外的客户端接口。
本发明仅以网络Passthrough I/O设备的迁移过程为例进行说明,事实上所有的同种类但型号不同的Passthrough I/O设备的迁移都在本发明的解决范围之内。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所做的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。