虚拟化技术起源于20世纪60年代末,美国IBM公司当时开发了一套被称作虚拟化监视器(Virtual Machine Monitor)的软件,该软件作为计算机硬件层上面的一层软件抽象层,将计算机硬件虚拟分割成一个或多个虚拟机,并提供多用户对大型计算机的同时、交互访问。
1、定义
由于目前信息技术领域的很多企业都曾在宣传中将该企业的某种技术称为虚拟化技术,这些技术涵盖的范围可以从Java虚拟机技术到系统管理软件,这就使得准确的界定虚拟技术变得困难。因此各种相关学术论文在谈到虚拟技术时常常提到的便是如前面所提到的那个不严格的定义。
2.按虚拟的对象分类
硬件虚拟化:虚拟机(Virtual machine或VM),可以像真实机器一样运行程序的计算机的软件实现。。
平台虚拟化:将操作系统和硬件平台资源分割开。
完全虚拟化:敏感指令在操作系统和硬件之间被捕捉处理,客户操作系统无需修改,所有软件都能在虚拟机中运行,例如IBM CP/CMS,VirtualBox,VMware Workstation等。
硬件辅助虚拟化:利用硬件(主要是CPU)辅助处理敏感指令以实现完全虚拟化的功能,客户操作系统无需修改,例如VMware Workstation,Xen,KVM等。
部分虚拟化:针对部分应用程序进行虚拟,而不是整个操作系统。
准虚拟化/超虚拟化(paravirtualization):为应用程序提供与底层硬件相似但不相同的软件接口,客户操作系统需要进行修改。例如Xen的半虚拟化模式。
操作系统级虚拟化:使操作系统内核支持多用户空间实体,例如Parallels Virtuozzo Containers、OpenVZ、LXC以及类Unix系统上的chroot,Solaris上的Zone。
应用程序虚拟化:在操作系统和应用程序间创建虚拟环境
便携式应用程序:允许程序在便携式设备中运行而不用在操作系统中安装
跨平台虚拟化:允许针对特定CPU或者操作系统的软件不做修改就能运行在其他平台上,例如Wine。
虚拟设备:运行于虚拟化平台之上,面向应用的虚拟机映像
模拟器:也有译作仿真器,是指主要透过硬件或软件使得一台计算机系统(称作主host)在行为上类似于另一台计算机系统(称作客户guest)。模拟器一般允许在主系统上运行给客户系统设计的软件或者外设。模拟(emulation)是指在一台电子设备或一个计算机程序能够模拟(emulateor imitate)另外一台设备或程序。例如:很多制造商生产的打印机模拟惠普LaserJet打印机,使得大量设计给惠普打印机的软件也能在这些品牌打印机上使用;在PC上运行虚拟机执行其他操作系统或者电视游戏和街机;虚拟光驱;一些基于FPGA的硬件模拟器。
虚拟内存:将不相邻的内存区,甚至硬盘空间虚拟成统一连续的内存地址
存储虚拟化:将实体存储空间(如硬盘)分隔成不同的逻辑存储空间
网络虚拟化:将不同网络的硬件和软件资源结合成一个虚拟的整体,如:虚拟专用网络(VPN),在大型网络(通常是Internet)中的不同计算机(节点)通过加密连接而组成的虚拟网络,具有类似局域网的功能
存储器虚拟化:将网络系统中的随机存储器聚合起来,形成统一的虚拟内存池
桌面虚拟化:在本地计算机显示和操作远程计算机桌面,在远程计算机执行程序和储存信息。
数据虚拟化 (data virtualization):数据虚拟化是一种统一来自多个来源的数据的方法,这样应用程序,报告工具和最终用户就可以访问数据,而不需要有关原始来源,位置和数据结构的详细信息。
3.虚拟技术按抽象程度来分为五个层次
按照抽象程度的不同,常常把虚拟技术分为五个层次:
1.指令集架构档次的虚拟化(Instruction Set Architecture Level)
指令集架构的虚拟化是透过软件来模拟不同架构的处理器、存储器、总线、磁盘控制卡、计时器等多个I/O设备,软件会将虚拟机所发出的指令转换为本机可以操作的指令在现有的硬件上运行。这种档次的虚拟化对于模拟相同处理器架构的平台可以提供很好的兼容性,例如︰x86架构、Sparc架构、Alpha架构。
若主机处理器可以运行由虚拟机转换出来的指令,或是使用相同的指令集来完成任务,那就表示除了处理器以外的操作系统、I/O设备皆可不受特定平台所绑定,但由于虚拟机的每条指令都必须透过软件来模拟,所以在性能会有较大程度的耗损。
这个分类底下代表性的有Bochs以及QEMU。
2.硬件抽象层档次的虚拟化(Hardware Abstraction Level)
硬件抽象层档次的虚拟化是由虚拟机监视器来隐藏不同厂商的处理器、存储器、芯片组…等特征,为这些虚拟机提供抽象与统一的虚拟平台。运行此平台的计算机称之为主体机器(Host Machine),而在此平台中运作的虚拟机称为客体机器(Guest Machine),
目前大多数x86平台的商业计算机都在使用这种虚拟化,最主要是由于现今处理器厂商提供了硬件辅助虚拟化技术,例如︰第三世代的Intel VT-d、AMD-Vi皆提供虚拟机直接存储器访问(Direct Memory Access)以及对各种PCI接口的直接访问功能(PCI passthrough)。
这个分类底下代表性的有VMware_ESXi、Hyper-V、Virtualbox、以及Citrix。
3.操作系统档次的虚拟化(Operating System Level)
硬件抽象层档次的虚拟化中的全虚拟化与操作系统底层间有非常高的隔离能力,支持不同的操作系统,安装后不须要重启主机、或修改引导程序(Boot Loader)以达到双系统的目的,风险低、维护简单。由于此档次的虚拟机可以访问底层操作系统,因此用户必须花费大量的时间来安装与设置虚拟机,接着才能开始评估或测试所需运作的软件,这些设置包含了操作系统的安装、安全性或兼容性软件的更新、网上、系统调教…等,如果所需的操作系统与底层操作系统相同,那么其实它们所作的跟实际上安装一台实体机器没有什么区别。
操作系统内核虚拟化可以最大限度的减少新增虚拟机的所需,在这个档次的虚拟机共享实体主机上的硬件以及操作系统,呈现彼此独立且隔离的虚拟机环境。
应用软件的环境是由操作系统、库、相依性软件、特定于系统的数据结构或文件系统,例如︰NTFS或Ext3,以及其他环境设置所组成。如果这些都保持不变,应用软件很难发现与真实环境的区别。这是所有操作系统档次虚拟化的关键想法。
这个分类底下代表性的有Docker、VPS以及KVM。
4.编程语言档次的虚拟化(Programming Language Level)
传统计算机是由指令集架构所驱动的一种机械语言,硬件的操作由特殊的I/O指令处理,也可以透过区块映射(Mapping)来操作存储器,此档次的虚拟化会将高级语言转译成一种名为字节码的语言,透过虚拟机转译成为可以直接运行的命令。跨操作系统平台、跨语言皆为其优点。
这个分类底下代表性的有Oracle Java、Microsoft . NET、Parrot。
5.库档次的虚拟化(Library Level)
大部分的应用程序都是使用由许多库组成的API(Application Programming Interface)来设计,使用动态链接的方式用于隐藏操作系统的细节,目的是提供程序员更简单的工作。这也产生了一种新的虚拟化方式,使用不同的API与不同操作系统底层的ABI(Application Binary Interface)来进行模拟的工作。
这个分类底下代表性的有Wine以及WSL(Windows Subsystem for Linux)。