【分享】OpenStack设计与实现1——虚拟化

OpenStack设计与实现1——虚拟化

Tips:文章为拜读@xingjiarong 后有感而做的分享,先对作者表示感谢,附原文地址:http://blog.csdn.net/xingjiarong

0. 引论

  • 云计算的一个核心思想就是在服务器端提供集中的物理计算资源,这些计算资源可以被分解成更小的单位去独立地服务于不同的用户,也就是在共享物理资源的同时,为每个用户提供隔离、安全、可信的虚拟工作环境,而这一切不可避免地要依赖于虚拟化技术。

1. 虚拟化技术的概述

  • 虚拟化技术对大家来说都不陌生,比如虚拟内存和虚拟服务器等,为了更好的理解虚拟化我们应该首先来了解一下计算机系统的层次结构。
    【分享】OpenStack设计与实现1——虚拟化

  • 每一层都向上层提供一个抽象,并且每一层只需要知道下层抽象的接口,而并不需要了解其内部运作机制。例如,操作系统看到的是一个硬件抽象层,它并不知道硬件中布线和电器特征。即使硬件层发生变化,只要硬件抽象层不变,那么操作系统层将察觉不到任何的变化。

  • 这种分层有一定的优点。首先,每一层只需要考虑本层的设计以及相邻层间的交互接口,从而大大的降低了系统设计的复杂性,提高了软件的移植性。另外,这样的设计也是给下一层软件模块为上一层软件模块创造“虚拟世界”提供了条件。

  • 所谓的虚拟化就是有位于下层的软件模块,根据上一层软件模块的期待,抽象出一个虚拟的软件或硬件接口,使上一层软件可以直接运行在与自己所期待的运行环境完全一致的虚拟环境上。

  • 虚拟化可以发生在上图中的每一个层次上,硬件的虚拟化,操作系统的虚拟化等等,但是对于IaaS(基础架构即服务)的云计算,更关心的是硬件抽象层上的虚拟化。硬件抽象层上的虚拟化是指通过虚拟硬件抽象层来实现虚拟机,为客户机操作系统呈现出与物理硬件相同或相近的硬件抽象层。
    【分享】OpenStack设计与实现1——虚拟化

  • 如上图所示,系统虚拟化在硬件和操作系统之间引入了一个虚拟化层,虚拟化层提供一个操作系统期望的接口,统一处理操作系统的请求,使得操作系统层感觉不到虚拟化层的存在,任然认为自己在享有整个硬件。每个虚拟计算机系统(虚拟机)都拥有自己的虚拟硬件,并提供一个独立的虚拟运行环境,通过虚拟机监控器(VMM)的模拟,虚拟机中的操作系统认为自己仍然是独占一个系统在运行。

2. 虚拟化实现方式

2.1 按照实现方式分

  • 按照实现方式虚拟化可以分为两种:

    1. VMM直接运行在硬件平台上,控制所有硬件并管理客户操作系统。客户操作系统运行在比VMM更高的级别上,Xen就是采用的这个模型;

    2. VMM运行在一个传统的操作系统里(第一层软件),可以看做是第二层软件,而客户机操作系统则是第三层了。KVM和VirtualBox就是这种实现。
      【分享】OpenStack设计与实现1——虚拟化

2.2 按照VMM所提供的虚拟平台类型分

  • 按照VMM所提供的虚拟平台类型可以分为两类:

    1. 完全虚拟化

    • VMM虚拟的是现实存在的平台,并且在客户机操作系统看来,虚拟平台和现实平台是一样的,客户机操作系统感觉不到运行在一个虚拟平台上,现有的操作系统无需进行任何修改就可以在这样的虚拟平台上运行,因此这种方式被称为完全虚拟化。

    • 完全虚拟化中,VMM需要能够正确处理客户机操作系统所有可能的行为,或者说正确处理所有可能的指令,完全虚拟化经历了两个阶段:软件辅助的完全虚拟化与硬件辅助的完全虚拟化。

    • 在x86虚拟技术的早期,x86体系中没有在硬件层次对虚拟化提供支持,因此完全虚拟只能靠软件来实现,典型的做法就是优先级压缩和二进制代码翻译相结合。

    • 优先级压缩的原理是:将VMM和客户机的优先级放到同一个CPU中来运行,对应于x86架构,通常VMM在ring0,客户机操作系统内核在ring1,客户机操作系统应用程序在ring3。当客户机操作系统内核执行特权指令时,由于处在非特权的ring1,通常会触发异常,VMM截获后就可以进行特权指令的虚拟化。但是x86指令体系结构在设计之初并没有考虑到虚拟化,一小部分特权指令在ring1中没有触发异常,VMM也就不能进行截获进行虚拟化,所以就需要用二进制代码翻译来处理这些不友好的指令。

    • 二进制代码翻译的原理:VMM通常会对操作系统的二进制代码进行扫描,一旦发现虚拟化不友好的指令,就将其替换成支持虚拟化的指令块。

    • Intel的VTx技术是硬件辅助虚拟化的代表。VTx技术在处理器上引入了一个新的执行模式用于运行虚拟机。当虚拟机运行在这个特殊模式中时,他仍然面对一套完整的处理器寄存器和执行环境,只是任何特权操作都会被处理器截获并报告给VMM。VMM本省就运行在正常模式下,在接收到处理器的报告后,通过对目标指令的解码,找到相应的虚拟化模块进行模拟,并把最终的效果反映在特殊的环境中。

    1. 类虚拟化

    • 类虚拟化虚拟出的平台在现实中是不存在的,而是经过VMM重新定义的。这样的虚拟平台需要对所运行的客户机操作系统进行或多或少的修改使之能够适应虚拟环境,客户机操作系统也就知道自己运行在虚拟平台上,并且会主动去适应。

    • 类虚拟化是通过在源代码级别修改指令以回避虚拟漏洞的方式来使VMM能够对物理资源实现虚拟化。对于x86中难以虚拟化的指令,类虚拟化采取的方式是修改操作系统内核代码,使得操作系统内核完全避免这些难以虚拟化的指令。

3. 虚拟机动态迁移

  • 动态迁移是虚拟化特有的新特性,它将虚拟机从一个物理机快速迁移到另一个物理机,但是虚拟机里面的程序和网络都保持连接。从用户的角度来看,动态迁移对虚拟机的可用性没有任何影响,用户不会察觉任何的服务被中断。

  • 动态迁移实现的方法是在目的服务器上建立一台同样配置的新虚拟机,然后不断地在两个虚拟机之间同步各种内部状态,比如内存、外设、CPU等。等状态同步完成后,关掉老的虚拟机,启动新的虚拟机。

相关推荐