何为虚拟化?

  • 虚拟化技术不等于云计算,云计算的实现不一定需要虚拟化,但虚拟化在IaaS中起着非常重要的作用(裸金属服务器)
  • 裸金属服务器,又不仅限于物理服务器,它是物理服务器和云服务的结合。
  • “裸金属”,意味它不包括相应的操作系统和软件,这个是客户后期自选配置的。大部分云服务提供商的裸金属服务器产品,不提供本地硬盘(可以支持),主要提供CPU和内存。
  • 裸金属服务器知识:https://zhuanlan.zhihu.com/p/172037815
  • 虚拟化是云计算基础,针对云计算能够提供不仅仅是IaaS服务PaaS和SaaS的大部分服务都是基于IaaS服务建立的

虚拟机如何创建?

  • 虚拟机通过物理CPU的虚拟化技术,分配给虚拟机以资源,通过操作系统控制,形成虚拟机
  • 或者通过虚拟化软件在实机的基础上建立

为什么要使用虚拟化

  • 使用虚拟化技术可以提高资源的利用率,实现软硬件的解耦
  • 虚拟化的本质是将原来的的物理设备逻辑化
  • 未使用虚拟化的软硬件是高耦合的,同一时刻只能运行一个OS,且硬件与OS比例1:1,并且硬件资源是独立的
  • 使用虚拟化,可以实现软硬件解耦,同一时刻可以运行多个OS,且硬件与OS比例1:n,并且硬件资源是共享的

常见的虚拟化

  • 开源:

    • KVM、XEN
  • 闭源:

    • Hyper-V、VMware、Fusion Sphere

相关概念

  • Guest OS :虚拟机OS
  • Guest Machine :虚拟处理的虚拟机
  • Hypervisor :虚拟化监控机
  • Host OS :运行在物理机上的OS
  • Host Machine : 物理机

虚拟化架构

寄居虚拟化 裸金属虚拟化 操作系统虚拟化 混合虚拟化
优点 简单、易于实现 虚拟机不依赖操作系统</br>支持多种操作系统,多种应用 简单、易于实现</br>管理开销非常低 相对于寄居虚拟化价格,没有冗余,性能高</br>可支持多种操作系统
缺点 安装和运行应用程序依赖于主机操作系统对设备的支持</br>管理开销较大,性能损耗大 虚拟层内核开发难度大 隔离性差,多容器共享同一操作系统 需底层硬件支持虚拟化扩展功能
厂家 VMware Work VMware ESXServer</br>Citrix XenServer</br>Fusion Sphere Virtuozzo Redhat KVM

virtual frame

根据hypervisor的位置不同

classicforvir

  • 1型虚拟化 。Hypervisor直接安装在物理机上,多个虚拟机在Hypervisor运行。Hypervisor实现方式一般是一个特殊定制的Linux系统。Xen和VMWare的ESXi都属于这个类型。
  • 2型虚拟化 。物理机上首先安装常规的操作系统,比如Redhat、Ubuntu和Windows.Hypervisor作为OS上的一个程序模块运行,并对管理虚拟机进行管理。KVM、VirtualBox和VMWareWorkstation都属于这个类型。

理论上讲:

  • 1型虚拟化一般对硬件虚拟化功能进行了特别优化,性能上比2型要高。
    KVM注重性能,XEN注重安全性,针对应用的访问路径开销,KVM比XEN要短
  • 2型虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM

Hypervisor作用

  1. 识别、捕获和响应虚拟机所发出的CPU特权指令或保护指令
  2. 负责处理虚拟机队列和调度,并将物理硬件的处理结果返回给相应的虚拟机。
  3. VMM承担管理资源的重任,其还需向上提供拟机VM用于运行Guest OS,因此VMM还负责虚拟环境的创建和管理。

CPU虚拟化

cpuvir

Ring0的权限可以直接操作硬件,一般只有操作系统和驱动会允许拥有此权限;Ring3的权限最低,所有的程序都可以拥有此权限,一些危险指令只能通过OS调用执行

  • 指令类别:
    • 特权指令:操作与管理关键系统资源指令,在Ring0级别上运行
    • 普通指令:CPU普通权限级别即可运行,即Ring3
    • 敏感指令:修改虚拟机运行模式或宿主机状态的指令,即将Guest OS在Ring0运行的指令夺权,交由VMM执行

可以说,Ring0就是我们常说的内核态,Ring3就是我们常说的用户态

计算虚拟化原理

CPU虚拟化原理

  • 对于原生操作系统与CPU的管理关系:
    • CPU资源永远就绪
    • OS对CPU具有最高权限

但引入虚拟化后,出现:
多个虚拟机之间共享CPU资源
部分指令只能通过hypervisor的权限使用

内存虚拟化原理

  • 对于原生操作系统与CPU的管理关系:
    • 内存都从物理地址0开始
    • 内存都连续

但引入虚拟化后,出现:
物理地址0只有一个,无法同时满足所有客户机从0开始的需求
分配连续物理地址会使内存使用率降低,灵活性降低

castvir

  • 通过Hypervisor把操作系统的内存分为虚拟机侧和物理机侧,从虚拟机侧看,每个独立的虚拟机的内存物理地址都是从0开始的,但从物理机侧看,所有虚拟机的物理内存地址整合在一起却只有一个0物理地址,只是Hypervisor在其中把每个虚拟机所要的物理地址0虚拟化了,让各个虚拟机的内存物理地址逻辑上是从0开始的,但物理上却并非如此

I/O虚拟化原理

  • 现实中的外设资源是有限的,为满足客户机操作系统的需求,VMM必须通过I/O虚拟化的方式来复用有限的外设资源
  • 解决方法:全虚拟化、半虚拟化、硬件虚拟化

XEN 与 KVM

  • XEN架构:本身去充当VMM,只能够区实现CPU虚拟化、内存的虚拟化
  • Domain0:基于XEN架构下最先启动的一台特权虚拟机,能够直接去管理和使用底层硬件的IO设备,并且去划分虚拟IO硬件设备给虚拟机来去使用,同时能够去管理普通的虚拟机,配合前后端驱动模型去实现IO半虚拟化
  • DomainU:普通的虚拟机
  • KVM:利用宿主机操作系统的内核去充当Hypervisor,能够实现CPU和内存虚拟化,需要配合QEMU模块实现IO虚拟化;在KVM中称之为QEMU-KVM,提高使用IOCTL(操作系统的函数调用),在/dev/kvm接口配置VM的IP,实现IO虚拟化
XEN KVM
虚拟化类型 I型虚拟化 II型虚拟化
实现方式 提高Domain0实现IO虚拟化 借助QEMU实现IO虚拟化
逻辑架构区别 包括XEN VMM,</br>Domain0</br>DomainU 包括KVM内核模块</br>QEMU</br>Libvrit,API管理工具

Libvirt是用于管理虚拟化平台的开源的API,后台程序和管理工具。它可以用于管理KVM、Xen、VMware ESX,QEMU和其他虚拟化技术。这些API在云计算的解决方案中广泛使用。

xenkvm

什么是KVM

  • 基于内核的虚拟机 Kernel-based Virtual Machine(KVM)是一种内建于 Linux® 中的开源虚拟化技术。具体而言,KVM 可帮助您将 Linux 转变为虚拟机监控程序,使主机计算机能够运行多个隔离的虚拟环境,即虚拟客户机或虚拟机(VM)。

kvmtixi

KVM运行模式

  1. Guest Mode :指虚拟机,包括CPU、内存磁盘等虚拟设备,置于一种受限的CPU模式下运行
  2. User Mode :指用户空间。主要是QEMU,用来为虚拟机模拟执行I/O类的操作请求
  3. Kernel Mode :指内核空间,可以真正的操作硬件

KVM I/O默认状态

默认状态下技术全虚拟化
kvmio

1、虚拟机中的磁盘设备发起一次I/O操作请求,
2、KVM模块中的I/O Trap Code(I/O捕获程序)将这个I/O操作请求捕获至刂进行相应的处理,然后将处理后的请求放到I/O共享页中;
3、KVM模块会涌知QEMU,告诉它有新的I/O操作请求放到了共享页中;
4、QEMU收到通知后,到共享页中获取该I/O操作请求的具体信息;
5、QEMU对该清求进行模拟,同时根据I/O操作请求的信息调用运行在内核态的设备驱动,去进行真正的I/O操作;
6、通过设备驱动去对硬件 ==执行真正的I/O操作== ;
7、QEMU将执行后的一返回到共享页中,同时通知KVM模块已完成了此次的I/O操作;
8、I/O捕获程序从共享页中将返回的结果读取出来;
9、I/O捕获程序将操作结果返回给虚拟机;
10、虚拟机的将结果返回给发起操作的应用程序。

KVM I/O操作——Virtio

引入Virtio,整个I/O操作流程就变成半虚拟化了
virtio

1、第一步也是由虚拟机发起I/O操作请求;
2、第二步的时候和使用默认模型不一样,这个I/O操作请求不会经过I/O捕获程序,而是直接以前后端的形式放到环形缓冲区,同时KVM模块涌知后端驱动;
3、QEMU到环形缓冲区获取到操作请求的具体信息;
4、后端驱动直接调用真实的物理设备驱动进行具体的I/O操作;
5、由真实的设备驱动完成此次操作;
6、QEMU将完成结果返回到环形缓冲区,并且由KVM模块通知前端驱动;
7、前端驱动从环形缓冲区获取到此次I/O操作的结果;
8、前端驱动将结果返回给具体发起该操作的应用程序。

Virtio也存在着一些缺点,有些比较老的或者不常用的设备,无法使用,只能使用QEMU方式进行模拟。

  • 整个Virtio包括前端驱动、vring和后端驱动组成。
  • 引入Virtio,可以跳过KVM Module中介,直接把IO指令请求交由QEMU处理,并且通过vring获取到已处理的I/O指令,传回到操作系统中。
  • 提升I/O访问的效率,降低I/O延迟。