CN109857522B - 一种面向kvm的虚拟化层故障注入方法 - Google Patents

一种面向kvm的虚拟化层故障注入方法 Download PDF

Info

Publication number
CN109857522B
CN109857522B CN201910156834.4A CN201910156834A CN109857522B CN 109857522 B CN109857522 B CN 109857522B CN 201910156834 A CN201910156834 A CN 201910156834A CN 109857522 B CN109857522 B CN 109857522B
Authority
CN
China
Prior art keywords
fault injection
fault
memory
parameters
injection
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201910156834.4A
Other languages
English (en)
Other versions
CN109857522A (zh
Inventor
张展
左德承
陈思远
封威
冯懿
董剑
刘宏伟
李文浩
舒燕君
罗丹彦
温东新
尚江卫
薛利兴
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Harbin Institute of Technology
Original Assignee
Harbin Institute of Technology
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Harbin Institute of Technology filed Critical Harbin Institute of Technology
Priority to CN201910156834.4A priority Critical patent/CN109857522B/zh
Publication of CN109857522A publication Critical patent/CN109857522A/zh
Application granted granted Critical
Publication of CN109857522B publication Critical patent/CN109857522B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)
  • Test And Diagnosis Of Digital Computers (AREA)

Abstract

一种面向KVM的虚拟化层故障注入方法,它属于KVM虚拟化机制测试技术领域。本发明解决了现有的KVM虚拟化机制的容错性测试方法的测试结果不准确的问题。本发明的故障注入方法包含的测试项有底层的CPU故障注入、底层的内存故障注入、底层的文件系统故障注入、管理层的虚拟机迁移故障注入、管理层的访问控制故障注入、管理层的内存管理故障注入和管理层的状态查询故障注入,本发明通过较多的测试项实现了KVM虚拟化机制的容错性测试,克服了现有KVM虚拟化机制容错性测试存在的测试结果不准确的问题,可以将测试结果的准确率提升至95%以上。本发明可以应用于KVM虚拟化机制测试技术领域。

Description

一种面向KVM的虚拟化层故障注入方法
技术领域
本发明属于KVM虚拟化机制测试技术领域,具体涉及一种面向KVM的虚拟化层故障注入方法。
背景技术
虚拟化技术是支撑云计算的核心技术,虚拟化系统的延迟或失效会直接影响上层云管理平台的性能和稳定性。因此,在系统开发阶段,保证虚拟化系统功能和性能的前提下,其容错性能必须通过验证。故障注入方法是一种常用的对软件系统进行容错性测试的方法,可以使用软件的方法向系统注入故障,观察系统在模拟真实故障下的表现。常用的虚拟化技术包括KVM、Xen、VMWare等,KVM作为一种基于Linux内核的虚拟化技术,由于其性能和实施的简易性,以及对Linux重量级的持续支持,在学术界和工业界得到了越来越多的应用。但是,当前针对KVM虚拟化机制的容错性测试还比较少,而且针对KVM虚拟化机制的容错性测试结果也较为不准确。因此,使用故障注入的方法来进一步评测KVM虚拟化系统的容错性能具有重要意义。
发明内容
本发明的目的是为了解决现有的KVM虚拟化机制的容错性测试方法的测试结果不准确的问题。
本发明为解决上述技术问题采取的技术方案是:一种面向KVM的虚拟化层故障注入方法,所述面向KVM的虚拟化层故障注入包括虚拟化底层故障注入和虚拟化管理层故障注入;
所述虚拟化底层故障注入包括底层的CPU故障注入、底层的内存故障注入和底层的文件系统故障注入;
所述底层的CPU故障注入是通过kprobe技术对目标函数do_fork进行故障注入来实现的;
所述底层的内存故障注入是通过jprobe技术拦截函数copy_page_range来实现的;
所述底层的文件系统故障注入是通过jprobe技术和kprobe技术配合输出的形式来实现的;
所述虚拟化管理层故障注入包括管理层的虚拟机迁移故障注入、管理层的访问控制故障注入、管理层的内存管理故障注入和管理层的状态查询故障注入;
所述管理层的虚拟机迁移故障注入是通过环境变量LD_PRELOAD运行迁移过程提供注入函数来实现的;
所述管理层的访问控制故障注入是通过内存资源负载工具产生大量的内存负载来实现的;
所述管理层的内存管理故障注入是通过jprobe技术和kprobe技术对目标函数kvm_set_memory_region()进行探测来实现的;
所述管理层的状态查询故障注入是通过采用打桩技术,并拦截替换库函数virDomainGetState来实现的。
本发明的有益效果是:本发明的一种面向KVM的虚拟化层故障注入方法,本发明的故障注入方法包含的测试项有底层的CPU故障注入、底层的内存故障注入、底层的文件系统故障注入、管理层的虚拟机迁移故障注入、管理层的访问控制故障注入、管理层的内存管理故障注入和管理层的状态查询故障注入,本发明通过较多的测试项实现了KVM虚拟化机制的容错性测试,克服了现有KVM虚拟化机制容错性测试存在的测试结果不准确的问题,可以将测试结果的准确率提升至95%以上。
附图说明
图1是本发明的一种面向KVM的虚拟化层故障注入方法的整体架构图;
图2是本发明的底层的CPU故障注入的流程图;
图3是本发明的底层的CPU故障注入的原理图;
图4是本发明的底层的内存故障注入的流程图;
图5是本发明的copy_page_range函数的调用流程图;
图6是本发明的底层的文件系统故障注入的流程图;
图7是本发明的sys_open函数的调用流程图;
图8是本发明的管理层的虚拟机迁移故障注入的流程图;
图9为本发明的虚拟机离线迁移的原理图;
图10为本发明的虚拟机在线迁移的原理图;
图11为迁移虚拟机时,虚拟机保存故障的设计原理图;
图12是本发明的管理层的访问控制故障注入的流程图;
图13是本发明的虚拟机间访问权限故障的原理图;
图14是本发明的管理层的内存管理故障注入的流程图;
图15是本发明的管理层的状态查询故障注入的流程图;
具体实施方式
具体实施方式一:结合图1说明本实施方式。本实施方式所述的一种面向KVM的虚拟化层故障注入方法,所述面向KVM的虚拟化层故障注入包括虚拟化底层故障注入和虚拟化管理层故障注入;
所述虚拟化底层故障注入包括底层的CPU故障注入、底层的内存故障注入和底层的文件系统故障注入;
所述底层的CPU故障注入是通过kprobe技术对目标函数do_fork进行故障注入来实现的;
所述底层的内存故障注入是通过jprobe技术拦截函数copy_page_range来实现的;
所述底层的文件系统故障注入是通过jprobe技术和kprobe技术配合输出的形式来实现的;
所述虚拟化管理层故障注入包括管理层的虚拟机迁移故障注入、管理层的访问控制故障注入、管理层的内存管理故障注入和管理层的状态查询故障注入;
所述管理层的虚拟机迁移故障注入是通过环境变量LD_PRELOAD运行迁移过程提供注入函数来实现的;
所述管理层的访问控制故障注入是通过内存资源负载工具产生大量的内存负载来实现的;
所述管理层的内存管理故障注入是通过jprobe技术和kprobe技术对目标函数kvm_set_memory_region()进行探测来实现的;
所述管理层的状态查询故障注入是通过采用打桩技术,并拦截替换库函数virDomainGetState来实现的。
面向KVM虚拟化的故障注入包括虚拟化底层故障注入和虚拟化管理层故障注入,对于虚拟化底层,针对CPU、内存和文件系统进行了故障注入,对于虚拟化管理层,针对虚拟机迁移、访问控制、内存管理和状态查询进行故障注入方法的研究。KVM虚拟化主要作为Linux的一个内核模块,完成对物理CPU和内存的高效虚拟化,而对底层物理硬件的交互基本上借助于Linux原有的各种机制,因此要模拟对虚拟化底层的故障注入可以通过对KVM依托的底层物理机操作系统进行对应功能的故障注入来实现。因为KVM虚拟化主要对CPU和内存进行虚拟化,要实现全面且完整的虚拟化管理功能还要借助于上层的QEMU模块,因此为了对虚拟化管理层进行较大覆盖面的故障注入,既要对KVM虚拟化的内核模块进行故障注入,又要对KVM和QEMU之间的交互接口进行故障注入。虚拟化层故障注入方法的整体架构图如图1所示:
(1)底层的CPU故障注入:
寄存器是CPU的重要组件,也是软硬件之间的接口,虚拟化机制也离不开对CPU的管理和虚拟化,通过对寄存器进行故障注入可以模拟CPU故障,从而对虚拟化系统引入故障。寄存器故障的注入方式包括硬件故障和软件故障,通过硬件的方式对寄存器进行故障注入的成本比较高,比较常用的是使用软件的方法来对寄存器进行故障注入。操作系统会在一些时刻将寄存器信息保存在内存镜像中(比如进程切换),并在之后将内存镜像中的信息恢复到寄存器中去,如果在这些时刻将内存中的寄存器信息进行改写,恢复到物理寄存器的信息就会发生改变,从而实现故障注入的效果。
(2)底层的内存故障注入
Linux通过页表的方式管理进程内存,KVM虚拟机实质上是作为一个Linux进程而存在,对内存进行故障注入会影响整个虚拟化系统。进行内存故障注入的方式主要有两种,一种是对内存的值进行故障注入,另一种是对内存的管理方式进行故障注入。为了更加快速的触发虚拟化底层的内存故障注入,选取了对内存的管理方式进行故障注入。内存管理比较核心的两个函数为页表挂载故障和页表更新故障,页表挂载函数会在创建进程的时候进行调用,页表更新函数会在需要更新页表项值(如发生缺页故障)的时候进行调用,选用页表挂载功能和页表更新功能进行故障注入可以很好的覆盖进程内存管理的整个过程。
(3)底层的文件系统故障注入
在Linux系统中,数据和物理资源基本上都是通过文件的概念进行管理,虚拟化技术的实现也离不开对文件的操作,文件系统的故障会触发虚拟化底层机制的故障,从而影响整个虚拟化系统。为了全面的覆盖文件系统可能会出现的故障,模拟了文件在创建、删除、读和写过程中可能会出现的故障,并在虚拟化系统的运行过程中,观察会怎样被触发。要对文件的操作过程注入合适的故障需要详细的理解每个操作的具体实现,拦截其中的关键功能部分,对其模拟故障的发生。
(4)管理层的虚拟机迁移故障注入
在虚拟化环境中,因为各种目的的需要,虚拟机迁移操作会被经常触发。虚拟机迁移的方式按照虚拟机是否会宕机分为离线迁移和在线迁移,而在源端和目的端,虚拟化管理机制会分别进行保存操作和恢复操作。对于离线迁移,保存的是整个虚拟机镜像,恢复的也是整个虚拟机镜像,对于在线迁移,保存的是初始的镜像和不断增量的镜像,恢复的也是初始的镜像和不断增量的镜像。通过在源端和目的端分别进行保存和恢复的故障注入,可以模拟整个虚拟机迁移过程中可能会触发的故障。
(5)管理层的访问控制故障注入
虚拟化环境中的多个虚拟机想要同时运行,离不开严格的访问控制机制,不恰当的访问控制会造成虚拟机访问到原本不可访问的资源,从而对整个虚拟化系统的稳定性和安全性造成严重的影响。访问控制主要包括两部分,一个是虚拟机间的访问权限控制,另一个是虚拟机资源的访问权限控制。虚拟机间的访问权限指的是不同的虚拟机对相同的虚拟化资源进行访问的权限控制,虚拟机资源访问权限指的虚拟机对虚拟化机制模拟出的虚拟化资源进行访问的权限控制。对虚拟机间访问权限的故障模拟是通过在多个虚拟机访问相同的宿主机物理资源过程中进行故障注入,模拟多个虚拟机对同一有限物理资源的竞争访问。虚拟机资源访问权限故障是通过在虚拟机访问宿主机物理资源的过程中,模拟限制虚拟机访问特定的资源或者模拟访问到原本不能访问到的资源。
(6)管理层的内存管理故障注入
内存虚拟化是虚拟化管理中的核心机制,是保证虚拟化的各个功能可以正常实现的关键因素。内存初始化和内存映射是内存管理机制中的重要功能,内存初始化在创建虚拟机的过程中构造出可以被操作系统识别出的内存环境,内存映射则是在虚拟机运行过程中将虚拟机的虚拟地址映射为宿主机的物理地址,内存映射的效率和可靠性直接决定了上层虚拟机的运行效率和可靠性。为了实现对内存初始化和内存映射过程进行故障注入,详细研究了这两个过程的具体实现机制,选取了恰当的位置注入故障。
(7)管理层的状态查询故障注入
状态查询故障包括VMM版本信息查询故障和虚拟机状态查询故障,VMM版本信息查询是在创建虚拟机的过程中会检查虚拟化管理软件(VMM)的版本信息,如果版本信息异常会影响虚拟机的创建,虚拟机状态查询指的是查询具体每个虚拟机运行状态的过程,查询到的虚拟机状态会影响虚拟化管理机制的后续操作。对VMM版本信息进行故障注入是通过修改查询到的版本信息,观察虚拟机的创建过程是否会差生异常,虚拟化状态查询故障时通过对查询到的虚拟机状态进行修改,观察虚拟化管理机制的后续操作会触发怎样的异常。
具体实施方式二:底层的CPU故障注入的流程图如图2所示。本实施方式与具体实施方式一不同的是:所述底层的CPU故障注入的具体过程为:
步骤A1、在待测目标主机上加载CPU故障注入工具的内核模块,其中:内核模块内部设置有目标函数do_fork的探针;
步骤A2、创建proc文件,proc文件用于传递用户态的输入参数;
创建proc文件的过程是创建对应的文件目录以及绑定的读和写的触发函数,这一部分是利用了linux系统提供的方式;
步骤A3、输入对底层的CPU进行故障注入的参数,包括故障位置参数、故障类型参数和故障方式参数;
步骤A4、触发探测函数来判断对底层的CPU进行故障注入的结束条件是否满足;
若满足,则输出对底层的CPU进行故障注入后的结果信息;
若不满足,则按照输入的参数来注入故障,并等待下一次触发探测函数,直至满足对底层的CPU进行故障注入的结束条件,再输出对底层的CPU进行故障注入后的结果信息;
步骤A5、收集故障注入后的结果信息,并统计输出;同时输出系统日志信息;
步骤A6、卸载CPU故障注入工具的内核模块,移除创建的proc文件,并卸载探测函数的kprobe探针。
通过采用虚拟化底层的CPU故障注入工具,能够模拟底层的CPU故障,会使得虚拟化系统部分功能失效甚至整个虚拟化系统崩溃。
虚拟化底层CPU故障注入原理:寄存器是CPU的组成部分,因为寄存器在CPU内,所以CPU对其的读写速度是最快的,不需要IO传输,但同时也决定了寄存器的数量十分有限。寄存器可以分为:通用寄存器,包含有ax、bx、cx、dx、si、di、bp、sp;段寄存器,包含有cs、ds、ss、es、fs、gs;状态和控制寄存器,包含有eflags;指令寄存器eip。在程序运行时栈中保存着大量寄存器信息,以供使用。
通用寄存器故障注入工具在进行故障注入时,针对目标函数do_fork进行故障注入,因为do_fork函数被访问的最频繁,最容易触发故障。故障注入选用的是kprobe技术,这样可以方便的获取到寄存器信息。在系统调用do_fork函数时,对通用寄存器信息进行拦截,并加以修改,以达到故障注入的目的。为了使故障容易触发,于是选择拦截系统调用最频繁的函数do_fork,如图3所示为底层的CPU故障注入原理图。
虚拟化底层CPU故障注入工具的实现:使用kprobe拦截do_fork函数时,可以获取到当前所有的寄存器信息,根据用户输入的不同,可以对不同的寄存器进行操作。选择寄存器的原理是将寄存器认为是某一位为1剩下其他位为0的一个数,通过与操作进行判断具体是哪一个寄存器。在确定寄存器后,会随机生成一个小于32的正整数,该数表示将目标寄存器的这一位做异或操作,达到改变寄存器值,进而达到故障注入的目的。
具体实施方式三:底层的内存故障注入的流程图如图4所示。本实施方式与具体实施方式一不同的是:所述底层的内存故障注入的具体过程为:
步骤B1、在待测目标主机上加载内存故障注入工具的内核模块,其中:内核模块内部设置有copy_page_range函数的探针;
步骤B2、创建proc文件,proc文件用于传递用户态的输入参数;
步骤B3、输入对底层的内存进行故障注入的参数,包括故障位置参数、故障类型参数和故障方式参数;
步骤B4、触发探测函数来判断对底层的内存进行故障注入的结束条件是否满足;
若满足,则输出对底层的内存进行故障注入后的结果信息;
若不满足,则按照输入的参数来注入故障,并等待下一次触发探测函数,直至满足对底层的内存进行故障注入的结束条件,再输出对底层的内存进行故障注入后的结果信息;
步骤B5、收集故障注入后的结果信息,并统计输出;同时输出系统日志信息;
步骤B6、卸载内存故障注入工具的内核模块,移除创建的proc文件,并卸载探测函数的jprobe探针。
通过采用虚拟化底层的内存故障注入工具,能够模拟底层的内存故障,会影响底层进程的内存使用,进而使得虚拟化底层的部分功能机制发生异常。
虚拟化底层内存故障注入原理:Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间。该空间是块大小为4G的线性虚拟空间,用户所看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。利用这种虚拟地址不但能起到保护操作系统的效果,而且更重要的是,用户程序可使用比实际物理内存更大的地址空间。
Linux采用了一种同时适用于32位和64位系统的普通分页模型。如四级分页模型,四种页表分别被称为:页全局目录、页上级目录、页中间目录和页表。页全局目录包含若干上级目录的地址,上级目录又包含若干中间目录的地址,而中检目录又包含若干页表的地址。每一个页表指向一个页框,线性地址因此被分成五个部分。
在讨论Linux页表就是讨论Linux进程的页表:Linux页表的更新包含于进程的更新之中。Linux内核采用的是写时复制方法,在创建一个Linux进程时,完全复制父进程的页表并且将父子进程的页表均置为写保护(即写地址的时候会产生缺页异常等)。那么父子进程谁向地址空间写数据时,产生缺页异常分配新的页,并将两页均置为可写,按照这种方式父子进程的地址空间渐渐变得不同。
在进程创建的过程中,地址空间中页表指向的全部是invalide_pte_table。进程创建一般调用的是do_fork函数,按照如下调用关系:do_fork->copy_process->copy_mm->dup_mm->dup_mmap->copy_page_rang,copy_pud_range便是拷贝pud表,copy_pud_range调用copy_pmd_range,copy_pmd_range调用copy_pte_range,以此完成对三级页表的复制。
如图5所示,系统通过调用do_fork函数创建新进程,do_fork函数主要会调用copy_process函数来为子进程复制出一份进程信息,copy_process函数对于内存的处理主要通过调用copy_mm函数来分配内存空间,copy_mm函数在内存空间不共享的情况下会调用dup_mm函数来创建一个新的内存空间,dup_mm函数主要包括分配并填充内存描述符以及调用dup_mmap函数复制父进程的线性区间和页表,dup_mmap函数对页表的拷贝是调用copy_page_rang函数来实现,通过拦截copy_page_rang函数,并对其dst_mm参数的结构体进行修改来模拟内存故障。
内存故障注入工具在进行故障注入时,针对目标函数copy_page_range进行故障注入,这时需要关注一下函数copy_page_range(struct mm_struct*dst_mm,struct mm_struct*src_mm,struct vm_area_struct*vma),每个进程只有一个mm_struct结构,在每个进程的task_struct结构中,有一个指向该进程的结构。可以说,mm_struct结构是对整个用户空间的描述。一个进程的虚拟空间中可能有多个虚拟区间(参见下面对vm_area_struct描述),对这些虚拟区间的组织方式有两种,当虚拟区较少时采用单链表,由mmap指针指向这个链表,当虚拟区间多时采用“红黑树(red_black tree)”结构,由mm_rb指向这颗树,进行故障注入时,就针对目标进程的地址空间中的dst_mm中的mmap和mm_rb进行故障注入。
虚拟化底层内存故障注入工具的实现:使用jprobe拦截函数copy_page_range时,需要先获取该函数的函数列表,使得jprobe替换函数保持参数列表的一致性。该参数有重要的两个参数,一个是原地址空间,一个是目标地址空间。目标地址空间就是新的进程页表挂载的内容。故jprobe在拦截到该函数的时候,将目标地址空间内的相关内容进行置零操作,使得新的进程页表挂载发生异常。
本故障注入工具能够针对KVM虚拟机访问控制进行故障注入,可以针对虚拟机间内存资源设计相关的故障注入实验,观察目标系统对KVM虚拟化访问控制故障的容错能力。
具体实施方式四:底层的文件系统故障注入的流程图如图6所示。本实施方式与具体实施方式一不同的是:所述底层的文件系统故障注入的具体过程为:
步骤C1、在待测目标主机上加载文件系统故障注入工具的内核模块,其中:内核模块内部设置有sys_open、sys_unlink、sys_read和sys_write函数的探针;
步骤C2、创建proc文件,proc文件用于传递用户态的输入参数;
步骤C3、输入对底层的文件系统进行故障注入的参数,包括故障位置参数、故障类型参数和故障方式参数;
步骤C4、触发探测函数来判断对底层的文件系统进行故障注入的结束条件是否满足;
若满足,则输出对底层的文件系统进行故障注入后的结果信息;
若不满足,则按照输入的参数来注入故障,并等待下一次触发探测函数,直至满足对底层的文件系统进行故障注入的结束条件,再输出对底层的文件系统进行故障注入后的结果信息;
步骤C5、故障注入结束后,收集故障注入结果并进行统计输出,同时也输出系统日志信息;
步骤C6、卸载文件系统故障注入工具的内核模块,移除创建的proc文件,并卸载探测函数的jprobe和kprobe探针。
通过采用虚拟化底层的文件系统故障注入工具,能够模拟底层文件系统中文件的创建、删除、读和写故障,这些故障会影响虚拟化底层对文件的操作,进而使得虚拟化底层的部分功能机制发生异常甚至整个系统的崩溃。
虚拟化底层文件系统故障注入原理:Linux以文件的形式对计算机中的数据和硬件资源进行管理,也就是彻底的一切皆文件,反映在Linux的文件类型上就是:普通文件、目录文件(也就是文件夹)、设备文件、链接文件、管道文件、套接字文件(数据通信的接口)等等。而这些种类繁多的文件被Linux使用目录树进行管理,所谓的目录树就是以根目录(/)为主,向下呈现分支状的一种文件结构。不同于纯粹的ext2之类的文件系统,把它称为文件体系,一切皆文件和文件目录树的资源管理方式一起构成了Linux的文件体系,让Linux操作系统可以方便使用系统资源。
所以文件系统比文件体系涵盖的内容少很多,Linux文件体系主要在于把操作系统相关的东西用文件这个载体实现:文件系统挂载在操作系统上,操作系统整个系统又放在文件系统里。对于文件的操作,从本质上来说是一种I/O,Linux I/O模型是在操作系统内核中实现的。应用程序可以通过注入open、close、read、和write这样的函数。
以文件创建为例,如图7所示,用户态程序在进行文件创建操作时,需要调用用户态的函数open,open函数会调用C库中对应的封装例程,该例程会通过sys_call来调用内核中文件创建对应的内核函数sys_open(const char__user*filename,int flags,umode_tmode),该函数的三个参数的的意义是:pathname,指向欲打开文件路径的字符串;flag,是文件操作的打开标识,最基本的打开方式为只读、只写和可读可写,还可以配合一些其他的方式;mode,表示权限,只有在建立新文件时才会生效,此外真正建立文件时的权限会受到umask值所影响,因此文件权限应该为mode-umask。若参数所有预检查的权限都通过检查则返回0,否则返回1。
虚拟化底层文件系统故障注入工具的实现:文件系统故障分为文件创建、文件删除、文件读和文件写四个方面。四个方面原理相似,本发明以文件创建故障为例进行介绍。在故障注入的过程中,采用了jprobe和kprobe配合的形式进行故障注入,首先使用jprobe和kprobe配合输出的形式,找到寄存器和参数之间的关系,找到的关系是flags对应的寄存器为si,filename对应的寄存器是di,mode对应的寄存器为dx。
文件创建故障注入工具采用的方式是通过修改东西寄存器来达到修改第二个参数flags的目的,这样读出的信息长度会存在问题,以到达影响读取输出的目的。采用的方式是通过产生一个0到31的随机数x,来将si寄存器的后x位置0,以达到影响flags的目的。为了控制故障传播过大造成系统崩溃,将di寄存器转化为路径进行路径判断,符合路径时,才可以触发故障。
本故障注入工具能够针对KVM虚拟机访问控制进行故障注入,可以针对虚拟机间内存资源设计相关的故障注入实验,观察目标系统对KVM虚拟化访问控制故障的容错能力。
具体实施方式五:管理层的虚拟机迁移故障注入的流程图如图8所示。本实施方式与具体实施方式一不同的是:所述管理层的虚拟机迁移故障注入的具体过程为:
步骤D1、通过环境变量LD_PRELOAD加载动态链接库对virDomainSave函数进行替换;
步骤D2、创建信息参数文件,信息参数文件用于传递用户态的输入参数;
步骤D3、输入对管理层的虚拟机迁移进行故障注入的参数,包括故障位置参数、故障类型参数和故障方式参数;
步骤D4、触发探测函数来判断对管理层的虚拟机迁移进行故障注入的结束条件是否满足;
若满足,则输出对管理层的虚拟机迁移进行故障注入后的结果信息;
若不满足,则按照输入的参数来注入故障,并等待下一次触发探测函数,直至满足对管理层的虚拟机迁移进行故障注入的结束条件,再输出对管理层的虚拟机迁移进行故障注入后的结果信息;
步骤D5、收集故障注入后的结果信息,并统计输出;同时输出系统日志信息;
步骤D6、移除环境变量LD_PRELOAD。
通过采用虚拟化管理层的虚拟机迁移故障注入工具,能够模拟虚拟机迁移过程中的故障,会使得虚拟机无法正常迁移。
虚拟机迁移故障注入原理:虚拟机在一些情况下需要进行迁移,迁移分为离线迁移和在线迁移。
其中,离线迁移大多数流程为:关闭虚拟机,复制虚拟机的定义xml文件到目的主机,复制虚拟机的镜像文件到目的主机,在目的主机上开机。如果需要保存虚拟机的运行状态,则还需要额外保存并复制虚拟机的内存快照,这一过程中,源端保存的快照记录了当前执行的进程,在目的端恢复后,可以无损继续之前的进程,离线迁移的原理如图9所示。
在线迁移和离线迁移是两个完全不同的过程,在线迁移对于用户是无法感知的,用户可以在迁移过程中正常使用虚拟机。预拷贝的方法实现原理为,先复制一次整体的内存信息到目的端,由于源主机在不断运行产生脏页,此时进行无限迭代复制脏页到目的端,这一过程是收敛的。内存同步完成后,一次性同步所有的状态信息和设备信息来完成迁移,在线迁移的原理如图10所示。
虚拟机保存故障,即迁移虚拟机时,源主机这一端发生的故障。大多数上层应用构架(如openstack)是通过libvirt这一虚拟化管理层来对底层的虚拟化进行操作的,虚拟机的迁移也是如此。通过对libvirt源程序进行分析,找出迁移模块中源端可能出现故障,选择对应位置进行注入。对于离线迁移,源端的Libvirt会在触发迁移操作后调用virDomainSave这一函数保存快照。对于在线迁移,源端的Libvirt在接受到迁移的命令后,会通过doMigrate函数,调用virDomainMigrateToURI3和virDomainMigrate3这两个函数中的一种(具体取决于迁移类型是否是p2p类型),这两个函数是具体控制在线迁移流程的函数。虚拟机保存故障的设计思想是通过拦截保存函数,随机的修改参数,模拟其故障。
对保存函数进行注入,采用了库打桩的方法。LD_PRELOAD可以改变程序加载动态库的优先级。如果把注入函数写好,编译成动态库,用LD_PRELOAD的方式运行迁移过程,那么迁移模块会首先从动态库中寻找函数标识符,即故障注入工具提供的注入函数,这样便可实现对迁移过程的故障注入,虚拟机保存故障的设计原理如图11所示。通过前面介绍的方法,截获了对virDomainSave函数的调用,修改参数信息,实现故障发生。然后需要调用原函数,使用用dlopendlsym等系列函数,打开原virDomainSave所在的动态库,获取这一函数的物理地址,用函数指针的形式对其进行调用,至此可实现将修改后的参数传入原本的virDomainSave。
具体实施方式六:管理层的访问控制故障注入的流程图如图12所示。本实施方式与具体实施方式一不同的是:所述管理层的访问控制故障注入的具体过程为:
步骤E1、根据当前宿主机的资源情况创建两台虚拟机;
步骤E2、通过SSH远程执行内存负载程序,设置两台虚拟机的内存占用率均为0.9;
步骤E3、判断两台虚拟机的内存是否均达到设置的内存占用率;
若两台虚拟机的内存均达到设置的内存占用率,则收集并显示故障注入后的结果信息;否则增加内存负载,直至两台虚拟机的内存均达到设置的内存占用率时,再收集并显示故障注入后的结果信息。
通过采用虚拟化管理层的访问控制故障注入工具,能够模拟多台虚拟机对内存的抢占式访问故障,会使得某台虚拟机异常或者多台虚拟机均异常。
虚拟化访问控制故障注入原理:访问控制故障注入主要包括虚拟机间访问权限故障注入和虚拟机资源访问权限故障注入。由于在同一宿主机上,不同的虚拟机都共享同一资源,当资源不足而导致竞争时就会导致虚拟机间访问权限故障。而虚拟机只能访问宿主机的资源,所以虚拟机资源访问权限故障就是面向虚拟机访问资源的过程中所进行的故障的注入。虚拟机间访问权限故障注入工具,使用虚拟机内存负载工具,使得虚拟机占用的总内存资源超出宿主机物理资源的上限,从而完成虚拟机间访问权限的故障的注入。虚拟机资源访问权限故障注入工具主要使用kprobe和jprobe技术,探测对应的内核函数,找到相应的寄存器,按照指定的故障注入参数进行修改,从而完成故障的注入。
由于虚拟机在运行时会占用大量的资源,在同一个宿主机上的多个虚拟机共享同一个宿主机的物理资源,当多个虚拟机的负载过大超出宿主机的资源上限时,就会产生虚拟机间访问权限故障。由于CPU资源是抢占式的执行不同的任务,所以虚拟机间CPU访问权限故障效果不明显。但内存资源是不可共享、互相独立的,当多个虚拟机占用的内存总资源之和大于其所在宿主机的物理资源,就会发生故障。
虚拟化访问控制故障注入工具的实现:每个KVM虚拟机都对应一个宿主机的qemu-kvm进程,每个qemu-kvm进程都有自己的虚拟地址空间。当虚拟机内存使用率越来越高时,其映射到宿主机物理内存的资源使用量也会越来越大,当多个虚拟机使用内存总量超过宿主机内存总量时,会使用宿主机swap分区资源。当宿主机物理资源与swap分区的资源之和小于虚拟机所需总的内存资源时,其中会使得若干虚拟机对应的qemu-kvm进程发生out-of-memory错误,从而qemu-kvm进程关闭,其对应的虚拟机也相应的宕机。在实际的生产过程中,同一物理宿主机上的多台虚拟机同时运行高负载的应用时,导致虚拟机间内存资源访问超出物理资源范围,出现资源互相挤压的状况,从而导致虚拟机崩溃的故障。为了模拟高内存资源占用的负载,在故障注入工具的设计上使用内存资源负载工具来产生大量的内存负载。虚拟机间访问权限故障原理如图13所示。
为了模拟内存资源高占用的情况,在虚拟机内部部署内存负载程序。程序首先获取当前虚拟机的可用总内存和空闲内存,并计算出当前的内存使用率。通过接收输入的目标内存占用率大小,判断当前内存情况。如果内存占用率没有达到目标水平,则通过malloc函数按照100字节大小为单位循环申请内存,直到达到指定的大小。在实际故障注入的过程中,首先根据当前宿主机的资源情况,创建两个虚拟机分别设置最大内存分配为宿主机内存资源的75%。故障注入则通过SSH远程执行内存负载程序,并设置内存占用率为0.9,这样两台虚拟机的占用的总内存为宿主机总内存的1.35倍。但在内存负载逐渐增加的过程中,当到达内存资源总量时,就会随机一台虚拟机或两台虚拟机宕机。原因则是因为虚拟机所对应的qemu-kvm进程因内存溢出而被宿主机强制杀死。
具体实施方式七:管理层的内存管理故障注入的流程图如图14所示。本实施方式与具体实施方式一不同的是:所述管理层的内存管理故障注入的具体过程为:
步骤F1、在待测目标主机上加载内存管理故障注入工具的内核模块,在内核模块的初始化函数中设置kprobe和jprobe探针并绑定kvm_set_memory_region()函数;
步骤F2、创建proc文件,创建proc文件用来传递用户态参数到内核态参数的转化;
步骤F3、输入对管理层的内存管理进行故障注入的参数,包括故障注入的故障位置参数、故障类型参数和故障方式参数;
步骤F4、触发探测函数来判断对管理层的内存管理进行故障注入的结束条件是否满足;
若满足,则输出对管理层的内存管理进行故障注入后的结果信息;
若不满足,则按照输入的参数来注入故障,并等待下一次触发探测函数,直至满足对管理层的内存管理进行故障注入的结束条件,再输出对管理层的内存管理进行故障注入后的结果信息;
步骤F5、卸载内存管理故障注入工具的内核模块,移除proc文件、kprobe和jprobe探针。
通过采用虚拟化管理层的内存管理故障注入工具,能够模拟虚拟机管理机制对虚拟机内存管理过程中的故障,会使得虚拟机无法正常创建或者使得正在运行的虚拟机发生异常。
虚拟化内存管理故障注入原理:内存管理故障注入主要分为内存初始化故障注入和内存映射故障注入。内存管理是KVM虚拟化层对于虚拟机内存的管理,其中内存初始化故障注入是初始化虚拟机内存的过程中进行故障的注入,而内存映射故障注入则是面向虚拟机的内存地址空间映射到宿主机内存地址空间的过程进行故障的注入。内存管理故障注入工具主要使用kprobe和jprobe技术,探测对应的内核函数,找到相应的寄存器,按照指定的故障注入参数进行修改,从而完成故障的注入。
KVM的虚拟机实际运行于qemu-kvm进程的上下文中。因此需要建立虚拟机的物理内存空间与qemu-kvm进程的虚拟地址空间的映射关系。而虚拟机的内存初始化,实际上就是建立上述的映射关系。虚拟机的物理地址空间实际上是不连续的,分成不同的内存区域(slot),所以虚拟机内存的初始化是以slot为单位来进行的。
qemu-kvm通过vmioctl指令KVM_SET_USER_MEMORY_REGION来为虚拟机初始化内存。vmioctl指令KVM_SET_USER_MEMORY_REGION在内核中的主要执行流程为首先是kvm_vm_ioctl接收指令,并进行简单的预处理,随后转发给具体的指令功能函数进行处理;第二步是kvm_vm_ioctl_set_memory_region()函数,此函数主要负责做slot的编号的参数检查,然后继续交由下一个函数;第三步是kvm_set_memory_region(),这个函数主要是添加互斥锁,保证在在内存初始化的过程中,不会因为并发的线程同步问题出现错误;第四步则是具体的功能实现函数,为__kvm_set_memory_region()。这个函数则负责接收两个参数,一个是目标虚拟机的kvm结构体,另外一个参数为kvm_userspace_memory_region结构体,这个结构体里包含了所分配的用户态虚拟地址内存块的信息。通过读取分析kvm_userspace_memory_region结构体中的信息,新建一个kvm_mem_slot结构体。kvm_mem_slot结构体内部存储了该slot的映射关系和其他的一些内存信息,如脏页位图、slot大小、架构相关、id等。然后将新初始化的kvm_mem_slot结构体放到目标虚拟机对应的kvm结构体中的kvm->memslots[]数组中。kvm_vm_ioctl_set_memory_region函数所在文件为kvm_main.c,
函数源码为:
int kvm_set_memory_region(struct kvm*kvm,
const struct kvm_userspace_memory_region*mem)
内存初始化故障注入工具的实现主要利用了kprobe和jprobe,探测函数为kvm_set_memory_region函数。目标函数有两个参数,分别为kvm结构体和kvm_userspace_memory_region结构。故障注入则是通过修改kvm_userpace_memory_region结构体参数的具体成员来实现的。kvm_userpace_memory_region结构体有5个成员变量,分别为slot、flags、guest_phys_addr、memory_size和userpace_addr,同时这些变量也是内存初始化故障注入工具的故障位置的选项。其中slot为32位无符号整数,意义为slot的id号,在实际的实现中则为memslots[]数组的位置下标;flags为内存块的标志位,目前有两种标志位分别为KVM_MEM_LOG_DIRTY_PAGES表示kvm要跟踪并记录该slot的写入的情况,另外一个标志KVM_MEM_READONLY表示该slot内存区域只读;guest_phys_addr表示该slot在对应虚拟机的物理地址空间的起始地址;memory_size表示该slot的大小,以字节为单位;usersapce_addr表示虚拟机对应的宿主机用户态qemu-kvm进程的虚拟地址空间的起始地址。
虚拟化内存管理故障注入工具的实现:为了获取kvm_userspace_memory_region结构体mem参数的具体信息,首先使用jprobe技术探测目标函数kvm_set_memory_region(),并在内核态输出参数的值的信息。同时使用kprobe探测函数,并在pre_handler回调函数上输出当前全部寄存器的值的信息。通过使用dmesg命令查看系统日志,观察并分析mem参数对应的寄存器。通过分析,最终得出mem参数对应si寄存器。然后在pre_handler回调函数修改寄存器的值,由于mem参数为指针类型,所以获取si寄存器的值并获取内存地址为si寄存器的内存区域的内容。即si寄存器所指向的为kvm_usersoace_memory_region结构体,然后对其成员分别进行修改,内存初始化完成故障注入。
内存初始化故障注入提供三种故障类型选项,分别为随即一位翻转、随机一位置1和随机一位置0。内存初始化故障注入同时也支持瞬时故障和持久故障。在接收故障注入参数的时候,由于输入参数是在用户态下,而实际故障注入则是在内核态下,所以需要创建proc文件并将参数写入到proc文件的方式,且需要使用copy_from_user函数来完成用户态到内核态的转化。表1为内存初始化故障的故障集。
表1
Figure BDA0001983200240000151
Figure BDA0001983200240000161
具体实施方式八:管理层的状态查询故障注入的流程图如图15所示。本实施方式与具体实施方式一不同的是:所述管理层的状态查询故障注入的具体过程为:
步骤G1、在待测目标主机上加载虚拟机状态查询故障注入工具的内核模块,在/etc/profile文件中加入LD_PRELOAD环境变量,指向工具提供的替换脚本为libdetour.so;
步骤G2、创建用户空间lasting_file、msg_file和times_file文件,lasting_file、msg_file和times_file文件用于传递用户态的输入参数;
步骤G3、输入对管理层的状态查询进行故障注入的参数,包括故障位置参数、故障类型参数和故障方式参数;
步骤G4、触发探测函数来判断对管理层的状态查询进行故障注入的结束条件是否满足,若满足,则输出对管理层的状态查询进行故障注入后的结果信息;
若不满足,则按照输入的参数来注入故障,并等待下一次触发探测函数,直至满足对管理层的状态查询进行故障注入的结束条件,再输出对管理层的状态查询进行故障注入后的结果信息;
步骤G5、收集故障注入后的结果信息并统计输出,并输出系统日志信息;
步骤G6、卸载虚拟机状态查询故障注入工具的内核模块,移除LD_PRELOAD环境变量。
通过采用虚拟化管理层的状态查询故障注入工具,能够模拟VMM版本信息查询故障和虚拟机状态查询故障,VMM版本信息查询故障会使得虚拟机在创建过程中查询到错误的版本信息从而影响虚拟机的成功创建,虚拟机状态查询故障会使得查询到错误的虚拟机状态。
状态查询故障注入原理:状态查询故障注入包括VMM版本信息查询故障注入和虚拟机状态查询故障注入。KVM虚拟化机制在创建虚拟机的时候会查询当前的VMM版本信息,VMM版本信息查询故障通过模拟错误的VMM版本信息来观察虚拟机能否成功创建。查询到的虚拟机状态会影响虚拟化管理机制的后续操作。虚拟机状态查询故障注入通过模拟错误的虚拟机状态信息来观察后续的虚拟化管理操作是否会受影响。
在物理机上查询各个虚拟机状态,可以用virsh list–all来获得所以虚拟机的当前状态,而virsh list是通过库函数virDomainGetState来获取的状态参数。所以决定使用库打桩技术,来对状态参数进行修改,以达到无法获取虚拟机正确状态的效果。
状态查询故障注入工具的实现:为了在运行过程中对库函数进行故障注入,同时不需要修改并编译库函数的源代码,选取了运行时打桩技术,拦截替换virDomainGetState,目的是修改第二个参数state,这是一个int类型的指针,记录当前虚拟机的状态,通过动态的修改这个值来控制当前虚拟机的查询状态,以达到虚拟机状态的故障注入。此时要解决的就是参数传递的问题,在这里通过文件系统来传递参数实现通信,工具将需要传递的故障类型,故障次数和虚拟机状态以文件的形式发送到程序替换的函数中。
本故障注入工具能够针对KVM虚拟机访问控制进行故障注入,可以针对虚拟机间内存资源设计相关的故障注入实验,观察目标系统对KVM虚拟化访问控制故障的容错能力。
本发明的上述算例仅为详细地说明本发明的计算模型和计算流程,而并非是对本发明的实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动,这里无法对所有的实施方式予以穷举,凡是属于本发明的技术方案所引伸出的显而易见的变化或变动仍处于本发明的保护范围之列。

Claims (1)

1.一种面向KVM的虚拟化层故障注入方法,其特征在于,所述面向KVM的虚拟化层故障注入包括虚拟化底层故障注入和虚拟化管理层故障注入;
所述虚拟化底层故障注入包括底层的CPU故障注入、底层的内存故障注入和底层的文件系统故障注入;
所述底层的CPU故障注入是通过kprobe技术对目标函数do_fork进行故障注入来实现的;
所述底层的内存故障注入是通过jprobe技术拦截函数copy_page_range来实现的;
所述底层的文件系统故障注入是通过jprobe技术和kprobe技术配合输出的形式来实现的;
所述虚拟化管理层故障注入包括管理层的虚拟机迁移故障注入、管理层的访问控制故障注入、管理层的内存管理故障注入和管理层的状态查询故障注入;
所述管理层的虚拟机迁移故障注入是通过环境变量LD_PRELOAD运行迁移过程提供注入函数来实现的;
所述管理层的访问控制故障注入是通过内存资源负载工具产生大量的内存负载来实现的;
所述管理层的内存管理故障注入是通过jprobe技术和kprobe技术对目标函数kvm_set_memory_region()进行探测来实现的;
所述管理层的状态查询故障注入是通过采用打桩技术,并拦截替换库函数virDomainGetState来实现的;
所述底层的CPU故障注入的具体过程为:
步骤A1、在待测目标主机上加载CPU故障注入工具的内核模块,其中:内核模块内部设置有目标函数do_fork的探针;
步骤A2、创建proc文件,proc文件用于传递用户态的输入参数;
步骤A3、输入对底层的CPU进行故障注入的参数,包括故障位置参数、故障类型参数和故障方式参数;
步骤A4、触发探测函数来判断对底层的CPU进行故障注入的结束条件是否满足;
若满足,则输出对底层的CPU进行故障注入后的结果信息;
若不满足,则按照输入的参数来注入故障,并等待下一次触发探测函数,直至满足对底层的CPU进行故障注入的结束条件,再输出对底层的CPU进行故障注入后的结果信息;
步骤A5、收集故障注入后的结果信息,并统计输出;同时输出系统日志信息;
步骤A6、卸载CPU故障注入工具的内核模块,移除创建的proc文件,并卸载探测函数的kprobe探针;
所述底层的内存故障注入的具体过程为:
步骤B1、在待测目标主机上加载内存故障注入工具的内核模块,其中:内核模块内部设置有copy_page_range函数的探针;
步骤B2、创建proc文件,proc文件用于传递用户态的输入参数;
步骤B3、输入对底层的内存进行故障注入的参数,包括故障位置参数、故障类型参数和故障方式参数;
步骤B4、触发探测函数来判断对底层的内存进行故障注入的结束条件是否满足;
若满足,则输出对底层的内存进行故障注入后的结果信息;
若不满足,则按照输入的参数来注入故障,并等待下一次触发探测函数,直至满足对底层的内存进行故障注入的结束条件,再输出对底层的内存进行故障注入后的结果信息;
步骤B5、收集故障注入后的结果信息,并统计输出;同时输出系统日志信息;
步骤B6、卸载内存故障注入工具的内核模块,移除创建的proc文件,并卸载探测函数的jprobe探针;
所述底层的文件系统故障注入的具体过程为:
步骤C1、在待测目标主机上加载文件系统故障注入工具的内核模块,其中:内核模块内部设置有sys_open、sys_unlink、sys_read和sys_write函数的探针;
步骤C2、创建proc文件,proc文件用于传递用户态的输入参数;
步骤C3、输入对底层的文件系统进行故障注入的参数,包括故障位置参数、故障类型参数和故障方式参数;
步骤C4、触发探测函数来判断对底层的文件系统进行故障注入的结束条件是否满足;
若满足,则输出对底层的文件系统进行故障注入后的结果信息;
若不满足,则按照输入的参数来注入故障,并等待下一次触发探测函数,直至满足对底层的文件系统进行故障注入的结束条件,再输出对底层的文件系统进行故障注入后的结果信息;
步骤C5、故障注入结束后,收集故障注入结果并进行统计输出,同时也输出系统日志信息;
步骤C6、卸载文件系统故障注入工具的内核模块,移除创建的proc文件,并卸载探测函数的jprobe和kprobe探针;
所述管理层的虚拟机迁移故障注入的具体过程为:
步骤D1、通过环境变量LD_PRELOAD加载动态链接库对virDomainSave函数进行替换;
步骤D2、创建信息参数文件,信息参数文件用于传递用户态的输入参数;
步骤D3、输入对管理层的虚拟机迁移进行故障注入的参数,包括故障位置参数、故障类型参数和故障方式参数;
步骤D4、触发探测函数来判断对管理层的虚拟机迁移进行故障注入的结束条件是否满足;
若满足,则输出对管理层的虚拟机迁移进行故障注入后的结果信息;
若不满足,则按照输入的参数来注入故障,并等待下一次触发探测函数,直至满足对管理层的虚拟机迁移进行故障注入的结束条件,再输出对管理层的虚拟机迁移进行故障注入后的结果信息;
步骤D5、收集故障注入后的结果信息,并统计输出;同时输出系统日志信息;
步骤D6、移除环境变量LD_PRELOAD;
所述管理层的访问控制故障注入的具体过程为:
步骤E1、根据当前宿主机的资源情况创建两台虚拟机;
步骤E2、通过SSH远程执行内存负载程序,设置两台虚拟机的内存占用率均为0.9;
步骤E3、判断两台虚拟机的内存是否均达到设置的内存占用率;
若两台虚拟机的内存均达到设置的内存占用率,则收集并显示故障注入后的结果信息;否则增加内存负载,直至两台虚拟机的内存均达到设置的内存占用率时,再收集并显示故障注入后的结果信息;
所述管理层的内存管理故障注入的具体过程为:
步骤F1、在待测目标主机上加载内存管理故障注入工具的内核模块,在内核模块的初始化函数中设置kprobe和jprobe探针并绑定kvm_set_memory_region()函数;
步骤F2、创建proc文件,创建proc文件用来传递用户态参数到内核态参数的转化;
步骤F3、输入对管理层的内存管理进行故障注入的参数,包括故障注入的故障位置参数、故障类型参数和故障方式参数;
步骤F4、触发探测函数来判断对管理层的内存管理进行故障注入的结束条件是否满足;
若满足,则输出对管理层的内存管理进行故障注入后的结果信息;
若不满足,则按照输入的参数来注入故障,并等待下一次触发探测函数,直至满足对管理层的内存管理进行故障注入的结束条件,再输出对管理层的内存管理进行故障注入后的结果信息;
步骤F5、卸载内存管理故障注入工具的内核模块,移除proc文件、kprobe和jprobe探针;
所述管理层的状态查询故障注入的具体过程为:
步骤G1、在待测目标主机上加载虚拟机状态查询故障注入工具的内核模块,在/etc/profile文件中加入LD_PRELOAD环境变量,指向工具提供的替换脚本为libdetour.so;
步骤G2、创建用户空间lasting_file、msg_file和times_file文件,lasting_file、msg_file和times_file文件用于传递用户态的输入参数;
步骤G3、输入对管理层的状态查询进行故障注入的参数,包括故障位置参数、故障类型参数和故障方式参数;
步骤G4、触发探测函数来判断对管理层的状态查询进行故障注入的结束条件是否满足,
若满足,则输出对管理层的状态查询进行故障注入后的结果信息;
若不满足,则按照输入的参数来注入故障,并等待下一次触发探测函数,直至满足对管理层的状态查询进行故障注入的结束条件,再输出对管理层的状态查询进行故障注入后的结果信息;
步骤G5、收集故障注入后的结果信息并统计输出,并输出系统日志信息;
步骤G6、卸载虚拟机状态查询故障注入工具的内核模块,移除LD_PRELOAD环境变量。
CN201910156834.4A 2019-03-01 2019-03-01 一种面向kvm的虚拟化层故障注入方法 Active CN109857522B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910156834.4A CN109857522B (zh) 2019-03-01 2019-03-01 一种面向kvm的虚拟化层故障注入方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910156834.4A CN109857522B (zh) 2019-03-01 2019-03-01 一种面向kvm的虚拟化层故障注入方法

Publications (2)

Publication Number Publication Date
CN109857522A CN109857522A (zh) 2019-06-07
CN109857522B true CN109857522B (zh) 2021-03-02

Family

ID=66899597

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910156834.4A Active CN109857522B (zh) 2019-03-01 2019-03-01 一种面向kvm的虚拟化层故障注入方法

Country Status (1)

Country Link
CN (1) CN109857522B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111966599B (zh) * 2020-08-20 2022-10-18 苏州浪潮智能科技有限公司 一种虚拟化平台可靠性测试方法、系统、终端及存储介质
CN115328814B (zh) * 2022-10-13 2023-04-14 苏州浪潮智能科技有限公司 基于镜像对的故障注入方法、装置、设备和存储介质

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101872323A (zh) * 2009-04-22 2010-10-27 曾凡平 一种基于虚拟机的故障注入测试方法
KR101266359B1 (ko) * 2009-05-08 2013-05-22 한국전자통신연구원 선택적 오류 주입 활성화를 통한 저비용 소프트웨어 신뢰성 시험 방법, 소프트웨어 신뢰성 시험을 지정 대상 모듈로 한정하는 방법, 소프트웨어 신뢰성 시험을 위한 대상 모듈에 부하를 발생시키는 방법 및 이러한 방법들을 사용하여 소프트웨어 신뢰성 시험을 하는 컴퓨팅 장치
CN106326044B (zh) * 2015-06-30 2019-09-03 华为技术有限公司 一种网卡故障注入方法及装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
面向Xen的软件故障注入方法研究与应用;范志凯;《中国优秀硕士学位论文全文数据库信息科技辑》;20170715;第I138-63页 *

Also Published As

Publication number Publication date
CN109857522A (zh) 2019-06-07

Similar Documents

Publication Publication Date Title
US10318322B2 (en) Binary translator with precise exception synchronization mechanism
US10846145B2 (en) Enabling live migration of virtual machines with passthrough PCI devices
Bugnion et al. Bringing virtualization to the x86 architecture with the original vmware workstation
US9875173B2 (en) Time travel debugging in managed runtime
US8438363B1 (en) Optimization of paging cache protection in virtual environment
CN107807839B (zh) 一种修改虚拟机内存数据的方法、装置及电子设备
CN101984409A (zh) 一种用于Linux系统测试代码注入的方法
US20070162475A1 (en) Method and apparatus for hardware-based dynamic escape detection in managed run-time environments
US11645068B2 (en) Method for implementing function jump, apparatus, and computer storage medium
US7506096B1 (en) Memory segment emulation model for virtual machine
US8887139B2 (en) Virtual system and method of analyzing operation of virtual system
US10430221B2 (en) Post-copy virtual machine migration with assigned devices
US11693722B2 (en) Fast memory mapped IO support by register switch
US10268595B1 (en) Emulating page modification logging for a nested hypervisor
CN109857522B (zh) 一种面向kvm的虚拟化层故障注入方法
US10120709B2 (en) Guest initiated atomic instructions for shared memory page host copy on write
Sun et al. Fast live cloning of virtual machine based on xen
Mo et al. Rust-Shyper: A reliable embedded hypervisor supporting VM migration and hypervisor live-update
Campbell et al. An introduction to virtualization
US11900142B2 (en) Improving memory access handling for nested virtual machines
Giles Container-based virtualization for byte-addressable NVM data storage
Sato et al. UML scrapbook and realization of snapshot programming environment
Song et al. Towards Transparent and Seamless {Storage-As-You-Go} with Persistent Memory
Saeki et al. Bash on Ubuntu on macOS
Qiu et al. User-guided Page Merging for Memory Deduplication in Serverless Systems

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant