基于半虚拟化技术的设备故障复现方法及系统的制作方法

文档序号:6605495阅读:123来源:国知局
专利名称:基于半虚拟化技术的设备故障复现方法及系统的制作方法
技术领域
本发明涉及嵌入式领域,具体而言,涉及一种基于半虚拟化技术的设备故障复现 方法及系统。
背景技术
在产品的维护阶段,经常会遇到各种各样的故障与异常。目前,传统的故障定位方 法是根据客户描述来重构故障发生时的场景,以期望出现客户描述的现象。采用这种方法 一般只能复现一部分简单的故障,这种故障的解决周期一般也非常之短;而对于复现要求 极其苛刻的故障来说,采用这种方式一般无法复现,从而导致这类故障的解决时间较长,进 而延长了故障解决的平均周期。基于Xen提供的半虚拟化平台将对操作系统进行隔离和封装,在Xen虚拟机中,所 有的硬件都是通过软件模拟实现的。在Xen的半虚拟化模型下非特权域(即客户操作系统) 并不能直接操作物理硬件,所有对硬件设备的请求都是由特权域代与其完成的。在前后端 驱动之间,即特权域与非特权域之间的共享内存区和事件通道上可以截获所有外部中断的 中断号与数据,因此,也可以通过对共享内存区和事件通道的操作来达到模拟中断的效果。在相关技术中,基于Xen提供的半虚拟化平台提出了一种回放技术,该回放技术 的执行包括两个阶段记录和回放。其中,初始化记录阶段的目的是捕获被监控程序产生的 时间,并记录在下个阶段重新生成这些事件所需的全部数据。在随后的回放阶段,程序将根 据被捕获的记录运行。在相关技术中主要有两种方法重现系统的运行状态,一种是基于内容或数据驱动 的方法,另一种是基于顺序或控制驱动的方法。其中,前者基于这样的原理如果能够为正 在执行的机器指令提供正确的输入,则这条指令的输出则必然是正确的,因此,在系统运行 过程中,记录系统执行的每一条机器指令,从而达到重现系统运行状态的目的。而基于顺序 或控制驱动的方法,只需要记录少量来自外部事件(例如,I/O通道、程序文件或其他线程 对应用程序的输入),并保证这些输入在与原有执行相同的时间顺序被回放,从而获得一个 等价的执行效果。发明人发现,在上述第一种方法中,由于需要记录每条指令,从而会产生巨大的数 据量,占用大量的存储空间;而第二种方法中需要额外记录一些与指令执行序列相关的信 息,而且当需要回放到某个特定的状态时需要执行更多的指令,从而导致花费的时间相对 较长。

发明内容
本发明的主要目的在于提供一种基于半虚拟化技术的设备故障复现方法及系统, 以至少解决上述问题之一。根据本发明的一个方面,提供了一种基于半虚拟化技术的设备故障复现方法,包 括通过前端设备驱动与后端设备驱动之间的事件通道,虚拟机管理器获取并记录日志信息,其中,日志信息包括中断事件的类型、外部输入值及发生的时间点;响应于目标操作 系统用户输入的回放命令,虚拟机管理器依次按照记录的各个中断事件发生的时间点,根 据各个中断事件的类型及外部输入值,模拟产生对应于各个中断事件的虚拟中断,并通过 事件通道向目标操作系统发送虚中断消息,使目标操作系统执行对应该虚拟中断的处理操作。根据本发明的另一方面,提供了一种基于半虚拟化技术的设备故障复现系统,包 括日志记录子系统,用于通过前端设备驱动与后端设备驱动之间的事件通道,获取并记录 日志信息,其中,日志信息包括中断事件的类型、外部输入值及发生的时间点;日志回放 子系统,用于响应于目标操作系统用户输入的回放命令,依次按照记录的各个中断事件发 生的时间点,根据各个中断事件的类型及外部输入值,模拟产生对应于记录的各个中断事 件的虚拟中断,并通过事件通道向目标操作系统发送虚中断消息,使目标操作系统执行对 应该虚拟中断的处理操作。通过本发明,虚拟机管理器只记录不确定的中断事件及其发生的时间点来实现回 放,从而减少了记录的日志占用的存储空间,并且,通过记录中断事件发生的时间点,可以 提高回放的精确度,提高回放的效率,进而缩短故障排除的周期。


此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发 明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中图1为基于Xen的半虚拟化模型的结构示意图;图2为根据本发明实施例一的基于半虚拟化技术的设备故障复现系统的结构示 意图;图3为根据本发明实施例一的日志记录子系统10的结构示意图;图4为根据本发明实施例一的日志回放子系统20的结构示意图;图5为根据本发明实施例一的基于半虚拟化技术的设备故障复现方法的流程图;图6为根据本发明实施例二的基于半虚拟化技术的设备故障复现系统的示意图;图7为本发明实施例二中的日志记录子系统的体系结构图;图8为本发明实施例二中的日志回放子系统的体系结构图;图9为本发明实施例三中日志记录子系统命令接收线程的工作流程图;图10为本发明实施例三中日志记录子系统的日志传输线程的工作流程图;图11为本发明实施例三中在日志记录子系统开启的状态下,非特权域运行的流 程图;图12为本发明实施例三中日志回放子系统命令接收线程工作流程图;图13为本发明实施例三中日志回放子系统的日志传输线程的工作流程图;图14为本发明实施例三中日志回放子系统的中断模拟工作流程图;图15为本发明实施例三中在日志回放子系统运行过程中,非特权域的运行流程 图。
具体实施例方式下文中将参考附图并结合实施例来详细说明本发明。需要说明的是,在不冲突的 情况下,本申请中的实施例及实施例中的特征可以相互组合。图1为基于Xen的半虚拟化模型的结构示意图,在基于Xen的半虚拟化模型下,非 特权域(即客户操作系统,也可称为目标操作系统)并不能直接操作物理硬件,所有对硬件 设备的请求都是由特权域代其完成的。在前后端设备驱动之间,即特权域与非特权域之间 的共享内存区和事件通道上可以截获所有外部中断的中断信号与数据,也可以通过对共享 内存区和事件通道的操作来达到模拟中断的效果。实施例一图2为根据本发明实施例一的基于半虚拟化技术的设备故障复现系统的结构示 意图,该系统位于虚拟机管理器,主要包括日志记录子系统10和日志回放子系统20。其 中,日志记录子系统10,用于通过前端设备驱动与后端设备驱动之间的事件通道,获取并 记录日志信息,其中,该日志信息包括中断事件的类型、外部输入值及中断事件发生的时 间点,中断事件包括在接收到目标操作系统用户输入的记录开始命令和记录结束命令期 间发生的所有中断事件;日志回放子系统20,用于响应于目标操作系统用户输入的回放命 令,依次按照记录的各个中断事件发生的时间点,根据各个中断事件的类型及外部输入值, 模拟产生对应于记录的各个中断事件的虚拟中断,并通过事件通道向目标操作系统发送虚 中断消息,使目标操作系统执行对应该虚拟中断的处理操作,即回放。对于一段无外界输入的封闭代码,在同一机器上运行多次,每次的结果都是相同 的。因此,在本发明实施例中,日志记录子系统10只记录目标操作系统(即客户端操作系 统)运行过程中的不确定性事件(即中断事件)和其发生的时间点,便可构成回放所需要 的系统日志,从而可以减少占用的存储空间。由于相关技术中一是通过记录系统执行的每一条机器指令,另一种方式是只记录 外部事件发生的顺序而不记录事件发生的时间点,从而导致记录的日志占用的存储空间很 大或者回放的效率较低等问题,而本实施例中,日志记录子系统10在只记录不确定的中断 事件及中断事件发生的时间点,从而即可以减少记录的数据量又可以提高故障复现的精确 度和效率,进而可以缩短故障排除的周期。图3为根据本发明实施例一的日志记录子系统10的结构示意图,该日志记录子系 统10可以包括日志处理模块100、后端设备驱动模块102和日志记录模块104。其中,日 志处理模块100,用于响应于目标操作系统用户输入的记录初始化命令,在前端设备驱动与 后端设备驱动之间的共享内存区创建并初始化日志缓存区;后端设备驱动模块102,用于 截获中断事件发生时的中断信息,将与该中断事件的回放有关的数据信息发送至日志缓存 区,并触发日志记录模块104,其中,该数据信息包括中断事件的类型和外部输入值;日志 记录模块104,用于读取当前CPU性能计数器的值,并根据当前CPU性能计数器的值确定中 断事件发生的时间点,将时间点与数据信息绑定作为中断事件的日志信息存储在日志缓存 区。通过该日志记录子系统10,可以将系统发生的中断事件的日志记录在共享内存区,从而 可以提高存储的效率。图4为根据本发明实施例一的日志回放子系统20的结构示意图,该日志回放子系 统20可以包括日志写入模块200、回放模块202和中断模拟模块204。其中,日志写入模
6块200用于将用户空间的日志信息写入日志缓存区;回放模块200,用于从日志缓存区读取 各个中断事件的日志信息,根据当前需要回放的中断事件发生的时间点,启动CPU性能计 数器,并将中断事件的外部输入值返回给中断模拟模块204 ;中断模拟模块204,用于在CPU 性能计数器溢出时,根据中断事件的外部输入值,完成中断事件的模拟,通过事件通道向目 标操作系统发送虚中断。通过该日志回放子系统20可以通过将日志信息读入到共享内存 区,通过CPU性能计数器进行计时来重现中断事件,可以提高中断事件回放的精确性。图5为根据本发明实施例一的基于半虚拟化技术的设备故障复现方法的流程图, 该方法主要包括以下步骤(步骤S502-步骤S504)步骤S502、通过前端设备驱动与后端设备驱动之间的事件通道,虚拟机管理器 (例如,上述日志记录子系统10)获取并记录日志信息,其中,该日志信息包括中断事件的 类型、外部输入值及中断事件发生的时间点,中断事件包括在接收到目标操作系统用户输 入的记录开始命令和记录结束命令期间发生的所有中断事件;例如,可以通过在设备驱动程序中设置钩子程序(Η00Κ程序),当有外部中断发生 时,钩子程序会截获中断信息并进行分析,将与回放有关的所有数据(即中断事件的类型 及外部输入数据)发送给虚拟机管理器处理;而虚拟机管理器在接收到HOOK程序发送的数 据时,读取当前CPU性能计数器的值(即tick值)作为此次中断操作发生的时间点,写入 虚拟机管理器处理预先在共享内存区域内创建并初始化好的日志缓存区中,或者,虚拟机 管理器也可以将当前中断事件发生时的tick值与上一次中断事件发生时的tick值之差作 为当前中断事件发生的时间点,这样可以减少存储时间点占用的空间。当日志缓存区的剩余空间少于预定值(例如,不足20%)时,为了确保后续的中断 事件能够被记录,虚拟机管理器可以将日志缓存区记录的日志信息拷贝到用户空间,并删 除日志缓存区内存储的日志信息。步骤S504、响应于目标操作系统用户输入的回放命令,虚拟机管理器依次按照记 录的各个中断事件发生的时间点,根据各个中断事件的类型及外部输入值,模拟产生对应 于记录的各个中断事件的虚拟中断,并通过事件通道向目标操作系统发送虚中断消息,使 目标操作系统执行对应该虚拟中断的处理操作,即回放。例如,用户端应用程序可以解析日志文件,将记录的中断事件发生的时间点、中断 事件的类型及外部输入值等信息写入日志缓冲区,然后通过系统调用嵌入内核。在接收到 回放命令时,虚拟机管理器判断日志缓存区内的日志信息是否小于预设值,如果是,则以虚 中断方式将用户空间的日志信息读入日志缓存区,否则,直接从日志缓存区顺序读取一个 中断事件的日志信息,根据该中断事件的时间点启动CPU性能计数器,当CPU性能计数器溢 出时,根据该中断事件的类型和外部输入值模拟该中断事件,产生一个虚中断。为了避免在回放最后一个中断事件后,虚拟机管理器还继续从用户空间读取日志 信息,在回放中断事件前,虚拟机管理器可以先判断当前中断事件是否是记录的最后一个 中断事件,如果是,则设置一个标识,指示回放完该中断事件后停止回放。通过本实施例的上述方法,通过记录系统运行过程中的中断事件及其发生时间 点,可以减少记录的数据量,减少存储空间的占用,并通过记录的时间点,可以精确再现中 断事件发生的时间,从而可以提高故障复现的精度。实施例二
本实施例以Xen半虚拟化平台为例,对本发明实施例提供的基于半虚拟化技术的 设备故障复现系统进行说明。图6为根据本发明实施例二的基于半虚拟化技术的设备故障复现系统的示意图。如图6所示,在本实施例中,日志记录子系统和日志回放子系统位于Xen虚拟机管 理器内,日志记录子系统通过核心处理单元获取中断事件的类型及外部输入值等信息,并 从CPU计数器中获取中断事件发生的时间点,将获取的中断事件的类型、外部输入值及其 发生的时间点等信息以日志文件的形式存储在特权域的用户空间。日志回放子系统从特权 域的日志文件中读取各个中断事件的相关信息,通过核心处理单元回放各个中断事件。图7为本实施例中的日志记录子系统的体系结构图,基于半虚拟化模型的日志记 录子系统就其体系结构来说分为用户接口、日志记录子系统虚拟设备和日志记录子系统核 心处理单元。日志记录子系统需要记录在目标操作系统运行期间,传送向Xen虚拟机管理 器的所有虚中断事件和每次中断事件的外部输入值。以网口中断为例,需要记录网口中断 类型(虚拟中断号)以及该网络数据包的内容;对于键盘中断,只需要记录它的虚拟中断号 和按键值即可。该日志记录子系统的各个模块之间的功能关系为特权域的用户层通过日志记录应用程序以系统调用的方式进入内核态,激活设备 驱动程序中的钩子程序(Η00Κ程序),并使用超级调用将用户指令传达到Xen内部的通信模 块;通信模块对命令进行解析之后向日志记录模块发送相应的命令,如开始,暂停,结束日 志记录等;日志记录模块在接到通信模块发来的命令后,针对不同的命令做出对应的操作, 如对于开始命令,日志记录模块进行性能计数器初始化,并开始计数,并且,日志记录模块 在共享内存区创建并初始化日志缓存区;对于暂停命令,日志记录模块则保存当前计数器 的值到全局变量,然后暂停计数。当有外部中断发生时,日志记录模块在相应设备驱动程序中的钩子程序会截获中 断信息并进行分析,将与回放有关的所有数据发送给虚拟机管理器处理;否则不执行任何 操作。在收到钩子程序的数据信息时,日志记录模块读取当前性能计数器的值作为此次中 断操作发生的时间点,将该时间点与来自钩子程序的数据信息绑定作为当前中断事件的日 志,写入虚拟机管理器处理预先初始化好的日志缓存区。当数据缓存区的剩余空间不足预设值(例如,20% )时,日志记录模块通过事件通 道向特权域发送虚中断,由特权域中相应的虚中断处理模块唤醒用户态下的读取进程,将 共享内存区域中的数据拷贝到特权域的用户空间,以日志文件的方式保存。图8为本实施例的日志回放子系统的体系结构图,如图8所示,基于半虚拟化的日 志回放子系统分为用户接口、日志回放子系统虚拟设备和日志回放子系统核心处理单元。 在本实施例中,日志回放子系统以数据环的形式读取日志信息,并实现回放。本实施例中,日志回放子系统的各个模块之间的功能关系为用户端应用程序解析日志文件,将日志文件中记录的中断事件发生的时间点、中 断事件的类型及外部输入值等信息写入用户缓冲区,然后通过系统调用嵌入内核,发送回 放系统初始化的消息。Xen的回放模块接到初始化的消息后,初始化性能计数器和数据环, 最后将初始化结果返回给特权域内核。
如果回放子系统初始化成功,则用户再发送回放开始消息,在接到此消息后,Xen 检查数据环中是否有可用日志信息如没有,则通过虚中断方式通知特权域内核,特权域内 核的虚中断处理模块截获此消息而后唤醒日志写入进程,将解析好的日志文件先写入设备 缓冲区,进而通过相应的超级调用写入Xen的数据环,并执行第一次回放操作(再发一次回 放消息);如有,继续。Xen中的回放模块将回放需要的信息从环中取出,并启动性能计数 器,完成本次超级调用执行,并且将外部中断输入返回给特权域内核供中断模拟模块使用。 当性能计数器溢出时,产生性能计数器中断,其中断模拟模块中将完成以前记录中断的模 拟工作例如,通过事件通道向非特权域发送虚中断,将日志记录的外部输入写入对应的数 据环中,通知回放模块本阶段回放已完成准备进行下一次的回放等。当Xen共享缓存区可用日志记录数少于20%时,回放模块以虚中断方式通知特权 域内核写入后续日志信息。通过本实施例的上述系统,可以减少回放所需记录的日志占用存储空间,这使长 期的系统监控成为可能。并且,通过将回放的时间点精确到CPU执行每一条分支指令(即 ltick),可以提高回放精确度,从而为及时排除故障提供了可能,进而可以缩短故障排除的 平均周期。实施例三本实施例基于实施例二所述的系统,对本发明实施例提供的基于半虚拟化技术的 设备故障复现方法进行说明。在本实施例的基于半虚拟化技术的设备故障复现方法中,为先运行日志记录子系 统,获取目标操作系统运行过程中的不确定事件信息,然后以这些信息作为输入运行日志 回放子系统,在一个新的客户操作系统上重现原操作系统的行为。为了方便描述,在本实施例中,将日志记录子系统的工作流程可分为命令(domid) 接收线程、日志传输线程和非特权域运行过程。其中,命令接收线程负责接收用户输入指 令;日志传输线程负责将日志数据从Xen与特权域的共享缓存区内拷贝到特权域用户态下 的临时缓存区中,然后将这些数据写入日志文件;为了保证回放的精确性,回放系统将日 志记录开始与结束的控制权交给非特权域,以避免日志记录之初非特权域的分支指令被遗 漏,因此在日志记录子系统启动以后非特权域的运行过程与日志记录子系统启动前不同。图9为本实施例中,日志记录子系统命令接收线程的工作流程图。如图9所示,日 志记录子系统命令接收线程(客户机操作系统,Domu)的工作流程主要包括以下步骤步骤1,日志记录子系统命令接收线程启动,等待用户输入指示;步骤2,判断用户输入的指令是否合法,如果是,判断用户输入的指令是否为“7”, 即日志记录关闭命令,如果是,则结束,否则执行步骤3 ;如果用户输入的指示不合法,则返 回步骤1继续等待用户输入指令;步骤3,判断用户输入指令的内容,如果用户输入的指令为“ 1 ”,则代表日志记录 初始化,执行步骤4 ;如果用户输入的指令为“2”则代表日志记录开启,执行步骤5 ;如果用 户输入的指令为“3”,则代表日志记录结束,执行步骤6 ;步骤4,设置日志记录标志位,然后共享内存映射初始化缓存存区及标志位,并注 册日志处理中断服务程序(即图7中的虚中断处理模块),然后返回执行步骤1 ;步骤5,首先判断是否启动日志记录,如果是,则设置记录开始标志位,并配置性能
9计数器,置位日志打开标志位,将控制移交给非特权域(domu)并返回执行步骤1,同时进行 非特权域(Domu)的运行过程;如果不启动日志记录,则返回执行步骤1 ;在本发明实施例中,当日志记录子系统开启后,并未马上开始回放,而是发生了一 次特权域与非特权域的切换。在非特权域环境下正式启动日志记录。这样可以保证日志记 录开始不会遗漏非特权域执行的分支指令,确保日志记录的完整性。步骤6,判断日志记录是否启动或记录是否开始,如果是,则结束记录,执行日志传 输线程传输剩余日志,结束后置位传输标志位,然后返回执行步骤1。图10为日志记录子系统的日志传输线程的工作流程图,日志传输线程除了负责 数据传输任务,还负责日志记录结束后共享内存映射的清除、中断服务程序的卸载。如图10 所示,在本发明实施全名,日志传输线程的工作流程主要包括以下步骤步骤1,日志传输线程处于休眠状态等待日志传输;步骤2,日志传输线程接收到命令接收线程通过中断服务程序发送的日志传输命令;步骤3,判断休眠标志位是否为真,如果是,则执行步骤4,否则返回步骤1 ;步骤4,拷贝日志数据;步骤5,判断是否为最后一次传输,如果是,则执行步骤6,否则执行步骤8 ;步骤6,共享内存区映射,清零相关标志位;步骤7,清除中断服务程序;步骤8,清除休眠标志位;步骤9,写日志文件;步骤10,判断日志传输标志位是否为真,如果是,则结束,否则返回执行步骤1。图11为在日志记录子系统开启的状态下,非特权域运行(即Domu运行过程)的 流程图,在非特权域环境下,代表日志记录的正式开始并将日志记录标志位置位,在以 后的日志记录过程中依靠该标志位判断回放系统的工作模式。并且,每一次日志记录都会 检测缓存区的状态,如果缓存区达到预设阀值,Xen会向特权域内核发送日志传输虚中断, 然后继续日志记录,以免漏掉当前正在发生的外部设备中断。从而不仅保证了日志记录之 初性能计数器的增加来源于目标虚拟域分支指令的执行,而且可以以异步中断消息的方式 通知特权域内核,让其在适当时间取走日志数据。当用户按下“$”时,记录过程终止。如图 11所示,在本发明实施例中,非特权域运行的流程主要包括以下步骤步骤1,非特权域接收到命令接收线程的命令,判断用户输入的字符是否==@或 已开启日志记录,如果是(即值为真),则执行步骤2,否则结束流程;步骤2,置位日志记录标志位;步骤3,判断命令(domid)是否相符,以判断当前的外部中断是否发生在执行日志 记录的客户机操作系统中,如果是,则执行步骤6,否则,执行步骤4 ;步骤4,性能计数器开始读数;步骤5,组合日志数据写入Xen缓存区;步骤6,判断缓存区是否已满,如果是,则执行步骤7,否则,执行步骤8 ;步骤7,发送虚中断,进入日志传输线程;步骤8,判断用户输入的字符是否==$,如果是,则结束流程,否则返回步骤1。结合图9至图11,回放系统的日志记录子系统记录日志主要包括以下步骤
步骤1、加载日志记录模块,启动目标虚拟机,运行日志记录应用程序,而后初始化 应用程序中的各个标志位;步骤2、按照图9所示的命令接收线程的工作流程,等待用户输入指令,在用户输 入指令后,如图9所示,验证指令的合法性,若合法继续执行;若不合法,返回让用户重新输 入;步骤3、若用户指令为日志记录初始化指令(log_init domid),即用户输入的指令 为“ 1 ”,则初始化日志记录子系统,包括设置模块工作方式,建立共享内存映射,创建并初始 化日志缓存区,以及注册虚中断服务程序;步骤4、若用户指令为日志记录开启指令(l0g_Start domid),即用户输入的指令 为“2”,则先验证系统是否经过初始化若日志记录子系统未经初始化,返回让用户重新输 入初始化命令;若日志记录子系统已初始化则变更模块工作方式,设置性能计数器,最后将 控制权交给目标操作系统,跳转到步骤6 ;步骤5、用户指令为日志记录结束指令(log_end domid),即用户输入的指令为 “3”,则先验证系统工作模式若非日志记录或记录开始,则返回让用户重新输入指令;否 则变更模块工作方式为记录结束,并且利用超级调用发送虚中断,通知特权域内核,最后置 位日志传输标志位,跳转到步骤8 ;步骤6、在目标操作系统界面下输入字符,按照图11所示的日志记录子系统的非 特权域运行流程图执行,若字符为“@”,则置位记录开始标志位,并利用超级调用将之后的 每次外部中断输入都写到Xen中的缓存区内,直到输入字符为“ $ ”时,跳转到步骤5 ;步骤7、当日志数据被记录到日志缓存区中后,验证日志缓存区容量若达到预设 的阀值(80% ),则通过事件通道向非特权域内核发送虚中断;步骤8、当特权域内核接收到来自于Xen的虚中断后,转到该虚中断的中断服务程 序在唤醒日志处理线程前(即按照图10所示的日志记录子系统日志传输线程工作流程进 行)先将休眠标志位置1以免日志传输线程再次被休眠;步骤9、日志处理线程首先将日志缓存区中的日志数据拷贝到用户缓存区中 ’然 后根据模块的工作模式来判定刚才执行的拷贝操作是否为最后一次记录传输,若是,则执 行解除共享内存映射,解绑中断服务程序等清理工作;最后将用户缓存区中的日志数据写 入日志文件,并通过验证日志传输标志位来决定是否继续运行。日志回放子系统的工作流程与日志记录子系统相似,可分为命令接收线程、日志 传输线程、非特权域运行过程和中断模拟线程。其中,命令接收线程负责接收用户指令并调 用ioctl完成相应操作;日志传输线程负责解析日志文件,并将解析得来的日志数据通过 写(write)系统调用写入Xen与特权域之间的共享缓存区中;为了保证回放的精确性,回放 开始与结束的控制权依然掌握在非特权域手中,因此有必要论述非特权域在回放过程中的 运行流程;中断模拟线程负责执行回放的具体操作。日志回放子系统命令接收线程工作流程如图12所示。在用户输入的指令中,“4” 代表日志回放初始化;“ 5 ”代表日志回放开启;“ 6 ”代表日志回放结束;“ 7 ”为日志回放关 闭命令。与日志记录子系统相同,日志回放子系统的命令接收线程同样需要特权域与非特 权域之间的切换,但切换只在回放第一个字符之前发生,之后回放过程会随着“ $ ”标志的输 出而自动终止。而记录不足时向日志传输线程发送消息的情况也只发生在回放开始时,在
11以后的回放过程中如果出现记录不足的情况,Xen中的回放核心处理单元会以虚中断的形 式通知特权域,进行下一阶段回放所需日志数据的传输。如图12所示,日志回放子系统命令接收线程的工作流程主要包括以下步骤步骤1,命令接收线程等待用户输入指令;步骤2,判断用户输入的指令是否合法,如果是,判断用户输入的指令是否为“7”, 即日志回放关闭命令,如果是,则结束,否则执行步骤3 ;如果用户输入的指示不合法,则返 回步骤1继续等待用户输入指令;步骤3,判断用户输入指令的内容,如果用户输入的指令为“4”,则代表日志回放 初始化,执行步骤4 ;如果用户输入的指令为“5”则代表日志回放开启,执行步骤5 ;如果用 户输入的指令为“6”,则代表日志回放结束,执行步骤6 ;步骤4,设置日志回放模块,建立共享内存映射设置虚中断(匪I)回调函数,注册 中断服务程序(即图8中的中断模拟模块),返回执行步骤1 ;步骤5,判断日志回放是否启动,如果是,则设置回放开始模式,设置性能计数器和 高级可编程中断控制器(APIC),然后判断记录是否不足,如果是,则执行日志传输线程,否 则,将控制移交给非特权域,执行Domu运行过程;步骤6,判断日志回放是否启动或回放是否开始,如果不是,则返回执行步骤1,否 则,设置回放结束模式,恢复匪I和APIC初始设置,卸载中断服务程序,然后结束其他线程, 返回步骤1。如图13所示,同日志记录子系统类似,日志回放子系统中的日志传输线程除了负 责数据传输任务外还有其他工作——根据传输日志量的多少来判断当前的回放是否为最 后一轮回放若是,则通过超级调用来通知Xen中的日志回放核心处理单元,在日志数据不 足时不在向特权域发送虚中断。如图13所示,在本发明实施例中,日志回放子系统中的日志传输线程的工作流程 主要包括以下步骤步骤1,日志传输线程处于休眠状态等待日志传输;步骤2,日志传输线程接收到命令接收线程通过中断服务程序发送的日志传输命 令;步骤3,判断休眠标志位是否为真,如果是,则执行步骤4,否则返回步骤1 ;步骤4,拷贝日志数据;步骤5,判断是否为最后一次传输,如果是,则执行步骤6,否则执行步骤8 ;步骤6,禁用Xen日志传输虚中断的发送;步骤7,清除休眠标志;步骤8,分离日志;步骤9,判断日志传输标志位是否为真,如果是,则结束,否则返回执行步骤1。图14为日志回放子系统中断模拟工作流程图。日志回放子系统的中断模拟模块 不但负责在规定回放时间点上完成不确定性事件的重现工作,而且还负责回放结束后的内 存释放、中断服务程序的卸载、匪I与APIC初值的恢复。如图14所示,日志回放子系统中断模拟主要包括以下步骤步骤1,中断模拟模块休眠以等待中断模拟;
步骤2,非特权域运行过程触发中断模拟模块或性能计数器溢出,触发高级可编程 中断控制器(APIC),高级可编号中断控制器触发中断模拟模块;步骤3,判断休眠标志位是否为真,如果是,则执行步骤4,否则,返回步骤1 ;步骤4,执行中断模块程序;步骤5,执行下一次回放;步骤6,判断是否无记录回放,如果是,则执行步骤7,否则,执行步骤8 ;步骤7,回放结束,恢复匪I与APIC,并卸载中断服务程序;步骤8,判断中断模块标识是否为真,如果是,则结束,否则返回步骤1。图15为在日志回放子系统运行过程中,非特权域的运行流程图。如图15所示,在 日志回放子系统运行过程中,非特权域的运行主要包括以下步骤步骤1,非特权域接收到命令接收线程的命令,判断用户输入的字符是否==@或 已开启日志记录,如果是(即值为真),则执行步骤2,否则结束流程;步骤2,置位日志回放标志位;步骤3,判断命令(domid)是否相符,如果是,则执行步骤6,否则,执行步骤1 ;步骤4,性能计数器开始读数;步骤5,发送匪I虚中断,进入中断模块线程;步骤6,判断用户输入的字符是否==$,如果是,则结束流程,否则返回步骤1。结合图12至图15,日志回放子系统进行事件回放主要包括以下步骤步骤1、加载回放模块,启动目标虚拟机,运行日志回放应用程序,而后初始化应用 程序中的各个标志位;步骤2、按照图12所示的日志回放子系统命令接收线程工作流程,等待用户输入 指令,在用户输入指令后,验证指令的合法性若合法继续执行;若不合法,返回让用户重 新输入;步骤3、若用户指令为日志回放初始化命令(i^playjnit domid),即用户输入的 指令为“4”,则初始化日志回放子系统,包括设置模块工作方式、建立共享内存映射、创建并 初始化日志缓存区、利用超级调用设置性能计数器中断(PMI)的回调函数,以及相应的注 册虚中断服务程序;步骤4、若用户指令为日志回放开启命令(r印lay_Start domid),即用户输入的 指令为“5”,则先验证系统是否经过初始化若未经初始化,返回让用户重新输入初始化命 令;若已初始化则变更模块工作方式,设置性能计数器与高级可编程中断控制器(APIC); 最后将控制权交给目标操作系统(回放模式下控制权移交只发生一次),跳转到步骤6 ;步骤5、若用户指令为日志回放结束命令(r印lay_end domid),即用户输入指令为 “6”,则先验证系统工作模式若非日志回放或回放开始,则返回让用户重新输入指令;否 则变更模块工作方式为回放结束,并且利用超级调用还原性能计数器和APIC中的值,以及 性能计数器中断回调函数,然后对先前注册的中断服务程序解除绑定,最后设置用户态标 志终止日志处理线程与中断模拟线程;步骤6、在目标操作系统界面下输入字符,按照如图15所示的非特权域的运行流 程图执行,若字符为“#,,,则置位回放开始标志位,并利用超级调用设置Xen内回放模块 中相应的标志位,然后通过事件通道向特权域内核发送性能计数器虚中断,以开始首次回放;步骤7、当特权域内核接收到来自于Xen的性能计数器虚中断后,转向该虚中断的 中断服务程序,即按照图14所示的日志回放子系统中断模拟工作流程图执行。在唤醒中断 模拟线程之前先将休眠标志位置1以免中断模拟线程再次被休眠;步骤8、中断模拟线程被唤醒后继续运行。如图14所示,若为回放阶段为首次回 放,则跳过中断模拟程序,直接利用超级调用执行下一次回放,否则,待中断模拟程序执行 完后再执行下一次回放。在回放超级调用中,首先查看缓冲区中的回放记录数是否不足, 若不足则通过事件通道向特权域内核发送日志处理虚中断,跳转到步骤10,按照图13所示 的日志传输线程工作流程执行;而后依据回放超级调用的返回值来判断回放是否结束,若 结束,则执行类似于步骤5的清除工作;然后清除休眠标志位,完成此次中断模拟线程的执 行;在结束线程并转到步骤11之前还需要检测中断模拟标志位是否置位,若不是,则再次 进行系统调用进入休眠。当性能计数器溢出时,高级可编程中断控制器会向CPU发出非可 屏蔽中断,在其的回调函数中通过事件通道向特权域内核发送性能计数器虚中断,转到步 马聚7 ο步骤9、当特权域内核接收到来自于Xen的日志处理虚中断后,转向该虚中断的 中断服务程序;在唤醒日志传输线程之前先将休眠标志位置1以免日志传输线程再次被休 眠;步骤10、如图13所示,日志传输线程首先将用户缓存区中的日志数据拷贝到共享 缓存区中;而后根据影子缓存区中日志的数量来判断是否是最后一轮回放,若是,则利用超 级调用将回放模块的相应标志位置位,避免回放模块在记录不足时发送日志处理虚中断; 然后根据模块的工作模式来判定刚才执行的拷贝操作是否为首次记录传输,若是,则执行 回放超级调用;最后通过分析日志文件取得新的日志数据,并通过验证日志传输标志位是 否置位和有无新日志数据来决定是否继续运行。步骤11、通知用户日志记录已全部回放完毕,等待系统关闭指令,跳转到步骤5。日志记录子系统与日志回放子系统均可通过在应用程序终端内键入“kill”指令, 来结束应用程序进程。从以上的描述中,可以看出,本发明实现了如下技术效果1.回放所需记录的日 志占用存储空间较小,这使长期的系统监控成为可能。2.回放精确度高,由于回放的时间点 精确到了 CPU执行的每一条分支指令。3.放系统不需要修改客户机操作系统,不用在这些 操作系统的驱动中安插各种钩子,即可对这些操作系统的外部中断进行精确的记录。4.回 放效率较高,回放过程和记录过程均不影响目标操作系统的正常运行,换句话说,回放系统 对于目标操作系统来说是透明的。进而可以在故障发生时对故障进行准确的定位,从而可 以保证故障得到及时的排除,缩短故障排除的周期。显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用 的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成 的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储 在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示 出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或 步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技 术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修 改、等同替换、改进等,均应包含在本发明的保护范围之内。
1权利要求
一种基于半虚拟化技术的设备故障复现方法,其特征在于,包括通过前端设备驱动与后端设备驱动之间的事件通道,虚拟机管理器获取并记录日志信息,其中,所述日志信息包括中断事件的类型、外部输入值及发生的时间点;响应于所述目标操作系统用户输入的回放命令,所述虚拟机管理器依次按照所述记录的各个中断事件发生的时间点,根据所述各个中断事件的类型及外部输入值,模拟产生对应于所述各个中断事件的虚拟中断,并通过所述事件通道向目标操作系统发送虚中断消息,使所述目标操作系统执行对应该虚拟中断的处理操作。
2.根据权利要求1所述的方法,其特征在于,所述中断事件是在接收到目标操作系统 用户输入的记录开始命令和记录结束命令期间发生的所有中断事件。
3.根据权利要求2所述的方法,其特征在于,对于所述所有中断事件之一,所述虚拟机 管理器获取该中断事件的类型及外部输入值包括在所述后端设备驱动程序中设置钩子程 序,当所述中断事件发生时,所述钩子程序获取所述中断事件的中断信息,从中解析出所述 中断事件的类型及外部输入值,并将所述中断事件的类型及外部输入值传送给所述虚拟机 管理器。
4.根据权利要求3所述的方法,其特征在于,对于所述各个中断事件之一,所述虚拟机 管理器获取该所述中断事件发生的时间点包括所述虚拟机管理器接收到所述中断事件的 类型及外部输入值时,读取当前CPU性能计数器的值,将所述值作为所述中断事件发生的时间点。
5.根据权利要求3所述的方法,其特征在于,对于所述各个中断事件之一,所述虚拟机 管理器获取该所述中断事件发生的时间点包括所述虚拟机管理器接收到所述中断事件的 类型及外部输入值时,读取当前CPU性能计数器的值,将当前所述CPU性能计数器的值与上 一次中断事件发生时所述CPU性能计数器的值之差作为所述中断事件发生的时间点。
6.根据权利要求2至5中任一项所述的方法,其特征在于,所述虚拟机管理器在接收到 所述目标操作系统用户输入的记录开始命令之前,所述方法还包括所述虚拟机管理器接 收所述目标操作系统用户输入的记录初始化命令,在所述虚拟机管理器与特权域的共享缓 存区内创建并初始化日志缓存区;对于所述所有中断事件之一,所述虚拟机管理器记录该中断事件的类型、外部输入值 及中断事件发生的时间点包括所述虚拟机管理器将所述中断事件的类型、外部输入值及 时间点记录在所述日志缓存区中。
7.根据权利要求6所述的方法,其特征在于,当所述日志缓存区的剩余空间小于预定 值或记录完成时,所述方法还包括将所述日志缓存区内记录的日志信息拷贝到用户空间, 删除所述日志缓存区内存储的日志信息。
8.根据权利要求7所述的方法,其特征在于,所述虚拟机管理器根据各个中断事件的 类型及外部输入值,模拟得到所述记录的各个中断事件的虚拟中断,包括判断所述日志缓存区内的日志信息是否小于预设值,如果是,则以虚中断方式将所述 用户空间的日志信息读入所述日志缓存区;从所述日志缓存区顺序读取所述各个中断事件之一的日志信息,根据该中断事件发生 的时间点启动所述CPU性能计数器,当所述CPU性能计数器溢出时,根据该中断事件的类型 和外部输入值模拟该中断事件,产生一个虚拟中断。
9.根据权利要求8所述的方法,其特征在于,在从所述日志缓存区顺序读取所述各个 中断事件之一的日志信息之前,还包括判断读取的所述中断事件是否为最后一个中断事 件,如果是,则设置标识位,指示在模拟所述中断事件后不再读取下一个日志信息。
10.一种基于半虚拟化技术的设备故障复现系统,其特征在于,包括日志记录子系统,用于通过前端设备驱动与后端设备驱动之间的事件通道,获取并记 录日志信息,其中,所述日志信息包括中断事件的类型、外部输入值及发生的时间点;日志回放子系统,用于响应于所述目标操作系统用户输入的回放命令,依次按照记录 的各个中断事件发生的时间点,根据所述各个中断事件的类型及外部输入值,模拟产生对 应于所述记录的各个中断事件的虚拟中断,并通过所述事件通道向目标操作系统发送虚中 断消息,使所述目标操作系统执行对应该虚拟中断的处理操作。
11.根据权利要求10所述的系统,其特征在于,所述日志记录子系统包括日志处理模块,用于响应于所述目标操作系统用户输入的记录初始化命令,在所述前 端设备驱动与所述后端设备驱动之间的共享内存区创建并初始化日志缓存区,并将存储在 所述日志缓存区的日志信息拷贝到用户空间;后端设备驱动模块,用于截获中断事件发生时的中断信息,将与所述中断事件的回放 有关的数据信息发送至日志缓存区,并触发日志记录模块,其中,所述数据信息包括所述 中断事件的类型和外部输入值;日志记录模块,用于读取当前CPU性能计数器的值,并根据当前CPU性能计数器的值确 定所述中断事件发生的时间点,将所述时间点与所述数据信息绑定作为所述中断事件的日 志信息存储在所述日志缓存区。
12.根据权利要求11所述的系统,其特征在于,所述日志回放子系统包括日志写入模块,用于将用户空间的所述日志信息写入所述日志缓存区;回放模块,用于从所述日志缓存区读取各个中断事件的日志信息,根据当前需要回放 的中断事件发生的时间点,启动CPU性能计数器,并将所述中断事件的外部输入值返回给 中断模拟模块;所述中断模拟模块,用于在所述CPU性能计数器溢出时,根据所述中断事件的外部输 入值,完成所述中断事件的模拟,通过所述事件通道向所述目标操作系统发送虚中断。
全文摘要
本发明公开了一种基于半虚拟化技术的设备故障复现方法及系统,其中,该方法包括通过前端设备驱动与后端设备驱动之间的事件通道,虚拟机管理器获取并记录日志信息,其中,日志信息包括中断事件的类型、外部输入值及发生的时间点;响应于目标操作系统用户输入的回放命令,虚拟机管理器依次按照记录的各个中断事件发生的时间点,根据各个中断事件的类型及外部输入值,模拟产生对应于各个中断事件的虚拟中断,并通过事件通道向目标操作系统发送虚中断消息,使目标操作系统执行对应该虚拟中断的处理操作。通过本发明,可以减少记录的日志占用的存储空间,提高回放的精度和效率。
文档编号G06F11/34GK101887393SQ20101022073
公开日2010年11月17日 申请日期2010年7月1日 优先权日2010年7月1日
发明者崔涛 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1