KVM虚拟机应用层无代理CDP方法、系统及存储介质与流程

文档序号:34247392发布日期:2023-05-25 01:53阅读:198来源:国知局
KVM虚拟机应用层无代理CDP方法、系统及存储介质与流程

本发明属于数据恢复,涉及一种kvm虚拟机应用层无代理cdp方法、系统及存储介质。


背景技术:

1、近年来,在数字经济全球化的浪潮下,云计算发展迅猛,已经得到各大政府部门和企业的大力支持,云计算技术的基础与核心就是虚拟化,而市场上开源的虚拟化方案有很多种,其中基于内核的虚拟机(kernel-based virtual machine,kvm)是最流行的一种方案。而在数据恢复领域,针对kvm虚拟机数据备份的研究是十分重要的课题。

2、传统备份技术一般都是采取定时或者手动备份,当数据损坏或者丢失时只能恢复到备份时指定的时间点,而不在该时间点的数据就会存在损坏或者丢失的风险,故连续数据保护技术(continuous data protection,cdp)是针上述风险提出来的一种技术方案,该技术方案一般是通过捕获目标数据的变化,使得当数据发生损坏或者丢失时,可以将数据恢复到任意时间点,提高备份的效率。

3、目前,针对kvm虚拟机的cdp技术方案分有代理和无代理两种方向。现有有代理技术是通过在虚拟机内部安装代理软件实现i/o截获及存储,从而实现cdp,但是该有代理技术只能针对raw格式磁盘,并且每一台虚拟机都需要手动安装代理软件,一旦代理需要升级,需要重启系统,该行为造成的影响是系统的开销变大和维护的成本变高。另外,现有无代理技术是在宿主机内核安装一个内核模块,该内核模块能够识别并截获所有虚拟机的i/o,从而实现cdp,但该无代理技术只能针对raw和qcow2格式磁盘,应用范围较小,且一旦出问题将会影响宿主机,安全风险较大。

4、经研究,kvm虚拟机除了raw和qcow2格式,还有十多种格式的磁盘,而针对广泛格式磁盘的cdp技术几乎没有。因此,提出一种适用磁盘格式广泛且不影响宿主机的kvm虚拟机cdp技术,是当前急需解决的技术问题。


技术实现思路

1、本发明为了解决上述背景技术中的技术问题,提供了一种kvm虚拟机应用层无代理cdp方法、系统及存储介质。所述技术方案如下:

2、第一个方面,提供了一种kvm虚拟机应用层无代理cdp方法,包括步骤:

3、读取proc文件系统,获取目标qemu进程依赖的libc.so动态链接库地址和目标虚拟机的磁盘格式;

4、通过elf文件格式和所述libc.so动态链接库地址解析所述libc.so动态链接库,获取dlopen函数地址;

5、向所述libc.so动态链接库的elf头部第9至第16字节地址空间填入系统调用机器码,再调用sys_mmap系统调用分配预定大小的物理内存映射到所述目标qemu进程的地址空间,其中所述物理内存是dlopen函数的调用栈空间和dlopen函数参数所需要的字符串空间,其中所述sys_mmap系统调用通过所述系统调用机器码进行调用;

6、向所述libc.so动态链接库的elf头部第9至第16字节地址空间填入函数调用机器码,配置dlopen函数调用栈和dlopen函数参数对应的字符串,再调用dlopen函数将so文件加载到所述目标qemu进程的地址空间,其中所述dlopen函数通过所述函数调用机器码进行调用;

7、通过所述磁盘格式在所述目标qemu进程的地址空间寻找目标磁盘结构体blockdriver,再使用so文件的hook函数替换所述目标磁盘结构体blockdriver的i/o写函数;

8、通过所述hook函数截获i/o写数据并备份截获的i/o写数据。

9、在其中一个实施例中,所述通过elf文件格式和所述libc.so动态链接库地址解析所述libc.so动态链接库,获取dlopen函数地址步骤,包括:

10、通过elf文件格式读取libc.so动态链接库,获取所述libc.so动态链接库的elf头部信息;

11、解析所述elf头部信息,获取libc.so动态链接库的节区头部表信息,所述节区头部表存放着所有节区的信息;

12、解析所述节区头部表信息,获取存放函数地址信息的节区,所述存放函数地址信息的节区包括:dynsym节区、dynstr节区、rela.plt节区和rela.dyn节区;

13、遍历所述存放函数地址信息的节区,获取dlopen函数地址。

14、在其中一个实施例中,所述向所述libc.so动态链接库的elf头部第9至第16字节地址空间填入系统调用机器码,再调用sys_mmap系统调用分配预定大小的物理内存映射到所述目标qemu进程的地址空间步骤,包括:

15、选取libc.so动态链接库的elf头部第9至第16字节地址空间作为机器码存放地址;

16、向所述机器码存放地址填入系统调用机器码,所述系统调用机器码为syscall指令和、int3指令和nop指令;

17、调用sys_mmap系统调用分配预定大小的物理内存映射到所述目标qemu进程的地址空间,其中所述物理内存是dlopen函数的调用栈空间和dlopen函数参数所需要的字符串空间,其中所述sys_mmap系统调用通过所述系统调用机器码进行调用。

18、在其中一个实施例中,所述调用sys_mmap系统调用分配预定大小的物理内存映射到所述目标qemu进程的地址空间步骤,还包括:

19、所述dlopen函数的调用栈空间大小为s,所述s≧8兆字节;

20、以字节为单位分配dlopen函数参数所需要的字符串空间,不足一内存页按一内存页处理,所述内存页大小为4096字节。

21、在其中一个实施例中,所述向所述libc.so动态链接库的elf头部第9至第16字节地址空间填入函数调用机器码,配置dlopen函数调用栈和dlopen函数参数对应的字符串,再调用dlopen函数将so文件加载到所述目标qemu进程的地址空间步骤,包括:

22、向libc.so动态链接库的elf头部第9至第16字节地址空间填入函数调用机器码,所述函数调用机器码为callq *%rax指令、int3指令和nop指令;

23、在rax寄存器、rbp寄存器、rsp寄存器、rdi寄存器中依次存放dlopen函数地址、dlopen函数调用栈空间的栈底地址、dlopen函数调用栈空间的栈顶地址、dlopen函数参数对应的字符串空间地址;

24、调用dlopen函数将so文件加载到所述目标qemu进程的地址空间,其中所述dlopen函数通过所述函数调用机器码进行调用。

25、第二个方面,还提供了一种kvm虚拟机应用层无代理cdp系统,所述系统包括:

26、获取libc.so动态链接库地址和磁盘格式模块,用于读取proc文件系统,获取目标qemu进程依赖的libc.so动态链接库地址和目标虚拟机的磁盘格式;

27、获取dlopen函数地址模块,用于通过elf文件格式和所述libc.so动态链接库地址解析所述libc.so动态链接库,获取dlopen函数地址;

28、分配dlopen函数调用栈空间和参数字符串空间模块,用于向所述libc.so动态链接库的elf头部第9至第16字节地址空间填入系统调用机器码,再调用sys_mmap系统调用分配预定大小的物理内存映射到所述目标qemu进程的地址空间,其中所述物理内存是dlopen函数的调用栈空间和dlopen函数参数所需要的字符串空间,其中所述sys_mmap系统调用通过所述系统调用机器码进行调用;

29、调用dlopen函数加载so文件模块,用于向所述libc.so动态链接库的elf头部第9至第16字节地址空间填入函数调用机器码,配置dlopen函数调用栈和dlopen函数参数对应的字符串,再调用dlopen函数将so文件加载到所述目标qemu进程的地址空间,其中所述dlopen函数通过所述函数调用机器码进行调用;

30、替换i/o写函数模块,用于通过所述磁盘格式在所述目标qemu进程的地址空间寻找目标磁盘结构体blockdriver,再使用so文件的hook函数替换所述目标磁盘结构体blockdriver的i/o写函数;

31、备份i/o写数据模块,用于通过所述hook函数截获i/o写数据并备份截获的i/o写数据。

32、在其中一个实施例中,所述获取dlopen函数地址模块,包括:

33、libc.so动态链接库的elf头部信息获取单元,用于通过elf文件格式读取libc.so动态链接库,获取所述libc.so动态链接库的elf头部信息;

34、libc.so动态链接库的elf节区头部表获取单元,用于解析所述elf头部信息,获取libc.so动态链接库的节区头部表信息,所述节区头部表存放着所有节区的信息;

35、存放函数地址信息的节区获取单元,用于解析所述节区头部表信息,获取存放函数地址信息的节区,所述存放函数地址信息的节区包括:dynsym节区、dynstr节区、rela.plt节区和rela.dyn节区;

36、dlopen函数地址获取单元,用于遍历所述存放函数地址信息的节区,获取dlopen函数地址。

37、在其中一个实施例中,所述分配dlopen函数调用栈空间和参数字符串空间模块,包括:

38、选取机器码存放地址单元,用于选取libc.so动态链接库的elf头部第9至第16字节地址空间作为机器码存放地址;

39、填入系统调用机器码单元,用于向所述机器码存放地址填入系统调用机器码,所述系统调用机器码为syscall指令和、int3指令和nop指令;

40、调用sys_mmap系统调用单元,用于调用sys_mmap系统调用分配预定大小的物理内存映射到所述目标qemu进程的地址空间,其中所述物理内存是dlopen函数的调用栈空间和dlopen函数参数所需要的字符串空间,其中所述sys_mmap系统调用通过所述系统调用机器码进行调用。

41、在其中一个实施例中,所述调用dlopen函数加载so文件模块,包括:

42、填入函数调用机器码单元,用于向libc.so动态链接库的elf头部第9至第16字节地址空间填入函数调用机器码,所述函数调用机器码为callq *%rax指令、int3指令和nop指令;

43、修改寄存器组单元,用于在rax寄存器、rbp寄存器、rsp寄存器、rdi寄存器中依次存放dlopen函数地址、dlopen函数调用栈空间的栈底地址、dlopen函数调用栈空间的栈顶地址、dlopen函数参数对应的字符串空间地址;

44、调用dlopen函数单元,用于调用dlopen函数将so文件加载到所述目标qemu进程的地址空间,其中所述dlopen函数通过所述函数调用机器码进行调用。

45、第三个方面,提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述kvm虚拟机应用层无代理cdp方法。

46、本发明的有益效果是:

47、1.本发明具有普遍性,能够在qemu应用层进行i/o偏移量转换之前截获i/o,不用考虑磁盘文件格式,所有格式的磁盘文件都可以采用该方法;

48、2.本发明具有低风险性,在qemu进程空间加载so文件,备份一旦出现问题只会影响当前qemu进程,不会涉及宿主机和其他qemu进程;

49、3.本发明具有良好运行性,相比于其他备份方法,例如复制和快照,需要暂停虚拟机,该方法使用过程中虚拟机运行情况良好;

50、4.本发明具有无代理性,不需要在kvm虚拟机内部安装任何代理,实现了无代理cdp;

51、5.本发明实现了cdp,通过在qemu应用层截获kvm虚拟机的i/o写请求得到所有i/o写数据,从而实现cdp。

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