linux虚拟化简介

为跨平台而生

  在计算机发展的早期,各类计算平台、计算设备所提供的接口、调用方式纷繁复杂,没有像今天这样相对统一的标准。由于需要适配不同的平台,需要写很多繁琐的兼容代码,这无形中给开发者带来了很大的不便。甚至,这种混乱出现在 IBM 这一家公司下不同机型的机器上,所以 IBM 的工程师们创造了虚拟化技术,用来帮助程序快速适配不同平台的物理机器。

  我们知道程序对计算机资源的调用主要依赖于操作系统所给出的接口。我们的程序通过操作系统提供的接口,向物理硬件发送指令。

  所以,要实现程序跨平台兼容的方法其实很简单,只要操作系统或者物理硬件所提供的接口调用方式一致,程序便不需要兼容不同硬件平台的接口,而只需要针对这一套统一的接口开发即可。虚拟化技术正是通过其本身适配不同平台的硬件,而加以抽象成统一的接口,来实现程序跨平台运行这一目的的。

  时至今日,我们之所以关注和使用虚拟化技术,实现跨平台运行应用程序依然是很大一部分的原因。

虚拟化的定义

  虚拟化技术是一种将计算机物理资源进行抽象、转换为虚拟的计算机资源提供给程序使用的技术。这里所指的计算机资源,就包括了 CPU 提供的运算控制资源,硬盘提供的数据存储资源,网卡提供的网络传输资源等。

将虚拟化用于资源管理

  在虚拟化技术的发展过程中,人们逐渐发现了虚拟化的另一大用途,也就是将之应用于计算机资源的管理。

  将虚拟化用于资源管理不难理解,因为虚拟化技术本身就是抽象计算机的物理资源进而加工成为提供统一调用接口的虚拟资源,很显然在我们虚拟化硬件资源的时候很容易在其中做一些‘手脚’,来告诉应用程序一些虚假的资源数据。例如,我们只要告诉程序计算机只有 4GB 内存,那么不管真实的物理机是 8GB、16GB 还是 32GB,应用程序都会按照 4GB 这个虚假的值来处理它的逻辑。

  通过虚拟化技术来管理计算机资源的方式,不但让我们对计算机资源的控制变得更加灵活,也大幅提高了计算机资源的使用率。注意这里提高的是资源的使用率而不是效率。

  其实将虚拟化用于资源管理还有很多优势,例如我们想要在同一台机器上运行nginx和tomcat,很显然这两个应用程序都需要监听80端口,如果不使用虚拟化,很显然一台物理机无法同时提供两个80端口。再比如同一台机器上运行的多个应用程序需要使用同一个工具库的不同版本,程序本身限制了同时开启的进程数等,这些都是物理机无法同时提供的资源。然而,虚拟化技术通过资源隔离的方式,无形地把这些程序隔离在不同的虚拟环境中,既然虚拟环境不同,自然运行在不同环境中的程序就不会互相干扰或争抢资源了。

虚拟化的分类

  从虚拟化实现的角度可以大致将虚拟化分为硬件虚拟化和软件虚拟化,从架构角度又可以将虚拟化分为裸金属架构和寄居架构,分类的方式多种多样,在这篇文章中我们主要介绍硬件虚拟化、软件虚拟化、裸金属架构虚拟化和寄居架构的虚拟化。

  硬件虚拟化是指物理硬件本身提供虚拟化的支持,举个例子来说,某个平台的CPU可以将另外一个平台的指令转换成自己平台的指令并执行,且给应用程序一种完全运行在那个平台上的感觉;再如,CPU 能够自身模拟裂变,让程序或者操作系统认为存在多个 CPU,进而能够同时运行多个程序或者操作系统。

  软件虚拟化顾名思义是通过软件的方式将硬件资源虚拟化成虚拟的资源,其本质是通过一层夹在应用程序和硬件平台之间的软件层来实现指令的转换。依然用 CPU 的例子来说,在软件虚拟化实现中,通过一层夹杂在应用程序和硬件平台上的虚拟化实现软件来进行指令的转换。也就是说,虽然应用程序向操作系统或者物理硬件发出的指令不是当前硬件平台所支持的指令,这个实现虚拟化的软件也会将之转换为当前硬件平台所能识别的。

虚拟机

  在虚拟化的实现中,我们不得不提的就是虚拟机,所谓虚拟机就是通过在应用程序和操作系统之间(寄居架构)或者操作系统与硬件资源之间(裸金属架构)增加了一层用于指令转换的虚拟机监视器以此来实现虚拟化,我们通常称虚拟机监视器为Hypervisor。

  从我们习惯用来搭建虚拟操作系统环境的 VMware Workstation、Xen 等软件,到 Java 虚拟机 JVM,PHP 虚拟机 HHVM 等等,虚拟机都活跃在我们程序开发到程序运行的过程中。大家会很惊奇的发现原来 JVM、HHVM 等特定语言运行环境中的核心部分,也是虚拟化的一种实实在在的实现。没错,只要大家仔细分析和思考一下就会发现,它们正是基于虚拟化的思想来实现的。它们通过隔离程序和操作系统,将程序的指令转换为当前所在操作系统平台所能执行的指令,达到了不用对程序进行任何修改即可执行的目的。也正是这个原因,这些语言的程序都具有非常强的跨平台性。

  虚拟机看似实现了虚拟化,可以是的应用程序跨平台运行,那么虚拟机有什么缺点吗?

  很显然虚拟机在运行应用程序的时候都需要经过虚拟机监视器处理才能执行,这无疑会带来效率问题,了解决这个问题,真实的虚拟机程序常常不完全遵循 Hypervisor 的设计结构,而是引入一些其他技术来解决效率问题。

  例如,在 VMware Workstation、Xen 中我们能够看到硬件辅助虚拟化的使用,通过让指令直达支持虚拟化的硬件,以此避开了效率低下的 Hypervisor。而如 JRE、HPHP 中,除了基于 Hypervisor 实现的解释执行机制外,还有即时编译 ( Just In Time ) 运行机制,让程序代码在运行前编译成符合当前硬件平台的机器码,这种方式就已经不属于虚拟化的范畴了。

关于容器

  容器是我们真正要学习的内容,虚拟化只是基础,关于容器,我将在以后的文章中重点介绍。

猜你喜欢

转载自www.cnblogs.com/limaomao/p/11582045.html