虚拟化技术详解

看到这篇文章的朋友,大部分应该都用过虚拟化软件,然后才会想知道虚拟化技术的。windows下的常用的虚拟化技术有VmWare,VirtualBox等等,那么这篇文章将会介绍这些技术基本的实现原理,并普及虚拟化相关的术语描述。

目录

虚拟化技术简介

首先,什么是计算机?现在使用的计算机都离不开冯诺依曼体系结构,如图1所示,有输入设备、输出设备、存储器、cpu这就算是完整的计算机硬件环境了(当然还需要网卡、显卡等等)。虚拟化技术就是在一台机器上模拟出独立的cpu、存储器等使得同一台主机能虚拟为多台主机或者多台主机能虚拟为一台主机。本文只讨论第一种,让一台主机能够虚拟多台主机的环境。
虚拟化技术详解
图1 冯诺依曼体系结构

现实生活中有各种各样的虚拟化技术,不同的虚拟化技术面对的应用场景也不一样。你可能用过VmVare或者VirtualBox来完成大学里面linux或者操作系统的学习,目的是为了在电脑上装上不同的操作系统。也有可能你是一名运维人员,你用过阿里云或者腾讯云,那么你作为租户,使用的其实是阿里云提供给你的一台虚拟机,阿里从大量的服务器集群中,分出了一定的cpu、内存等等资源给你,就成了一台完整的虚拟机。
虚拟化使用软件的方法重新定义划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率,使IT资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。

虚拟化分类

在刘鹏的《云计算》书中,把虚拟化分为了两类,一类是建立在宿主机上的,也就是宿主机是有操作系统的,另一类是宿主机没有操作系统的,我们把前者称为寄居虚拟化,后者称为裸机虚拟化。

寄居虚拟化

寄居虚拟化如图2所示,最底层是物理硬件,物理硬件之上是主机的操作系统,操作系统之上是VMM(virtual machine monitor,虚拟机管理层),再往上就是客户的虚拟户了。
虚拟化技术详解
图2 寄居虚拟化

在这种技术里面,虚拟机对各种物理设备(cpu、内存、硬盘等)的调用,都是通过VMM层和宿主机的操作系统一起协调才完成的。VMvare和VirtualBox都是基于这种方式实现的。

裸机虚拟化

裸机虚拟化指的是,直接将VMM安装在硬件设备与物理硬件之间,如图3所示。VMM在这种模式下又叫做Hypervisor,虚拟机有指令要执行时,Hypervisor会接管该指令,模拟相应的操作。
虚拟化技术详解
图3 裸机虚拟化

Hypervisor是一种在虚拟环境中的“元”操作系统。他们可以访问服务器上包括磁盘和内存在内的所有物理设备。Hypervisor不但协调着这些硬件资源的访问,也同时在各个虚拟机之间施加防护。当服务器启动并执行Hypervisor时,它会加载所有虚拟机客户端的操作系统同时会分配给每一台虚拟机适量的内存,CPU,网络和磁盘。

如果要进行虚拟化,必须要给虚拟机一个假的独立的环境,让他误以为自己处在一个独立的环境当中,于是就需要模拟cpu、内存、硬盘、网络等资源,模拟一个独立完整的硬件环境。

cpu虚拟化

cpu虚拟化指的就是把物理的cpu虚拟为多个虚拟cpu,从而实现一个cpu能被多台虚拟机共用,但是却相互隔离的场景。cpu的运转是以时间为单位的,cpu虚拟化要解决的问题主要是隔离和调度问题,隔离指的是让不同的虚拟机之间能够相互独立的执行命令,调度指的是VMM决定cpu当前在哪台虚拟机上执行。
由于x86体系设计的cpu在虚拟化上具有一定的缺陷,所以我们有两种方法来实现cpu的虚拟化。其一是采用完全虚拟化的方式,利用动态指令转换或者硬件辅助来帮助实现cpu的虚拟化;其二是采用半虚拟化得方式,在客户的操作系统内核上进行一定的更改使得操作系统自己明白自己是虚拟机的角色,能够在VMM的管理下尽可能的访问硬件。
如果某些同学对于cpu虚拟化想要有更加深入的了解,可以看一下这些博客:

内存虚拟化

内存提出的原因

首先,内存存在的原因是cpu运转速度极快,超过了磁盘的读取速度,如果cpu直接读取硬盘的话,大部分的时间cpu都在等待。同时,程序访问又拥有局部性原理(80%的访问都在访问数据中20%的数据),于是乎就有牛人想到能不能用一小块儿读取速率快的存储设备来存放经常被读取的数据,这样cpu处理数据的速度就能和存储器读取设备的速度相匹配。系统性能达到最大化。

虚拟内存

虚拟内存是计算机OS经常要讲到的一块儿内容,为什么需要虚拟内存呢?,建议花几分钟时间读下面这篇博客,来帮助你理解我要说的内容。
内存的发展
通过上面这篇文章,你应该已经了解到一个内容,假设我们设定的虚拟内存是4G,虚拟内存就是给系统当中的每一个进程分配4G的虚拟地址,这样每个进程都感觉自己是独立的使用一块儿内存,具有良好的隔离性,同时,每个进程都是从0的虚拟地址开始的,这样就更有助于管理进程。但程序要运行,必须要运行在真实的内存上,所以会建立一种映射机制来帮助实现虚拟地址到物理地址之间的映射。
通过虚拟内存的方式实现了进程之间的地址隔离。

内存的虚拟化

内存的虚拟化指的是把物理内存包装成若干虚拟内存来使用,把物理内存抽象出来,给每一台虚拟机都分配一个连续的内存空间。其具体的实现,可以参照下面的博文。
内存虚拟化的实现

硬盘虚拟化

硬盘虚拟化相对简单一些,拿VMvare来举例,在VMvare当中,会使用物理硬盘上的一个文件来当做虚拟机当中的一个硬盘,如图4所示,虚拟机通过调用相关进程(如VMvare进程)访问相关的宿主机的文件系统,再通过文件系统调用windows内核,再调用驱动,然后在磁盘上进行读写。
虚拟化技术详解
图4 虚拟硬盘读写流程

网络虚拟化

网络虚拟化是让一个物理网络能够支持多个逻辑网络,虚拟化保留了网络设计中原有的层次结构、数据通道和所能提供的服务,使得最终用户的体验和独享物理网络一样,同时网络虚拟化技术还可以高效的利用网络资源如空间、能源、设备容量等。
网络虚拟化的目的,是要节省物理主机的网卡设备资源。从资源这个角度去理解,可能会比较好理解一点。
详情请参见这篇文章:网络虚拟化