一种故障模拟方法、装置及相关设备与流程

文档序号:32660936发布日期:2022-12-23 23:31阅读:45来源:国知局
一种故障模拟方法、装置及相关设备与流程

1.本技术涉及文件系统技术领域,特别涉及一种故障模拟方法,还涉及一种故障模拟装置、系统及计算机可读存储介质。


背景技术:

2.在系统(如文件系统、存储系统等)性能测试过程中,需要对一些故障场景进行测试来评估系统的可靠性,为了完成这些测试需要,需要对系统进行故障模拟。相关技术中,模拟文件系统类故障主要使用linux系统自带命令实现,但是,该种实现方式需要耗费大量的时间,存在工作效率低下的问题;也会采用kretprobe(一种允许在内核函数返回时调用用户定义函数的调试机制)的方式修改函数返回值实现,但是,kretprobe插桩的方式并没有真实拦截住系统的操作请求,只是修改系统调用的返回值,欺骗用户态进程,而系统对文件的操作过程实际已经完成,模拟不够真实。
3.因此,如何实现快速高效的故障模拟,同时提高故障模拟的真实性是本领域技术人员亟待解决的问题。


技术实现要素:

4.本技术的目的是提供一种故障模拟方法,该故障模拟方法可以实现快速高效的故障模拟,同时可以有效提高故障模拟的真实性;本技术的另一目的是提供一种故障模拟装置、系统及计算机可读存储介质,均具有上述有益效果。
5.第一方面,本技术提供了一种故障模拟方法,应用于内核vfs层,包括:
6.接收文件操作请求;
7.根据目标模拟故障确定目标拦截函数;
8.在所述文件操作请求中查询所述目标拦截函数的入口地址;
9.将所述文件操作请求中的所述目标拦截函数的入口地址替换为预设函数的入口地址;
10.放行修改后的文件操作请求。
11.优选的,接收所述文件操作请求,包括:
12.接收系统调用通过软中断发送的所述文件操作请求。
13.优选的,所述故障模拟方法还包括:
14.当所述文件操作请求的执行结果为所述目标模拟故障对应的错误码时,输出故障模拟成功提示;
15.当所述文件操作请求的执行结果为文件处理结果时,输出故障模拟失败提示。
16.优选的,所述故障模拟方法还包括:
17.将所述错误码或所述文件处理结果反馈至所述文件操作请求的请求终端。
18.优选的,所述目标模拟故障包括磁盘空间满故障、inode耗尽故障、文件系统只读故障、文件不可读写故障。
19.优选的,所述在所述文件操作请求中查询所述目标拦截函数的入口地址,包括:
20.利用kallsyms_lookup_name()函数在所述文件操作请求中查询所述目标拦截函数的入口地址。
21.优选的,所述将所述文件操作请求中的所述目标拦截函数的入口地址替换为预设函数的入口地址,包括:
22.利用text_poke()函数将所述文件操作请求中的所述目标拦截函数的入口地址替换为所述预设函数的入口地址。
23.第二方面,本技术还公开了一种故障模拟装置,应用于内核vfs层,包括:
24.操作请求接收模块,用于接收文件操作请求;
25.拦截函数确定模块,用于根据目标模拟故障确定目标拦截函数;
26.入口地址查询模块,用于在所述文件操作请求中查询所述目标拦截函数的入口地址;
27.入口地址修改模块,用于将所述文件操作请求中的所述目标拦截函数的入口地址替换为预设函数的入口地址;
28.操作请求放行模块,用于放行修改后的文件操作请求。
29.第三方面,本技术还公开了一种故障模拟系统,包括:
30.存储器,用于存储计算机程序;
31.处理器,用于执行所述计算机程序时实现如上所述的任一种故障模拟方法的步骤。
32.第四方面,本技术还公开了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如上所述的任一种故障模拟方法的步骤。
33.本技术所提供的一种故障模拟方法,应用于内核vfs层,包括:接收文件操作请求;根据目标模拟故障确定目标拦截函数;在所述文件操作请求中查询所述目标拦截函数的入口地址;将所述文件操作请求中的所述目标拦截函数的入口地址替换为预设函数的入口地址;放行修改后的文件操作请求。
34.可见,本技术所提供的故障模拟方法,对于文件系统内的文件操作请求,可以根据实际需要模拟的故障(目标模拟故障)确定需要劫持的函数,即目标拦截函数,进而从文件操作请求中查询得到该目标拦截函数的入口地址,由此,则可以通过将该入口地址替换为预先设定的函数的入口地址实现文件操作请求的修改,进而实现文件系统类故障注入,也即实现文件系统类的故障模拟。显然,通过拦截文件操作请求并对其进行信息修改实现故障注入,而不单单是修改系统调用的返回值,不仅具有较高的故障模拟效率,也实现了更为真实的故障模拟,从而可以更为有效地缩短产品上线的测试周期。
35.本技术所提供的一种故障模拟装置、系统及计算机可读存储介质,均具有上述有益效果,在此不再赘述。
附图说明
36.为了更清楚地说明现有技术和本技术实施例中的技术方案,下面将对现有技术和本技术实施例描述中需要使用的附图作简要的介绍。当然,下面有关本技术实施例的附图
描述的仅仅是本技术中的一部分实施例,对于本领域普通技术人员来说,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图,所获得的其他附图也属于本技术的保护范围。
37.图1为本技术所提供的一种故障模拟方法的流程示意图;
38.图2为本技术所提供的一种故障模拟装置的结构示意图;
39.图3为本技术所提供的一种故障模拟系统的结构示意图。
具体实施方式
40.本技术的核心是提供一种故障模拟方法,该故障模拟方法可以实现快速高效的故障模拟,同时可以有效提高故障模拟的真实性;本技术的另一核心是提供一种故障模拟装置、系统及计算机可读存储介质,也具有上述有益效果。
41.为了对本技术实施例中的技术方案进行更加清楚、完整地描述,下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行介绍。显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
42.在系统(如文件系统、存储系统等)性能测试过程中,需要对一些故障场景进行测试来评估系统的可靠性,为了完成这些测试需要,需要对系统进行故障模拟。相关技术中,模拟文件系统类故障主要使用linux系统自带命令实现,但是,该种实现方式需要耗费大量的时间,存在工作效率低下的问题;也会采用kretprobe的方式修改函数返回值实现,但是,kretprobe插桩的方式并没有真实拦截住系统的操作请求,只是修改系统调用的返回值,欺骗用户态进程,而系统对文件的操作过程实际已经完成,模拟不够真实。
43.因此,为解决上述技术问题,本技术提供了一种故障模拟方法,在该故障模拟方法中,对于文件系统内的文件操作请求,可以根据实际需要模拟的故障(目标模拟故障)确定需要劫持的函数,即目标拦截函数,进而从文件操作请求中查询得到该目标拦截函数的入口地址,由此,则可以通过将该入口地址替换为预先设定的函数的入口地址实现文件操作请求的修改,进而实现文件系统类故障注入,也即实现文件系统类的故障模拟。显然,通过拦截文件操作请求并对其进行信息修改实现故障注入,而不单单是修改系统调用的返回值,不仅具有较高的故障模拟效率,也实现了更为真实的故障模拟,从而可以更为有效地缩短产品上线的测试周期。
44.需要说明的是,本技术所提供的故障模拟方法主要用于实现文件系统类故障的模拟,当进程需要对一个文件进行操作时,需要调用对应的系统调用(系统调用是指运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务)来操作底层硬件实现相应的文件操作,且所有文件操作都需要经过内核的vfs层(virtual file system,虚拟文件系统),vfs属于linux内核软件层,用来处理与unix标准文件系统相关的所有系统调用,因此,本技术所提供的故障模拟方法可以由文件系统的内核vfs层实现。
45.本技术实施例提供了一种故障模拟方法。
46.请参考图1,图1为本技术所提供的一种故障模拟方法的流程示意图,该故障模拟方法包括:
47.s101:接收文件操作请求;
48.本步骤旨在实现文件操作请求的接收,当文件操作请求流经内核vfs层时,内核vfs层即可对其进行拦截,获得该文件操作请求,以便于通过后续步骤实现文件操作请求的修改,从而实现故障模拟。可以理解的是,文件操作请求的具体类型并不影响本技术方案的实施,对应于不同类型的文件操作,如文件读写操作、文件创建操作、文件删除操作等,文件操作请求可以为文件读写请求、文件创建请求、文件删除请求等。当然,该文件操作请求可以由用户通过请求终端或相应的前端设备发起。
49.s102:根据目标模拟故障确定目标拦截函数;
50.本步骤旨在根据目标模拟故障实现目标拦截函数的确定,其中,目标模拟故障即为当前所需模拟的文件系统类故障。可以想到的是,文件系统类故障的种类多种多样,在本技术的一个实施例中,目标模拟故障可以包括磁盘空间满故障、inode(索引节点)耗尽故障、文件系统只读故障、文件不可读写故障,以便于实现不同类型的文件系统类故障模拟。当然,以上几种故障类型仅为本技术实施例所提供的一种实现方式,并不唯一,还可以包括其他类型的文件系统类故障,本技术对此不做限定。
51.具体而言,针对不同的文件系统类故障模式,需要劫持不同的vfs层函数,以便于实现函数入口地址的修改,从而实现故障注入,完成故障模拟,因此,在确定目标模拟故障之后,即可确定模拟该故障所需劫持的vfs层函数,即上述目标拦截函数。以挂载点磁盘空间满故障为例,挂载点磁盘空间满故障的外在表现为:处于挂载点内的文件只读、不可写,因此,基于该外在表现,则可以通过劫持vfs_write()函数实现故障模拟,也就是说,载点磁盘空间满故障对应的目标拦截函数为vfs_write()函数。
52.s103:在文件操作请求中查询目标拦截函数的入口地址;
53.本步骤旨在实现目标拦截函数入口地址的查询。可以理解的是,本技术所提供的故障模拟方法旨在通过对目标模拟故障对应的目标拦截函数的入口地址进行修改实现故障注入,进而完成故障模拟,因此,在进行入口地址修改之前,可以先查询确定该目标拦截函数的入口地址。具体的,在接收到文件操作请求并拦截之后,即可从该文件操作请求中查询获得目标模拟故障对应的目标拦截函数的入口地址。由此,则可以通过修改该入口地址实现故障注入,进而完成故障模拟。
54.s104:将文件操作请求中的目标拦截函数的入口地址替换为预设函数的入口地址;
55.本步骤旨在实现目标拦截函数入口地址的修改,即将文件操作请求中的目标拦截函数的入口地址修改为一个预设函数的入口地址,该预设函数即为执行故障模拟操作的技术人员预先设定的一个唯一且固定的函数。可以想到的是,通过将目标拦截函数的入口地址替换为预设函数的入口地址,可以改变内核对于文件操作请求的处理流程,在目标拦截函数中实现自身的代码逻辑,因此,通过将目标拦截函数的入口地址替换该预设函数的入口地址即可实现相应的故障注入,完成故障模拟。
56.s105:放行修改后的文件操作请求。
57.本步骤旨在实现文件操作请求的放行,在将目标拦截函数的入口地址替换为预设函数的入口地址之后,相当于实现了文件操作请求的修改,也即将目标模拟故障注入至该文件操作请求中,此时,将该修改后的文件操作请求放行,以便于内核继续对其进行后续处理,完成文件操作请求的执行。
58.可见,本技术所提供的故障模拟方法,对于文件系统内的文件操作请求,可以根据实际需要模拟的故障(目标模拟故障)确定需要劫持的函数,即目标拦截函数,进而从文件操作请求中查询得到该目标拦截函数的入口地址,由此,则可以通过将该入口地址替换为预先设定的函数的入口地址实现文件操作请求的修改,进而实现文件系统类故障注入,也即实现文件系统类的故障模拟。显然,通过拦截文件操作请求并对其进行信息修改实现故障注入,而不单单是修改系统调用的返回值,不仅具有较高的故障模拟效率,也实现了更为真实的故障模拟,从而可以更为有效地缩短产品上线的测试周期。
59.在本技术的一个实施例中,上述接收文件操作请求,可以包括:接收系统调用通过软中断发送的文件操作请求。
60.本技术实施例提供了一种文件操作请求的获取方法。如上所述,当进程需要对一个文件进行操作时,需要调用对应的系统调用来操作底层硬件实现相应的文件操作,而系统调用则可以通过软中断的方式将文件操作请求发送至内核态,即内核vfs层。其中,软中断是利用硬件中断的概念,用软件方式进行模拟,实现宏观上的异步执行效果。
61.在本技术的一个实施例中,该故障模拟方法还可以包括:当文件操作请求的执行结果为目标模拟故障对应的错误码时,输出故障模拟成功提示;当文件操作请求的执行结果为文件处理结果时,输出故障模拟失败提示。
62.本技术实施例所提供的故障模拟方法,可进一步实现故障模拟结果的获取,即可以确定此次故障模拟是否成功,并通过输出相应的提示信息告知执行故障模拟操作的技术人员相应的故障模拟结果。具体而言,当故障模拟操作成功时,说明目标模拟故障对应的目标拦截函数的入口地址已经成功完成修改,即已经成功将需要模拟的故障注入至文件操作请求中,此时,如若文件系统继续对文件操作请求进行处理,由于其已经完成了故障注入,那么其对应的请求执行结果应当为目标模拟故障对应的错误码,而非相应的文件处理结果,因此,当文件操作请求的执行结果为目标模拟故障对应的错误码时,即可确定故障模拟成功,输出故障模拟成功提示即可;当故障模拟操作失败时,说明目标模拟故障对应的目标拦截函数的入口地址并未成功完成修改,即并未成功将需要模拟的故障注入至文件操作请求中,此时,如若文件系统继续对文件操作请求进行处理,由于其并未完成故障注入,那么其对应的请求执行结果应当为对应的文件处理结果,因此,当文件操作请求的执行结果为正常的文件处理结果时,即可确定故障模拟失败,输出故障模拟失败提示即可。
63.可以理解的是,当故障模拟成功时,其所获取的错误码与目标模拟故障相对应,即不同的模拟故障返回不同的错误码;当故障模拟失败时,其所获取的文件处理结果与文件操作请求相对应,即不同的文件操作请求对应于不同的文件处理结果,如文件读写结果、文件创建结果、文件删除结果等。
64.需要说明的是,故障模拟结果的提示方法并不影响本技术方案的实施,例如,可以为语音提示、指示灯提示、可视化界面文字/代码提示等,具体由技术人员根据实际需求进行设置即可,本技术对此不做限定。
65.在本技术的一个实施例中,该故障模拟方法还可以包括:将错误码或文件处理结果反馈至文件操作请求的请求终端。
66.本技术实施例所提供的故障模拟方法,旨在实现文件操作请求执行结果的反馈,即将文件操作请求的执行结果反馈至请求终端,使得上层可以有效感知底层变化结果,其
中,请求终端即为发起文件操作请求的终端设备,以便于告知请求者当前文件操作请求的执行结果。具体而言,无论是故障模拟失败还是故障模拟成功,均可以将相应的执行结果反馈至请求终端,也就是说,当故障模拟失败时,则可以将相应的错误码反馈至请求终端;当故障模拟成功时,则可以将文件处理结果反馈至请求终端。
67.在本技术的一个实施例中,上述在文件操作请求中查询目标拦截函数的入口地址,可以包括:利用kallsyms_lookup_name()函数在文件操作请求中查询目标拦截函数的入口地址。
68.本技术实施例提供了一种查询目标拦截函数入口地址的实现方式,即可以基于上述kallsyms_lookup_name()函数实现,kallsyms_lookup_name()函数具有可以通过函数名字获取对应的地址的功能。在此基础上,在确定目标模拟故障对应的目标拦截函数之后,即可启动kallsyms_lookup_name()函数,从而根据目标拦截函数的名称在文件操作请求中查询到其对应的入口地址。
69.当然,以上查询方法仅为本技术实施例所提供的一种实现方式,并不唯一,还可以采用其他类型的查询函数或其他的查询方法,具体由技术人员根据实际情况进行设定即可,本技术对此不做限定。
70.在本技术的一个实施例中,上述将文件操作请求中的目标拦截函数的入口地址替换为预设函数的入口地址,可以包括:利用text_poke()函数将文件操作请求中的目标拦截函数的入口地址替换为预设函数的入口地址。
71.本技术实施例提供了一种修改函数入口地址的实现方式,即可以基于上述text_poke()函数实现。具体而言,在查询获得目标拦截函数的入口地址之后,即可启动text_poke()函数,基于text_poke()函数指令替换技术,即可将目标拦截函数的入口地址替换为预设函数的入口地址。
72.当然,以上修改方法仅为本技术实施例所提供的一种实现方式,并不唯一,还可以采用其他类型的函数或其他的修改方法,具体由技术人员根据实际情况进行设定即可,本技术对此不做限定。
73.本技术还提供了一种故障模拟装置,请参考图2,图2为本技术所提供的一种故障模拟装置的结构示意图,该故障模拟装置应用于内核vfs层,可包括:
74.操作请求接收模块1,用于接收文件操作请求;
75.拦截函数确定模块2,用于根据目标模拟故障确定目标拦截函数;
76.入口地址查询模块3,用于在文件操作请求中查询目标拦截函数的入口地址;
77.入口地址修改模块4,用于将文件操作请求中的目标拦截函数的入口地址替换为预设函数的入口地址;
78.操作请求放行模块5,用于放行修改后的文件操作请求。
79.可见,本技术实施例所提供的故障模拟装置,对于文件系统内的文件操作请求,可以根据实际需要模拟的故障(目标模拟故障)确定需要劫持的函数,即目标拦截函数,进而从文件操作请求中查询得到该目标拦截函数的入口地址,由此,则可以通过将该入口地址替换为预先设定的函数的入口地址实现文件操作请求的修改,进而实现文件系统类故障注入,也即实现文件系统类的故障模拟。显然,通过拦截文件操作请求并对其进行信息修改实现故障注入,而不单单是修改系统调用的返回值,不仅具有较高的故障模拟效率,也实现了
更为真实的故障模拟,从而可以更为有效地缩短产品上线的测试周期。
80.在本技术的一个实施例中,上述操作请求接收模块1可具体用于接收系统调用通过软中断发送的文件操作请求。
81.在本技术的一个实施例中,该装置还可以包括故障模拟结果确定模块,用于当文件操作请求的执行结果为目标模拟故障对应的错误码时,输出故障模拟成功提示;当文件操作请求的执行结果为文件处理结果时,输出故障模拟失败提示。
82.在本技术的一个实施例中,该装置还可以包括请求执行结果反馈模块,用于将错误码或文件处理结果反馈至文件操作请求的请求终端。
83.在本技术的一个实施例中,上述目标模拟故障可以包括磁盘空间满故障、inode耗尽故障、文件系统只读故障、文件不可读写故障。
84.在本技术的一个实施例中,上述拦截函数确定模块2可具体用于利用kallsyms_lookup_name()函数在文件操作请求中查询目标拦截函数的入口地址。
85.在本技术的一个实施例中,上述入口地址查询模块3可具体用于利用text_poke()函数将文件操作请求中的目标拦截函数的入口地址替换为预设函数的入口地址。
86.对于本技术提供的装置的介绍请参照上述方法实施例,本技术在此不做赘述。
87.本技术还提供了一种故障模拟系统,请参考图3,图3为本技术所提供的一种故障模拟系统的结构示意图,该故障模拟系统可包括:
88.存储器,用于存储计算机程序;
89.处理器,用于执行计算机程序时可实现如上述任意一种故障模拟系统方法的步骤。
90.如图3所示,为故障模拟系统的组成结构示意图,故障模拟系统可以包括:处理器10、存储器11、通信接口12和通信总线13。处理器10、存储器11、通信接口12均通过通信总线13完成相互间的通信。
91.在本技术实施例中,处理器10可以为中央处理器(central processing unit,cpu)、特定应用集成电路、数字信号处理器、现场可编程门阵列或者其他可编程逻辑器件等。
92.处理器10可以调用存储器11中存储的程序,具体的,处理器10可以执行故障模拟方法的实施例中的操作。
93.存储器11中用于存放一个或者一个以上程序,程序可以包括程序代码,程序代码包括计算机操作指令,在本技术实施例中,存储器11中至少存储有用于实现以下功能的程序:
94.接收文件操作请求;
95.根据目标模拟故障确定目标拦截函数;
96.在文件操作请求中查询目标拦截函数的入口地址;
97.将文件操作请求中的目标拦截函数的入口地址替换为预设函数的入口地址;
98.放行修改后的文件操作请求。
99.在一种可能的实现方式中,存储器11可包括存储程序区和存储数据区,其中,存储程序区可存储操作系统,以及至少一个功能所需的应用程序等;存储数据区可存储使用过程中所创建的数据。
100.此外,存储器11可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件或其他易失性固态存储器件。
101.通信接口12可以为通信模块的接口,用于与其他设备或者系统连接。
102.当然,需要说明的是,图3所示的结构并不构成对本技术实施例中故障模拟系统的限定,在实际应用中故障模拟系统可以包括比图3所示的更多或更少的部件,或者组合某些部件。
103.本技术还提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时可实现如上述任意一种故障模拟方法的步骤。
104.该计算机可读存储介质可以包括:u盘、移动硬盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。
105.对于本技术提供的计算机可读存储介质的介绍请参照上述方法实施例,本技术在此不做赘述。
106.说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
107.专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本技术的范围。
108.结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom或技术领域内所公知的任意其它形式的存储介质中。
109.以上对本技术所提供的技术方案进行了详细介绍。本文中应用了具体个例对本技术的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本技术的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本技术原理的前提下,还可以对本技术进行若干改进和修饰,这些改进和修饰也落入本技术的保护范围内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1