当前位置:   article > 正文

虚拟化技术知识总结_虚拟化技术总结

虚拟化技术总结

一、概览

虚拟化是云计算系统中的一种基础技术,当前基本所有云计算服务都是构建在虚拟化所构造虚拟层基础上的。虚拟层将底层的传统硬件进行了整合甚至屏蔽,使上层的应用可透明的以为自己就是泡在真实的物理环境中,极大得提高了资源利用率和集成率,提升了管理效率和其他扩展的可能。虚拟化对底层资源的池化,应用相关人员可不再关注底层的硬件,可按需从池中消费资源,在计算机系统中,从底层至高层依次可分为:硬件层、操作系统层、函数库层、应用程序层,在对某层实施虚拟化时,该层和上一层之间的接口并不发生变化,而只变化该层的实现方式。从它的上层使用者vm的角度来看,虚拟化可发生在上述四层中的任一层。常见包括了:计算虚拟化,存储虚拟化,网络虚拟化,图形虚拟化等。

本文将整理介绍相关的虚拟化技术以及应用广泛的常见典型虚拟化方案的具体实现。

二、虚拟化分类

虚拟化技术早期是通过完全透过软件来模拟硬件的全虚拟化(Full virtualization),演进到后来修改客户系统(Guest OS)核心的方式,简化了CPU 与外围设备操作指令转译的复杂度,以提升虚拟系统的效能的半虚拟化(Paravirtualization),到目前Linux核心支持的原生虚拟化技术(Linux Kernel-base Virtual Machine,简称Linux KVM),在整个虚拟化技术发展的过程中,都在努力尝试利用各种方式来减轻软件虚拟化的程度,随着后期硬件(CPU)技术提升可以直接支持虚拟化,配合Linux核心直接内建的虚拟化模块,并透过Hypervisor的管理程序,让虚拟化技术可以裸机架构(Bare-Metal)的模式来运作,基于CPU 与系统核心皆支持虚拟化,虚拟系统的核心命令得以直接透传到实体计算机的 CPU,以模块化的方式来执行核心指令,从而大大提升运作效能。

2.1 按资源抽象层次分

2.1.1 硬件抽象层上的虚拟化

硬件抽象层上的虚拟化是指通过虚拟硬件抽象层来实现虚拟机,为客户机操作系统呈现和物理硬件相同或相近的硬件抽象层,又称为指令集级虚拟化,实现在此层的虚拟化粒度是最小的。

实现在此层的虚拟化技术可以对整个计算机系统进行虚拟,即可将一台物理计算机系统虚拟化为一台或多台虚拟计算机系统,故又可称作系统级虚拟化。每个虚拟计算机系统(简称为虚拟机)都拥有自己的虚拟硬件(如CPU、内存和设备等),来提供一个独立的虚拟机执行环境。每个虚拟机中的操作系统可以完全不同,并且它们的执行环境是完全独立的。由于客户机操作系统所能看到的是硬件抽象层,因此,客户机操作系统的行为和在物理平台上没有什么区别。

2.1.2 操作系统层上的虚拟化

操作系统层上的虚拟化是指操作系统内核可以提供多个互相隔离的用户态实例。这些用户态实例(经常被称为容器)对于它的用户来说就像是一台真实的计算机,有自己独立的文件系统、网络、系统设置和库函数等。

由于这是操作系统内核主动提供的虚拟化,因此操作系统层上的虚拟化通常非常高效,它的虚拟化资源和性能开销非常小,也不需要有硬件的特殊支持。但它的灵活性相对较小,每个容器中的操作系统通常必须是同一种操作系统。另外,操作系统层上的虚拟化虽然为用户态实例间提供了比较强的隔离性,但其粒度是比较粗的。

2.1.3 库函数层上的虚拟化

操作系统通常会通过应用级的库函数提供给应用程序一组服务,例如文件操作服务、时间操作服务等。这些库函数可以隐藏操作系统内部的一些细节,使得应用程序编程更为简单。不同的操作系统库函数有着不同的服务接口,例如Linux的服务接口是不同于Windows的。库函数层上的虚拟化就是通过虚拟化操作系统的应用级库函数的服务接口,使得应用程序不需要修改,就可以在不同的操作系统中无缝运行,从而提高系统间的互操作性。

例如,Wine就是在Linux上模拟了Windows的库函数接口,使得一个Windows应用程序能够在Linux上正常运行。

2.1.4 编程语言层上的虚拟化

另一大类编程语言层上的虚拟机称为语言级虚拟机,例如JVM(Java Virtual Machine)和微软的CLR(Common Language Runtime)和Python的workon。这一类虚拟机运行的是进程级的作业,所不同的是这些程序所针对的不是一个硬件上存在的体系结构,而是一个虚拟体系结构。这些程序的代码首先被编译为针对其虚拟体系结构的中间代码,再由虚拟机的运行时支持系统翻译为硬件的机器语言进行执行。

2.2 按照实现方法分类

2.2.1、仿真(Emulation)

将OS的指令都采用模拟来实现,就是取一条指令,就模拟出这条指令执行的效果。这种方法称作仿真。

仿真是最复杂的虚拟化实现技术,使用仿真方法,可以在一个x86处理器上运行为PowerPC设计的操作系统,这在其它的虚拟化方案中是无法实现的。甚至可以运行多个虚拟机,每个虚拟机仿真一个不同的处理器。此外,这种方法不需要对宿主操作系统的特殊支持,虚拟机可以完全作为应用层程序运行。

但是,使用仿真方法的一个明显缺点就是速度会非常慢。由于每条指令都必须在底层硬件上进行仿真,因此速度减慢100倍的情况也并不稀奇。若要实现高度保真的仿真,包括周期精度、CPU的缓存行为等,实际速度差距甚至可能会达到1000倍之多。使用这种方式的典型实现是Bochs。使用Bochs,开发人员可以知道被执行程序在仿真硬件环境中的具体状态和精确时序,而非真实要去实际硬件系统执行。Bochs 仿真了x86 的硬件环境及其外围设备,它采用C++语言开发,该系统被设计成能够在IntelX86、ppc、Alpha、Sun和MIPS硬件平台。无论运行的主机采用的是何种硬件平台,Bochs都能使用IntelX86CPU的微机硬件平台,因此很容易被移植到很多操作系统上或者不同体系结构的平台上。对这个有兴趣的可以深入去研究下。软件下载

2.2.2、类/半虚拟化(Para-Virtualization)

这类虚拟化需要对所运行的GuestOS进行或多或少的修改使之适应虚拟环境,因此客户机操作系统知道其运行在虚拟平台上,并且会去主动适应。这种方式被称为类虚拟化,有时也称作半虚拟化。另外,值得指出的是,一个VMM(Hypervisor)可以既提供完全虚拟化的虚拟平台,又提供类虚拟化的虚拟平台。

在这里插入图片描述

类虚拟化是通过在源代码级别修改指令以回避虚拟化漏洞的方式来使VMM 能够对物理资源实现虚拟化。上面谈到x86 存在一些难以虚拟化的指令,完全虚拟化通过Binary Translation在二进制代码级别上来避免虚拟化漏洞。类虚拟化采取的是另一种思路,即修改操作系统内核的代码,使得操作系统内核完全避免这些难以虚拟化的指令。

既然内核代码已经需要修改,类虚拟化进一步可以被用于优化I/O。也就是说,类虚拟化不是去模拟真实世界中的设备,因为太多的寄存器模拟会降低性能.相反,类虚拟化可以自定义出高度优化的协议I/O。这种I/O协议完全基于事务,可以达到近似物理机的速度。

这种虚拟技术以Xen为代表,微软的Hyper-V所采用技术和Xen类似,也可以把Hyper-V归属于半虚拟化。Xen实际支持半虚拟化和完全虚拟化。它可在不支持VT技术的cpu上使用,以半虚拟化模式运行。这也是为什么XEN只支持Linux的虚拟化,不能虚拟化Windows的原因(微软不开源)。

2.2.3、完全虚拟化(Full Virtualization)

完全虚拟化经历了两个阶段:软件辅助的完全虚拟化和硬件辅助的完全虚拟化。通常我们说的完全虚拟化技术实际指硬件辅助虚拟化技术,最初所使用的虚拟化技术就是全虚拟化(Full Virtualization)技术,它在虚拟机(VM)和硬件之间加了一个软件层:Hypervisor(早期计算机界,操作系统被称为Supervisor,而能够在它之上运行的操作系统被称为 Hypervisor),或者叫做虚拟机管理程序(VMM)。hypervisor 可以划分为两大类。首先是类型 1,这种 hypervisor 是直接运行在物理硬件之上的。其次是类型 2,这种 hypervisor 运行在另一个操作系统(运行在物理硬件之上)中。类型 1 hypervisor 的一个例子是基于内核的虚拟机(KVM —— 它本身是一个基于操作系统的 hypervisor)。类型 2 hypervisor 包括 QEMU 和 WINE。
在这里插入图片描述
在GuestOS看来,完全虚拟化的虚拟平台和现实平台是一样的,客户机操作系统察觉不到是运行在一个虚拟平台上,这样的虚拟平台可以运行现有的操作系统,无须对操作系统进行任何修改,因此这种方式被称为完全虚拟化。

①软件实现的完全虚拟化:

在x86虚拟化技术的早期,没有在硬件层次上对虚拟化提供支持,因此完全虚拟化只能通过软件实现。一个典型的做法是二进制代码翻译(Binary Translation)。

二进制代码翻译的思想是,通过扫描并修改客户机的二进制代码,将难以虚拟化的指令转化为支持虚拟化的指令。VMM通常会对操作系统的二进制代码进行扫描,一旦发现需要处理的指令,就将其翻译成为支持虚拟化的指令块(Cache Block)。这些指令块可以与VMM合作访问受限的虚拟资源,或者显式地触发异常让VMM进一步处理。

这种技术虽然能够实现完全虚拟化,但很难在架构上保证其完整性。随着技术发展,x86厂商在硬件上加入了对虚拟化的支持,从而在硬件架构上实现了虚拟化。

②硬件辅助完全虚拟化:

底层硬件本身加入虚拟化功能,可以截获操作系统对敏感指令的执行或者对敏感资源的访问,从而通过异常的方式报告给VMM,这样就解决了虚拟化的问题。硬件虚拟化是一种完备的虚拟化方法,因而内存和外设的访问本身也是由指令来承载,对处理器指令级别的截获就意味着VMM可以模拟一个与真实主机完全一样的环境。

Intel的VT-x和AMD的AMD-V是主流的硬件虚拟化技术的代表。以VT-x为例,其在处理器上引入了一个新的执行模式用于运行虚拟机,当虚拟机执行在这个特殊模式中时,它仍然面对的是一套完整的处理器寄存器集合和执行环境,只是任何敏感操作都会被处理器截获并报告给VMM。

在当前的系统级虚拟化解决方案中,全虚拟化应用得非常普遍,典型的有知名的产品有VirtualBox、KVM、VMware Workstation和VMware ESX(4.0版,被改名为VMware vSphere)、Xen(也支持全虚拟化)。

2.3 按实现结构分类

当前主流的虚拟化技术按照实现结构分为如下三类:

1)Hypervisor模型

在Hypervisor模型中,VMM本身就可被看做是一个完备的操作系统,不过和传统操作系统不同的是,VMM是为虚拟化而设计的,因此还具备虚拟化功能。从架构上来看,首先,所有的物理资源如处理器、内存和I/O设备等都归VMM所有,因此,VMM承担着管理物理资源的责任;其次,VMM需要向上提供虚拟机用于运行客户机操作系统,因此,VMM还负责虚拟环境的创建和管理。

由于VMM同时具备物理资源的管理功能和虚拟化功能,因此,物理资源虚拟化的效率会更高一些。在安全方面,虚拟机的安全只依赖于VMM的安全。Hypervisor模型在拥有虚拟化高效率的同时也有其缺点。由于VMM完全拥有物理资源,因此,VMM需要进行物理资源的管理,包括设备的驱动。我们知道,设备驱动开发的工作量是很大的。因此,对于Hypervisor模型来说这是个很大的挑战。事实上,在实际的产品中,基于Hypervisor模型的VMM通常会根据产品定位,有选择地挑选一些I/O设备来支持,而不是支持所有的I/O设备。采用这种模型的典型是面向企业级应用的VMware vSphere(现在又叫VMware-VMvisor)。

2)宿主模型

与Hypervisor模型不同。在宿主模型中,物理资源由宿主机操作系统管理。宿主机操作系统是传统操作系统,如Windows 、Linux等,这些是传统操作系统并不是为虚拟化而设计的,因此本身并不具备虚拟化功能实际的虚拟化功能由VMM来提供。VMM通常是宿主机操作系统独立的内核模块,有些实现中还包括用户态进程,如负责I/O虚拟化的用户态设备模型。 VMM通过调用宿主机操作系统的服务来获得资源, 实现处理器、内存和I/O设备的虚拟化。VMM创建出虚拟机之后,通常将虚拟机作为宿主机操作系统的一个进程参与调度。

宿主模型的优缺点和Hypervisor模型恰好相反。宿主模型最大的优点是可以充分利用现有操作系统的设备驱动程序VMM无须为各类I/O设备重新实现驱动程序,可以专注于物理资源的虚拟化。考虑到I/O设备种类繁多,千变万化, 设备驱动程序开发的工作量非常大,因此,这个优点意义重大。此外,宿主模型也可以利用宿主机操作系统的其他功能,例如调度和电源管理等,这些都不需要VMM重新实现就可以直接使用。

宿主模型的缺点是,由于物理资源由宿主机操作系统控制,VMM得要调用宿主机操作系统的服务来获取资源进行虚拟化,而那些系统服务在设计开发之初并没有考虑虚拟化的支持,因此,VMM虚拟化的效率和功能会受到一定影响。此外,在安全方面,由于VMM是宿主机操作系统内核的一部分,因此,如果宿主机操作系统内核是不安全的,那么,VMM也是不安全的,相应地运行在虚拟机之上的客户机操作系统也是不安全的。换言之,虚拟机的安全不仅依赖于VMM的安全,也依赖于宿主机操作系统的安全。

采用这种模型的典型是KVM、VirtualBox和VMware Workstation。

另外,还有一种操作系统虚拟化,这种类型中每个vm就是宿主OS中的一个进程,所有vm共享唯一的系统内核,不虚拟任何硬件设备。通过使用宿主操作系统提供的功能,多个虚拟环境之间可以相互隔离。通常所说的容器(Container)技术,如Docker。此外,在不同的场景中,隔离出的虚拟环境也被称作虚拟环境(即VE,Virtual Environment)或虚拟专用服务器(即VPS,Virtual Private Server)。

以容器技术为例,它有自己独特的优点,它的出现,一方

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/75835
推荐阅读
相关标签
  

闽ICP备14008679号