基于虚拟化技术的实时保存客户机中进程状态的方法与流程

文档序号:11216030阅读:455来源:国知局
基于虚拟化技术的实时保存客户机中进程状态的方法与流程

本发明属于虚拟化技术领域,涉及基于虚拟化技术的实时保存客户机中进程状态的方法,尤其涉及一种基于虚拟化技术的不需修改客户机内核的、对客户机透明的进程状态保存方法。



背景技术:

虚拟化技术最主要的作用是解决物理资源的使用效率,虚拟机监控器替代操作系统内核所在层次,对底层物理资源进行抽象。硬件经过虚拟化层的分配和管理被上层所有虚拟机所共享,上层的虚拟机由虚拟化层创建、调度和分配资源。处于虚拟化层之上的虚拟机相互隔离,需要相互访问或通信时需要由虚拟化层进行控制和管理。虚拟化技术从诞生至今,已衍生出多种相关技术与应用。虚拟化技术由于其自身隔离、访问和干预等特性,被广泛应用在在安全防护领域。这些特征使基于虚拟化架构的安全工具能够有效监控虚拟机内部状态,同时抵御受监控系统内部的攻击。总体来说,利用虚拟化技术将恶意程序监控系统放在独立的虚拟化环境中,负责对虚拟机的监控,可以做到有效抵御恶意程序的隐藏与攻击手段,并且易于升级和维护。

对于虚拟化平台上的客户机来说,虚拟机状态的备份是一项重要需求,尤其是当虚拟机内部或所处平台遭遇攻击时,为保证虚拟机快速恢复到应有状态,需要在受到攻击的某一个或多个时刻进行状态备份,以便之后的快速达到正常运行状态。对虚拟机状态的备份存在多种对象,如虚拟磁盘、进程上下文、cpu等。常见的虚拟机备份通过快照、克隆等方式进行,备份后的存储主要是将目标数据复制到存储设备上。通常需要暂停虚拟机的运行,将内存作为文件进行备份,或通过动态迁移的方法实现内存备份。

虚拟机的实时备份是解决备份检查点与虚拟机当前运行状态不一致问题的方法之一,为做到实时备份,需要将虚拟机数据的任何变化实时传输到备份服务器上,但是数据的传输总是存在延迟,这是实时备份的主要问题。cully等人提出的remus(cullyb,lefebvreg,meyerd,etal.remus:highavailabilityviaasynchronousvirtualmachinereplication[c]//usenixsymposiumonnetworkedsystemsdesignandimplementation.usenixassociation,2008:161-174.)是基于xen的虚拟机实时备份解决方案,它在文件级别对虚拟机进行完整复制,每次复制只针对标记为脏的页面进行,这保证了备份的高效性,使虚拟机状态和备份文件保持一致。备份检查点通过高频率的检查虚拟机状态来确定,当捕捉到执行状态的改变时则对cpu、内存以及硬盘进行增量备份。parallax(warfielda,rossr,fraserk,etal.parallax:managingstorageforamillionmachines[c]//hotos'05:,workshoponhottopicsinoperatingsystems,june12-15,2005,santafe,newmexico,usa.dblp,2005:4-4.)是一个基于xen的多虚拟机管理系统,它主要用于解决百万级别数量的虚拟机存储问题,其重要思想是把所有存储资源进行统一编址,并为虚拟机建立虚拟磁盘镜像vdi,每一个vdi对应一个根节点,其子节点是为其分配的空间。在制作快照时将快照指向当前的vdi根节点,并把其所有子节点设为只读。

基于日志记录的方式进行的备份主要用于系统受到攻击后的重放,具有代表性的研究成果有revirt系统(dunlapgw,kingst,cinars,etal.revirt:enablingintrusionanalysisthroughvirtual-machineloggingandreplay[j].acmsigopsoperatingsystemsreview,2002,36(si):211-224.),它在vmm上对系统进行日志记录,记录事件包括异步中断、外部输入等,被应用在入侵检测方面,它可以在系统已被恶意程序篡改的情况下,重放受到攻击的执行过程,为入侵检测分析提供信息。revirt需要对客户机操作系统内核进行修改,对客户机不透明。

以上研究成果是关于虚拟机级别的备份,进程方面以迁移技术的研究为主。迁移是在被监控的虚拟机节点崩溃时,重新配置并转交到另一个节点上运行,迁移常常以进程为单位。迁移的目标是保存进程的运行状态,使其在另一个节点能够继续运行,这点与进程备份存在共性。进程迁移需要保存的状态包括进程地址空间、寄存器上下文、通信状态以及其他与内核的进程管理相关的信息。mosix(baraka,la'adano.themosixmulticomputeroperatingsystemforhighperformanceclustercomputing[j].futuregenerationcomputersystems,1998,13(4-5):361-372.)是通过修改操作系统内核实现的进程迁移系统,prm(songg,thomass,amatonm.ageneralframeworkforprmmotionplanning[c]//ieeeinternationalconferenceonroboticsandautomation,2003.proceedings.icra.ieee,2003:4445-4450vol.3.)基于用户层实现。这些方法均属于全拷贝型,在目标节点上恢复进程存在较大的延迟性。

在以上的方案中,以进程为单位的研究以迁移为主,而备份以整个虚拟机状态为主。如果需要为特定进程进行备份而直接备份整个虚拟机,则会带来较大的空间开销。且已有的进程迁移技术存在一定延迟性,在进程状态一致方面有所欠缺。



技术实现要素:

针对上述问题,本发明提供一种基于虚拟化技术的实时保存客户机中进程状态的方法。在某个特定时刻客户机中进程上下文状态需要被保存时,将以进程实体形式进行备份,并在之后某时刻需要恢复进程上下文时,能够直接运行该进程而不需要额外的内存恢复工作。

本发明采用的技术方案如下:

一种基于虚拟化技术的实时保存客户机中进程状态的方法,其步骤包括:

1)将客户机中特定进程的pid(processidentification,进程标识符)通知给虚拟化监控层(virtualmachinemonitor,vmm);

2)在vmm中监控进程调度,当特定进程被调度时客户机主动陷入vmm,vmm在客户机内存中的特定位置注入代码;

3)客户机恢复执行后,执行注入的代码以完成进程状态的备份;

4)通过注入的代码实现客户机的主动陷入,根据陷入的进程改变客户机当前进程的控制流;

5)在需要恢复进程上下文时对代码注入的位置进行恢复,同时唤醒备份的进程状态。

下面将分为4个部分对以上步骤的具体内容进行详细描述。

1.当vmm收到客户机中特定进程的pid后,根据pid获得进程的task_struct结构,进而获取页目录表地址,即cr3寄存器的值。然后开启对cr3寄存器写操作的监控,当cr3寄存器被写入指定进程的页目录表地址时,则开始对客户机内存中特定位置注入代码。

2.注入的代码实现的功能包括注入特定系统调用和实现客户机的主动陷入。linux系统对传统的系统调用使用0x80号中断实现,新版本虽然存在sysenter/syscall指令的快速系统调用指令,但仍然对int80指令兼容,因此本方法选择int80指令实现系统调用的注入。客户机陷入的原因有多种,如客户机执行特权指令,客户机访问物理资源等,如果选择常规的陷入原因则容易出现多次无效陷入的情况。客户机陷入原因可由vmm进行控制,一部分陷入原因在vmm中默认为不开启陷入。本方法选择vmm默认不开启的陷入原因,且客户机自身不会频繁出现此陷入原因的方式实现主动陷入,这里选择int3指令实现。

3.注入代码的位置选择在用户态代码段中,客户机恢复执行权后将执行注入的代码,并完成进程状态的备份。产生的备份进程需要被特殊处理,由于备份进程也是可以被调度的进程,为防止备份进程丢失上下文状态,需要改变对备份进程的调度,本方法采用陷入vmm后注入特定系统调用的方式实现对该进程调度情况的改变。

4.进程的上下文需要被恢复时,则再次改变备份进程的调度情况,让该进程能被正常调度。同时对内存中注入代码的位置进行恢复。

本发明的有益效果是:

当客户机中进程上下文状态需要被保存时,客户机不需要协助vmm做状态保存工作,即客户机中进程运行状态不会受到影响;在之后某时刻需要恢复进程上下文时,能够直接运行该进程而不需要额外的内存恢复工作。在整个过程中,客户机将不会察觉到控制流的改变,且不需要对客户机内核代码进行修改以及安装内核模块。

附图说明

图1为本发明进程状态保存处理流程图。

图2为本发明进程状态恢复处理流程图。

具体实施方式

下面结合实施例和附图对本发明进行进一步详细描述。可以理解的是,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

实施例一:

为了对特定进程进行状态备份,为进程注入一个fork系统调用,当客户机恢复执行时将会执行此系统调用自动创建出一个子进程,这里将此子进程作为备份进程,而父进程正常执行。父进程调用fork创建出的子进程后,还需要调用wait函数等待子进程状态变化,wait函数会使父进程阻塞,当子进程运行结束时,wait函数返回,父进程接收到子进程运行结束的信号后为子进程回收资源。如果父进程没有调用wait函数等待子进程运行状态变化,则子进程运行结束后资源不会被回收而成为僵尸进程。然而,如果父进程先于子进程运行结束,则一号进程,即init进程会成为子进程的父进程,并在子进程运行结束时为其回收资源。本系统采用fork系统调用进行进程备份,后续父进程一定会先于其创建的备份进程结束运行,因此备份进程不会变为僵尸进程,其资源可以被正确回收。

为改变客户机接下来的执行流程,需要修改进程代码段的4个字节。首先获取客户机陷入时的eip寄存器值,即将要执行的下一条指令的线性地址。然后修改此处开始的四个字节内存,将其改为int3,int80,int3,其中int3指令的机器码为cc,int80的机器码为cd80,三条指令刚好占用四个字节,修改后的四字节内容为cccd80cc。其中,int80指令用来产生fork系统调用,int3指令用来产生客户机到vmm的主动陷入,这里需要客户机的主动陷入原因是修改过的代码需要被恢复回来。由于之后还需要恢复这段代码原本的内容,因此修改之前要注意保存该位置原来的内容以便后续的恢复工作。

之所以要注入两个int3中断使客户机主动产生两次陷入,是因为修改的是内存全局的代码,其他无关进程也可能共享这一页并执行这段被修改的代码,如果让他们都去执行这段代码会增加复杂性。代码修改处被恢复的时间点是备份进程被释放的时刻,如果仅注入一个int3中断,而在这之前,无关进程只要执行到这里,都会先去执行int80然后由于int3而主动陷入,如果在此时再去恢复该无关进程的上下文,将面临eax寄存器的值已经丢失而无法恢复的问题。因此在int80执行之前,多注入一个int3使其在系统调用执行之前就主动陷入,这样可以让vmm根据陷入情况进行判断而做出正确的处理。陷入vmm后的处理见图1,如该图所示,如果从第一个int3陷入,无论该进程是无关进程还是受控进程,均需要模拟被修改的位置原来的代码执行效果;如果从第二个int3陷入,则判断该进程为受控进程还是备份产生的子进程,若是受控进程则记录函数调用返回产生的子进程pid,若是子进程则根据是否需要释放该进程进行具体处理。

实施例二:

为实现进程状态备份,创建出的进程应该暂停在此状态,而不应该被调度执行。处理过程如图2所示。为使进程不被调度,这里采用注入sched_yield系统调用让该进程睡眠。注入方法同fork,即修改eax寄存器为sched_yield系统调用号,并修改eip寄存器使其指向int80指令地址。如果检测到备份进程被调度,则注入sched_yield,直到需要恢复进程。

如果vmm接收到进程状态恢复信号,则当发生备份进程陷入时,就需要恢复其运行,此时不需要继续注入sched_yield系统调用,而是要将修改的代码内容进行恢复。然而,此时处于睡眠状态的进程不止这一个,还可能存在其他需要被恢复的备份进程。如果在第一个备份进程陷入时判断需要被恢复就马上恢复原来的代码内容,则其他备份进程执行到此处时,就会由于上下文出现错误而不能继续运行。因此,当第一个备份进程陷入时,不能马上恢复原来的代码内容,而是先要为其模拟原来的代码执行效果,将相应寄存器、特定内存改变为代码执行后的内容,同时不再注入sched_yield系统调用。这个备份进程后续将不会由于第二个int3而发生陷入。当所有需要恢复的进程都被唤醒,即最后一个备份进程在第二个int3陷入时,再恢复原来的代码。代码恢复之后,将不会再有任何进程因为int3发生陷入。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1