虚拟化是什么
virtualization
将任何一种资源(CPU,内存)抽象成另一种形式的技术都叫虚拟化,是资源的一种逻辑表示关系,解除了物理硬件与操作系统之间的紧耦合关系。

虚拟化前:IT资源独立,每台服务器只能装对应的操作系统,无法扩展其他的资源,也就是操作系统必须与硬件紧耦合;
举例:上世纪工人包分配,不能跳槽;
虚拟化后:通过虚拟化技术将底层资源资源池化,成为共享资源,于是上层操作系统与硬件解耦,操作系统从资源池中抽取资源,最大化的利用资源;
资源池化:将物理资源通过虚拟化技术抽象成逻辑资源;举例:自来水厂
举例:BOSS直聘,中介
虚拟化的基本概念

Hypervisor(VMM):管理虚拟机的生命周期;有KVM,CNA.ISO
Guest Machine(VM):VRM.ISO
Guest OS:windows,linux;
Hypervisor的分类
一型虚拟化/裸金属虚拟化:hypervisor与操作系统在同一层
二型虚拟化/宿主型虚拟化:hypervisor与操作系统不在同一层

注:VMM与VM属于hypervisor
RING指令
ring指令是CPU指令的一种分类方式,主要用于区分指令的执行权限和分配方式
不管是VMM或者是VM调度底层资源时都需要相应的RING权限
有四种分类:

问:VMware workstation运行在哪一层?
答:ring3
问:为什么VMware workstation创建虚拟机时可以调度CPU资源??
答:全虚拟化
在虚拟化的环境中,需要为每个guest OS提供隔离的,单独的CPU环境,通常有三种解决方案:全虚拟化,半虚拟化,硬件辅助虚拟化。
全虚拟化
全虚拟化就是全部由软件模拟的,当在VMM上创建虚拟化时,虚拟机能够正常申请CPU资源,因为VMM在申请资源的时候通过二进制翻译(BT)向ring0申请,这时候就能创建成功。
特点:guest OS并不知道自己运行在模拟的环境中,
缺点:需要VMM做中间传话,有个中间商赚差价
VMware workstation,QUME等
半虚拟化

XEN是裸金属虚拟化,属于半虚拟化。
通过软件模拟的虚拟化,将hypervisor层运行在ring0,guest OS运行在ring 1,而应用程序依旧运行在ring3;
特点:要修改系统,guest OS知道自己运行在模拟的环境中,非敏感指令可用穿透操作系统直接调度底层资源。
问:我的电脑支持半虚拟化??
答:不支持;无法修改win10的源码
硬件辅助虚拟化
CPU支持虚拟化;如hyper-V是微软的虚拟化产品


虚拟化的发展史

REHL 5.0加入XEN XEN不愿意把源码加入到Linux
RHEL 5.4收购了KVM 5.4-5.9 XEN KVM 并行
REHL 6.0抛弃了XEN,只保留了KVM
KVM
KVM简介
KVM的全称是Kernel-based Virtual Machine,字面意思是基于内核的虚拟机。其最初是由Qumranet公司开发的一个开源项目。2008年,Qumranet被RedHat所收购,但KVM本身仍是一个开源项目,由RedHat、IBM等厂商支持。
KVM之所以叫做基于内核的虚拟机,是因为KVM本身是一个Linux内核模块,当安装有Linux系统的物理机安装了这个模块后,就变成了Hypervisor,而且还不会影响原先在该Linux上运行的其它应用程序。
与Xen类似,KVM支持广泛的CPU架构,除了x86/x86_64 CPU架构之外,还将会支持大型机(S/390)、小型机(PowerPC、IA64)及ARM等。
KVM充分利用了CPU的硬件辅助虚拟化能力,并重用了Linux内核的诸多功能,使得KVM本身是非常瘦小的,KVM的创始者Avi Kivity声称KVM模块仅有约10000行代码,但我们不能认为KVM的Hypervisor就是这个代码量,因为从严格意义来说,KVM本身并不是Hypervisor,它仅是Linux内核中的一个可装载模块,其功能是将Linux内核转换成一个Hypervisor。
通过KVM模块的加载将Linux内核转变成Hypervisor,Linux本身运行于内核模式,主机进程运行于用户模式,虚拟机则运行于客户模式,使得转变后的Linux内核可以将主机进程和虚拟机进行统一的管理和调度,这也是KVM名称的由来。
KVM历史:
▫2006年10月,以色列公司Qumranet发布KVM;
▫2006年12月,KVM合入内核(Linux 2.6.20rc);
▫2007年2月,Linux 2.6.20正式版发布;
▫2008年9月,Redhat以1.07亿美元收购Qumranet;
▫2009年9月,RHEL 5.4开始支持KVM(同时支持Xen);
▫2010年11月,RHEL 6.0之后仅支持KVM。
KVM与QEMU

•KVM用来模拟CPU的运行,但缺少了对Network和I/O的支持。QEMU-KVM是一个完整的模拟器,它基于KVM上,提供了完整的I/O模拟支持。其中OpenStack为了跨VM性,所以不会直接控制QEMU-KVM,而是通过Libvirt的库去间接控制QEMU-KVM,后续我们会对Libvirt进行介绍。
•KVM离不开QEMU。KVM实现初期,为了简化开发和代码重用,在QEMU基础上进行了修改,主要是将比较消耗CPU性能的CPU虚拟化和内存虚拟化部分移交到了内核中实现,保留IO虚拟化模块在用户空间实现。避免了用户态和内核态的频繁切换,优化使用性能。
•QEMU离不开KVM。之前我们提到,QEMU是一个纯软件的实现,运行在用户空间,性能非常低下,所以从QEMU的角度可以说是QEMU使用了KVM的虚拟化功能,为自身虚拟机提供资源与加速。
•/dev/kvm接口是QEMU和KVM交互的“桥梁”。/dev/kvm本身是一个设备文件,我们可以通过ioctl函数来对该文件进行控制和管理,从而完成用户空间与内核空间的数据交互。KVM与QEMU的通信过程主要就是一系列针对该设备文件的ioctl系统调用。
KVM工作原理
•KVM基本结构如上图。KVM已经是内核模块,被看作是一个标准Linux字符集设备(/dev/kvm)。QEMU通过Libkvm应用程序接口,用fd(文件描述符)通过ioctl向设备驱动来发送创建、运行虚拟机命令。设备驱动KVM会解析命令。
•KVM模块让Linux主机成为了一个虚拟机监视器(VMM),在原有执行模式基础上,增加了客户模式。在虚拟机运行时,三种模式的工作为:
▫客户模式:执行非I/O的客户代码,虚拟机运行在这个模式下。
▫用户模式:代表用户执行I/O指令,QEMU运行在这个模式下,它用来为虚拟机模拟执行I/O类的操作请求。
▫内核模式:实现客户模式切换,处理因I/O或者其他指令引起的从客户模式退出动作(VM-Exit)。KVM模块工作在这个模式下。此模式下可以真正操作硬件,当Guest OS执行I/O类操作或特权指令操作时,需要向用户模式提交请求,然后由用户模式再次发起硬件操作请求给内核模式,从而真正操作硬件。