前面咱比较全面的介绍了云计算,趁热打铁,咱们索性把云计算的基础技术 —“虚拟化”展开来聊一下,以便各位小伙伴对云计算有更为完整的认识。
1. 概述
我们常说云计算是一种按使用量付费的模式,这种模式能够快速的提供可用的、便捷的、按需的网络访问,进入可配置的资源共享池(包括计算、网络、存储、应用和服务),并,用户只需投入很少的管理工作。云计算是将 IT 资源作为一种服务的业务模式,是产业形态,它不是一种具体的技术,云计算通常通过互联网来提供动态易扩展且经常是虚拟化的资源,旨在降低 IT 成本并帮助用户专注于他们的核心业务,而不是让 IT 成为他们的阻碍。
“虚拟化”可以被认为是云计算主要的支撑技术之一。虚拟化将应用程序和数据在不同层次以不同的面貌展现,让用户能够更加便捷的使用、开发及维护这些应用程序及数据。虚拟化不但允许 IT 部门添加、减少移动硬件和软件到它们想要的地方。虚拟化还为组织带来灵活性,从而改善 IT 运维和减少成本支出。
需要注意的是,云计算和虚拟化虽然是密切相关的,但是虚拟化对于云计算来说并不是必须的。云计算将各种 IT 资源以服务的方式通过互联网交付给用户,然而虚拟化本身并不能给用户提供服务。二者可以通过优势互补为用户提供更优质的服务。云计算方案使用虚拟化技术使整个 IT 基础设施的资源部署更灵活。反过来,虚拟化方案也可以引入云计算的理念,为用户提供按需使用的资源和服务。
2. 虚拟化综述
2.1 为什么需要虚拟化
传统 x86 服务器的构架是在每台物理服务器上通过唯一的操作系统(例如 Windows, Linux etc.)进行管理,大多数情况下每个操作系统仅有一个负载。而且,也很难在服务器上运行多个主应用程序,否则可能会产生冲突和性能问题。
这么做会导致服务器资源在大部分时间内的利用率很低。正如前面所讨论的,物理机的大部分性能都被浪费,我们必须在浪费硬件资源和降低运行风险之间寻找平衡。随着业务的增长,随之而来的成本压力也变化,相关管理效率也会变低,需消耗的资源也会变大。
2.2 什么是虚拟化
早期虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统中,并在 70 年代的 System 370 系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器(Virtual Machine Monitor,VMM)的程序在物理硬件之上生成许多可以运行独立操作系统软件的虚拟机(Virtual Machine)实例。随着近年多核系统、集群、网格以及云计算的广泛部署,虚拟化技术在商业应用上的优势日益体现,不仅降低了 IT 成本,而且还增强了系统安全性和可靠性,虚拟化的概念也逐渐深入到人们日常的工作与生活中。
虚拟化是一个广义的术语,对于不同的人来说可能意味着不同的东西,这要取决他们所处的环境。在 IT 领域中,虚拟化代表着对计算资源的抽象,而不仅仅局限于虚拟机的概念。例如对物理内存的抽象,产生了虚拟内存技术,使得应用程序认为其自身拥有连续可用的地址空间(Address Space),而实际上,应用程序的代码和数据可能是被分隔成多个碎片页或段),甚至被交换到磁盘、闪存等外部存储器上,即使物理内存不足,应用程序也能顺利执行。
这里,虚拟化 Virtualization 定义包括两层含义:
(1)虚拟化是 IT 资源的逻辑表示,其不受物理限制的约束;
(2)虚拟化技术通过在软件系统中加入虚拟化层,将下层的资源抽象成另一种形式的资源,供给上层应用。
咱们还是通过示意图来理解:
虚拟化的重要目标之一就是提高管理效率,从而降低成本、提高硬件使用率,把管理变得更加轻松。虚拟化的主攻方向集中在控制实体服务器的配置数量,并将物理机上的操作系统及应用程序,无缝转移至虚拟机上,以便集中管理这些不同平台的虚拟环境。
2.3 虚拟化的基本原理
判定一个计算机系统能否被虚拟化,或者说一个能够被称为 VMM 的控制程序,需要满足一下条件:
(1)资源控制:控制程序必须能够管理所有的系统资源。
(2)等价性:在控制程序管理下运行的程序(包括操作系统),除时序和资源可用性之外的行为,应该与没有控制程序时完全一致,且预先编写的特权指令可以自由地执行。
(3)效率性:绝大多数的客户机指令应该由主机硬件直接执行而无需控制程序参与。
由于传统的 x86 体系结构缺乏必要的硬件支持,任何控制程序都无法直接满足上述条件,所以 x86 不是一个可虚拟化架构,但是我们可以使用软件实现的方式构造 VMM。
经典的 CPU 虚拟化方法主要使用“特权解除”(Privilege deprivileging) 和“陷入-模拟”(Trap-and-Emulation) 的方式。即:将 Guest OS 运行在非特权级(特权解除),而将 VMM 运行于最高特权级(完全控制系统资源)。解除了 Guest OS 的特权后,Guest OS 的大部分指令仍可以在硬件上直接运行,只有当执行到特权指令时,才会陷入到 VMM 模拟执行(陷入-模拟)。下面我们更为详细的解释一下这种机制
我们知道虚拟机是对真实计算环境的抽象和模拟,VMM 需要为每个虚拟机分配一套数据结构来管理它们状态,包括虚拟处理器的全套寄存器,物理内存的使用情况,虚拟设备的状态等等。
VMM 调度虚拟机时,将其部分状态恢复到主机系统中。并非所有的状态都需要恢复,例如主机 CR3 寄存器(Control Rigister 控制寄存器,包括 CR0-CR3)中存放的是 VMM 设置的页表物理地址,而不是 Guest OS 设置的值。主机处理器直接运行 Guest OS 的机器指令,由于 Guest OS 运行在低特权级别,当访问主机系统的特权状态(如写 GDT 寄存器)时,权限不足导致主机处理器产生异常,将运行权自动交还给 VMM。此外,外部中断的到来也会导致 VMM 的运行。VMM 可能需要先将 该虚拟机的当前状态写回到状态数据结构中,分析虚拟机被挂起的原因,然后代表 Guest OS 执行相应的特权操作。
最简单的情况,如 Guest OS 对 CR3 寄存器的修改,只需要更新虚拟机的状态数据结构即可。一般而言,大部分情况下,VMM 需要经过复杂的流程才能完成原本简单的操作。最后 VMM 将运行权还给 Guest OS,Guest OS 从上次被中断的地方继续执行,或处理 VMM “塞”入的虚拟中断和异常。这种经典的虚拟机运行方式就是 Trap-And-Emulate,虚拟机对于 Guest OS 完全透明,Guest OS 不需要任何修改,但是 VMM 的设计会比较复杂,系统整体性能受到明显的损害。
3. 虚拟化的基本特征
我们一般认为虚拟化包括四方面的基本特征:
(1)分区:即在单一物理机上同时运行多个虚拟机。
分区意味着虚拟化层拥有为多个虚拟机划分服务器资源的能力;每个虚拟机可以同时运行一个单独的操作系统(相同或不同的操作系统),使得用户能够在一台服务器上运行多个应用程序;每个操作系统只能看到虚拟化层为其提供的“虚拟硬件”(虚拟网卡、CPU、内存等),使它认为运行在自己的专用服务器上。
(2)隔离:在同一物理机上的虚拟机之间是相互隔离的。
这意味着一个虚拟机的崩溃或故障(例如,操作系统故障、应用程序崩溃、驱动程序故障,等等)不会影响同一物理机上的其它虚拟机;
一个虚拟机中的病毒、蠕虫等与其它虚拟机相隔离,就像每个虚拟机都位于单独的物理机上一样;
不但可以进行资源控制以提供性能隔离,可以为每个虚拟机指定最小和最大资源使用量,以确保某个虚拟机不会占用所有资源而使得同一系统中的其它虚拟机无资源可用;
还可以在单一机器上同时运行多个负载/应用程序/操作系统,而不会出现前面提到的,由于传统 x86 服务器体系结构的局限性所导致的那些问题(应用程序冲突、DLL 冲突等)。
(3)封装:整个虚拟机都保存在文件中,可以通过移动文件的方式来迁移该虚拟机。
也就是说整个虚拟机(包括硬件配置、BIOS 配置、内存状态、磁盘状态、CPU 状态)都储存在独立于物理硬件的一组文件中。这样,使用者只需复制几个文件就可以随时随地根据需要复制、保存和移动虚拟机。
(4)相对于硬件独立:无需修改就可以在任何服务器上运行虚拟机。
因为虚拟机运行在虚拟化层之上,所以操作系统只能看到虚拟化层提供的虚拟硬件;而且这些虚拟硬件也同样不必考虑物理服务器的情况;这样,虚拟机就可以在任何 x86 服务器(IBM、Dell、HP 等)上运行而无需进行任何修改。这打破了操作系统和硬件以及应用程序和操作系统/硬件之间的约束,也就是实现了解耦。