基于KVM虚拟机的故障分析和注入

2014-12-25 08:58徐绍飞
电脑知识与技术 2014年33期
关键词:虚拟机故障注入云计算

徐绍飞

摘要:云计算作为未来计算机网络发展的趋势,其可靠性越来越受到重视。Kernel-based virtual machine作为Linux下一种内核虚拟机实现的方式,其故障危害性也越来越受到关注。该文运用源码分析的方式进行虚拟机故障获取分析,通过故障注入进行故障激活,根据KVM虚拟机的响应行为来判断故障对其功能的影响,从而为云计算下KVM虚拟机故障危害性分析提供一定的参考。

关键词:云计算;Linux;KVM;虚拟机;故障注入

中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2014)33-8051-04

Abstract: With the development of computer technology, cloud computing is a new trend of computer network, and the reliability of it is becoming more and more important. As a mean of virtualization in Linux, kernel-based virtual machine plays an important role in cloud computing. This paper uses the approach of source code analysis to acquire the faults in KVM, and it uses fault injection to make the faults activate. Based on the response in KVM, it is possible to determine the effects of the functions in KVM. And it is one way to make the reference of fault criticality analysis of KVM in cloud computing.

Key words: cloud computing;Linux;KVM;virtual machine;fault injection

近年来,云计算这个新的IT概念在全球迅速普及。云计算是由Google提出的崭新的网络应用模式,在诞生之日起便决定它对网络生产、生活可能的革命性影响,也会因此对人的思维方式、判断方式及对世界的看法,产生可能的根本性变化。由于它是多种技术混合演进的结果,其成熟度较高,又有大公司推动,发展极为迅速,产业形态逐步完善,成为IT产业发展的又一大动力和趋势。

虚拟化技术是云计算的关键技术之一。虚拟化技术不仅降低了IT成本,而且还增强了系统安全性和可靠性,虚拟化的概念也逐渐深入到人们日常的工作与生活中。硬件辅助虚拟化技术弥补了软件虚拟机技术性能上的缺陷,使得虚拟机具有接近物理机的性能表现,并促成了kernel-based virtual machine(KVM)等新的虚拟机技术解决方案。

任何计算机系统都有出现故障的时候,可能发生在测试阶段,也可能发生在系统刚刚上线,还可能发生在已经稳定运行很多年的系统上,又可能发生在系统一个小小的升级之后。而这些系统出现故障所带来的负面影响则可大可小,小到一个终端的软件无法使用,大到整个系统瘫痪,所有程序不能运行。确定有哪些系统出现问题,会波及到核心业务的停滞范围,以及理解并确定如何在出现故障的时候按照紧急度权衡,从而避免影响面最大的灾难事件发生。因此,在云计算背景下,分析虚拟机的故障也变得尤其重要。

1 KVM虚拟机分析与故障获取分析及其注入

1.1 KVM结构及原理分析

KVM是Linux下x86 硬件平台上的全功能虚拟化解决方案。KVM 基本结构有两部分组成。KVM基本结构有两部分组成[1]。这两部分一个是KVM Driver ,它已经成为Linux 内核的一个模块,负责虚拟机的创建,虚拟内存的分配,虚拟CPU寄存器的读写以及虚拟CPU的运行等。另外一个是修改过的Qemu,用于模拟PC硬件的用户空间组件,提供I/O设备模型以及访问外设的途径。

KVM的基本结构如图1所示。

KVM虚拟机的基本工作原理是,用户模式的Qemu利用接口libkvm通过ioctl系统调用进入内核模式。KVM Driver为虚拟机创建虚拟内存和虚拟CPU后执行vmlaunch指令进入客户模式,然后装载Guest OS执行。如果Guest OS发生外部中断或者影子页表缺页之类的事件,暂停Guest OS的执行,退出客户模式进行一些必要的处理。然后重新进入客户模式,执行客户代码。如果发生I/O事件或者信号队列中有信号到达,就会进入用户模式处理。

1.2 KVM虚拟机创建和运行的流程

KVM虚拟机创建和运行的大致流程如下[2]:

1) 申明一个kvm_context_t变量,用以描述用户态虚拟机上下文信息。

2) 调用kvm_init()函数,该函数完成虚拟机上下文信息的初始化。

3) 调用函数kvm_create()创建虚拟机实例,该函数通过ioctl系统调用创建虚拟机相关的内核数据结构并且返回文件描述符给用户态kvm_context_t数据结构。

4) 创建内核pit以及mmio等外设模拟设备。

5) 调用kvm_create_vcpu()函数来创建虚拟处理器,该函数通过ioctl系统调用向由vm_fd文件描述符指向的虚拟文件创建虚拟处理器,并将虚拟处理器的文件描述符返回给用户态程序。

6) 用户态的Qemu程序申请客户机用户空间,用以加载和运行客户机代码。

7) 为了使得客户虚拟机正确执行,必须要在内核中为客户机建立正确的内存映射关系,即影子页表信息。调用函数kvm_create_phys_mem()创建客户机内存映射关系,该函数主要通过ioctl系统调用向vm_fd文件描述符指向的虚拟文件建立影子页表信息。

8) 当创建好虚拟处理器和影子页表后,即可读取客户机到指定分配的空间中,然后调度虚拟处理器运行。调用函数kvm_run(),该函数通过ioctl系统调用由虚拟处理器文件描述符指向的虚拟文件来调度虚拟处理器的执行,将虚拟处理器vcpu信息加载到物理处理器中,通过vm_entry执行进入客户机执行。

1.3 KVM故障获取原理

KVM作为Linux中的一个模块,与Linux非常相似,可以分为内核空间和用户空间两部分。内核空间主要负责对虚拟机的实际操作、系统资源的管理等,而用户空间主要用于实现用户所需要的各种功能。内核空间中的相关操作是需要关注的。然而,直接研究KVM内核的故障,数量庞大而且复杂性较高。KVM所有API都以ioctl( )系统调用的形式出现[3]。因此,我们将KVM内核可能存在的故障抽象到KVM的API上,使用KVM的系统调用产生的错误来反映KVM行为上的故障(覆盖率不是100%,约60%)。在KVM开发过程和使用过程中,会遇到很多软件错误。经验丰富的开发人员为这些易出错的代码点增加了保护,即异常处理机制,方式是通过C语言中的判断语句+跳转出错处理。但是,该故障的发生频率可能会降低,但是故障确实存在并且会在一定情况下暴露出来,可能对虚拟机功能产生影响。

1.4 KVM故障获取分析过程

从图6可以看到,虚拟机创建失败,错误信息为KVM_GET_SUPPORTED_CPUID failed: Bad address。结合对所注入的变异体二进制代码分析,在判断完地址的跳转指令JZ变异为NOP,导致存放CPUID的地址指向错误。KVM虚拟机创建时,在创建虚拟机体系结构的信息时,由于用户态无法获取虚拟机所支持的KVM虚拟机CPUID信息,导致虚拟机创建失败。则2.2.2节中的故障得到了激活验证,该故障确实存在,并且会影响到KVM虚拟机创建。

2 结论

第1章中,该文描述了KVM虚拟机工作原理和一种故障获取的方法,并设计了故障注入实验实现了故障的激活验证。通过实验表明,某些故障虽然有相应的异常处理机制,但是仍然会暴露出来,导致KVM虚拟机的核心功能失效,引发故障,这样,就为故障危害性的分析提供了一定的参考依据。

但是,该文仍然存在一些不足和改进之处,例如:

1) 文中故障的获取主要依托于源代码的分析,其实质是对于异常处理机制中的故障分析来获取故障,对于没有设置异常处理机制的故障,可以采用以下方法获取:长期运行收集的实验结果;经验收集;网络数据收集等等,此外,还可以采用大量的故障注入实验来寻找暂时没有异常处理机制的故障。

2) 对于文中所描述的采用二进制代码级的变异所实现的故障注入,只能实现ODC缺陷分类中的部分故障(赋值类故障中的赋值缺失和以表达式为赋值缺失,算法类故障中的缺失了函数调用和部分校验类故障),对于其他类的故障,文中所描述的故障注入系统暂时无法实现。

3) 对于注入故障的激活验证,其进一步工作则是结合风险优先级评估方法,实现对故障危害性的分析与评价,这样,就可以针对高危害性的故障进行相应的容错分析和处理。

参考文献:

[1] 任永杰,单海涛.KVM虚拟化技术:实战与原理解析[M].北京:机械工业出版社,2013:21-43.

[2] 张海峰.KVM虚拟化技术在AMD平台上的实现 [DB/OL]. http://www.ibm.com/developerworks/cn/linux/l-cn-amd-virt/index.html,2012.

[3] KVM API Documentation. The Definitive KVM (Kernel-based Virtual Machine) API Documentation [DB/OL].http://blog.chinaunix.net/uid-26000137-id-3766499.html,2013.

[4] 胡嘉伟.Linux下基于PIN的永久和瞬时故障注入方案及实现[J].电脑知识与技术, 2011,7(1):242-244.

[5] Ang Jin, Jian-hui Jiang. "Fault Injection Scheme for Embedded Systems at Machine Code Level and Verification." [C].15th IEEE Pacific Rim International Symposium on Dependable Computing, 2009:55-62.

猜你喜欢
虚拟机故障注入云计算
模拟训练装备故障注入系统研究
SM4算法前四轮约减轮故障注入分析
采用修改-回放原理的1553B故障注入方法
浅谈计算机系统虚拟化网络设置方案
任务驱动教学法在《网络应用服务管理》教学中的应用
基于云计算的移动学习平台的设计
虚拟机局域网组建技术应用初探
实验云:理论教学与实验教学深度融合的助推器
云计算中的存储虚拟化技术应用
列车MVB总线故障注入研究