# 虚拟化简介


# 虚拟化简介

## 什么是虚拟化?
 
![computer system layer](/images/computer.jpg)   


虚拟化（Virtualization）技术最早出现在 20 世纪 60 年代的 IBM 大型机系统，在70年代的 System 370 系列中逐渐流行起来，这些机器通过一种叫虚拟机监控器（Virtual Machine Monitor，VMM）的程序在物理硬件之上生成许多可以运行独立操作系统软件的虚拟机（Virtual Machine）实例。随着近年多核系统、集群、网格甚至云计算的广泛部署，虚拟化技术在商业应用上的优势日益体现，不仅降低了 IT 成本，而且还增强了系统安全性和可靠性，虚拟化的概念也逐渐深入到人们日常的工作与生活中。

计算机的系统结构如上图所示，在硬件层和操作系统层之间，我们有一个硬件抽象层，他是操作系统实际交互的系统层。利用这个交互层，我们就可以通过软件，模拟返回上层需要的数据，达到虚拟化的目的。

## 虚拟化的实现方式  
虚拟化有两种实现方式,一种是直接运行在硬件平台上，通知所有的硬件并管理客户系统，比如:Xen，一种是运行在传统的操作系统中，类似于在软件层面中提供虚拟环境，比如KVM和VirtualBox

![hypertype](/images/hypertype.jpg)   

## 虚拟化的平台类型 

### 全虚拟化 

全虚拟化是指虚拟机模拟了完整的底层硬件，包括处理器、物理内存、时钟、外设等，使得为原始硬件设计的操作系统或其它系统软件完全不做任何修改就可以在虚拟机中运行。操作系统与真实硬件之间的交互可以看成是通过一个预先规定的硬件接口进行的。全虚拟化 VMM 以完整模拟硬件的方式提供全部接口（同时还必须模拟特权指令的执行过程）。这种模式下Guest OS 一般会降级运行(ring1)，当Guest OS需要执行特权指令时，会触发异常，被VMM捕获(ring0)并执行。使用全虚拟化的VMM有:Microsoft Virtual PC、VMware Workstation、Sun Virtual Box、Parallels Desktop for Mac

### 超虚拟化

这是一种修改 Guest OS 部分访问特权状态的代码以便直接与 VMM 交互的技术。在超虚拟化虚拟机中，部分硬件接口以软件的形式提供给客户机操作系统，这可以通过 Hypercall（VMM 提供给 Guest OS 的直接调用，与系统调用类似）的方式来提供，比较著名的 VMM 有 Denali、Xen。

### 硬件辅助虚拟化

硬件辅助虚拟化是指借助硬件（主要是主机处理器）的支持来实现高效的全虚拟化。例如有了 Intel-VT 技术的支持，Guest OS 和 VMM 的执行环境自动地完全隔离开来，Guest OS 有自己的“全套寄存器”，可以直接运行在最高级别。因此在上面的例子中，Guest OS 能够执行修改页表的汇编指令。Intel-VT 和 AMD-V 是目前 x86 体系结构上可用的两种硬件辅助虚拟化技术。

### 部分虚拟化

VMM只模拟部分底层硬件，因此客户机操作系统不做修改是无法在虚拟机中运行的，其它程序可能也需要进行修改。在历史上，部分虚拟化是通往全虚拟化道路上的重要里程碑，最早出现在第一代的分时系统 CTSS 和 IBM M44/44X 实验性的分页系统中。

### 操作系统级虚拟化

在传统操作系统中，所有用户的进程本质上是在同一个操作系统的实例中运行，因此内核或应用程序的缺陷可能影响到其它进程。操作系统级虚拟化是一种在服务器操作系统中使用的轻量级的虚拟化技术，内核通过创建多个虚拟的操作系统实例（内核和库）来隔离不同的进程，不同实例中的进程完全不了解对方的存在。比较著名的有 Solaris Container [2]，FreeBSD,Jail和OpenVZ等。

## 虚拟化的核心技术 

1. CPU虚拟化 从Intel 的Vtx技术开始，对现有的CPU进行了扩展，引入了特权级别和非特权级别，从而在硬件上支持虚拟化。
2. 内存虚拟化 
3. I/O虚拟化
4. 网络虚拟化
5. GPU虚拟化

## 常见的虚拟软件 

1. VMware VMware是x86的主流虚拟化厂商之一，目前的产品有:VMware ESX Server(直接运行在物理硬件层),VMware Workstation(基于操作系统的虚拟化类型，主要面向Windows和Linux),VMware Fusion(跟Workstation定位一致，面向Mac系统)
2. Microsoft 跟windows系统配合很好，主要有Virtual PC(面向桌面)和Virtual Server(面向服务器)
3. Xen 起源于英国剑桥大学的一个研究项目，基于硬件层的虚拟化软件。
4. KVM 基于GPL的开源软件，是基于软件层的虚拟化软件，现在他利用Inter VT等技术达到硬件虚拟化，利用QEMU来提供设备虚拟化，所以也可以理解成基于硬件的完全虚拟化软件。

## KVM  

KVM的运行的架构图大致如下:  

![kvm_structure](/images/kvm_structure.gif)   

其中，处理器直接辅助了虚拟化的支持，内存是KVM进行虚拟化，KVM通过 /dev/kvm 设备提供了内存虚拟化。每个客户操作系统都有自己的地址空间，并且是在实例化客户操作系统时映射的。映射给客户操作系统的物理内存实际上是映射给这个进程的虚拟内存。为了支持客户物理地址到主机物理地址的转换，系统维护了一组影子页表（shadow page table）。而I/O通过EQMU进程进行虚拟化，QEMU 是一个平台虚拟化解决方案，允许对一个完整的 PC 环境进行虚拟化（包括磁盘、图形适配器和网络设备）。客户操作系统所生成的任何 I/O 请求都会被中途截获，并重新发送到 QEMU 进程模拟的用户模式中。






















