虚拟化的概念
虚拟化是指对计算机资源的抽象和模拟,计算机资源是指cpu、内存、硬盘、网络,其中虚拟和抽象实现的方法有平台虚拟化、资源虚拟化(SDN针对网络做的虚拟化)、应用程序虚拟化(应用程序与操作系统解耦和,无需本地安装应用程序,通过web端就可以运行应用程序)。虚拟化的根本目的是实现资源的充分调用,云计算的底层技术依靠于虚拟化。
平台虚拟化
- 全虚拟化
- 半虚拟化
- 硬件辅助虚拟化
符合虚拟化架构的三个充分条件
- 效率性
客户机的指令应该由硬件直接执行而无虚拟化管理程序参与。 - 资源控制
虚拟化管理程序(VMM)对系统资源有完全的控制能力和管理权限,包括资源的分配、监控和回收。 - 等价性
一个运行于虚拟机上的程序,其行为应与直接运行于物理机上的同程序的行为基本一致,只允许细微的差异,比如在系统时间方面。
VMM 虚拟机监控器
运行在物理服务器和操作系统之间的中间软件层。允许多个操作系统和应用共享一套基础的物理硬件,它可以协调访问--- 服务器上的所有物理设备和虚拟机。
CPU虚拟化
目的是GuestOS里的指令能够正常执行(资源控制),然后还要保证性能和效率(效率性),尽可能的接近物理机(等价性)。
X86支持虚拟化的技术变革
- CPU全虚拟化是指虚拟机模拟了完整的底层硬件,使得为原始硬件设计的操作系统或其他系统软件完全不做任何修改就可以在虚拟机中运行了。特权级(在x86的cpu中存在四个特权级指令rang0-rang3,其中rang0执行特权敏感指令,普通进程和非特权指令运行在rang3中,rang1和rang2运行其他的驱动程序,通过特权级压缩和二进制翻译,可将指令线降一级(特权级压缩的功能)然后在经过二进制翻译模拟成rang0进行执行,其实是将不能在下86中虚拟化运行的指令通过二进制翻译转化为能在虚拟机下运行的指令,vmm在rang0中运行。rang0运行在操作系统的kernel。)压缩和二进制翻译(BT)技术去实现。
- CPU半虚拟化,同样是为了解决x86做虚拟机中存在的指令越级的问题,对虚拟机的操作系统进行内核改造,虚拟机有自己特殊的指令,然后和vmm一起配合工作。这项技术的性能更好,也更能接近物理机的速度,通常损耗2%,最多8%(理论值),最为典型的在libvirt下的xen,但其也具有缺点无法虚拟Windows系统(Windows系统内核是闭源的),实际上是通过修改操作系统内核代码,使一些特殊的指令也可以在rang1中运行,避免了捕获、翻译、模拟的过程,性能也就打打提高了。
- CPU硬件辅助虚拟化,是对cpu指令做了改造,让cpu从根本上支持虚拟化,其中AMD的叫做AMD-v,而intel的叫VT-x。具体查看cpu是否支持虚拟化的命令为:
cat/proc/cpuinfo | grep vmx #在amd中搜索是svm
补:vt-x技术创建vmx分为root模式和non-root模式,其中vmm运行在root,而guestOS运行在non-root下,当guestOS有特殊指令时,就可通过指令改造传递给vmm。 它的典型代表就是kvm,也是应用最多的cpu虚拟化技术
物理内存的划分
- 块和块号
在操作系统中,物理内存会被划分成许多同样大小的连续部分。被划分的每一部分就叫做块,每一块都有块号,一般按照自零自增排序。 - 页和页号
页是指分页存储管理,它的意思是将用户作业(用户要求计算机系统所做工作的总称)的逻辑地址划分为一系列同等大小的部分,也有自己的编号为页号。 - 页表
页号和块号形成的对应关系生成的一张表。
Mem虚拟化
guestOS和宿主机用的是相同的物理内存,要做到相互不影响
- 内存全虚拟化
借助于影子页表技术 - 内存半虚拟化
借助于页表写入法 - 内存硬件辅助虚拟化
借助于ept(扩展页表)技术
I/O虚拟化
为了让虚拟机访问到他们所需的I/O资源
- I/O全虚拟化
通过模拟IO设备来实现,模拟出的IO设备在虚拟机组中并不知道它是虚拟出来的,虚拟出来的设备与底层硬件无关。 - I/O半虚拟化
采用前端驱动加后端驱动架构的,该架构主要依靠IO共享环机制,既前端驱动发送事件请求到IO共享环,同时也将事件写入授权表,接下来通过vmm事件通道告诉后端驱动,后端驱动对共享环中前端驱动发送的事件进行分析,然后再从授权表中获取具体的数据,接着后端驱动就会去通知真实的驱动,事件完成后再由真实驱动告知后端驱动,后端驱动在通过事件通道告知前端驱动。 - I/O硬件辅助虚拟化
IO硬件虚拟化就是为了让虚拟机直接使用物理设备,常用技术有因特尔的vt-d,通过一个专用的内存区域,让IO设备和虚拟机可以独立访问。
为什么会有这么多的虚拟方式呢,感谢x86吧~~