虚拟化

  引言——美国环境保护署 (EPA) 报告的一组有趣的统计数据发现,实际上服务器只有5%的时间是在工作的。在其他时间,服务器都处于“休眠”状态。

1、虚拟化概念
  虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

  虚拟化前:
    每台主机一个操作系统
    软件硬件紧密地结合
    在同一主机上运行多个应用程序通常会遭遇沖突
    系统的资源利用率低
    硬件成本高昂而且不够灵活

  虚拟化后:
    打破了操作系统和硬件的互相倚賴
    通过封装到虚拟机的技术,管理操作系统和应用程序为单一的个体
    強大的安全和故障隔离
    虚拟机是独立于硬件的,它们能在任何硬件上运行

  虚拟化对象:
    CPU、内存、各种IO设备

  资源管理软件层:把所有硬件资源的使用虚拟化成OS:system call(系统调用),每一个应用程序运行时,需要和硬件打交道,只需要向内核发起系统调用即可
  OS: Process monitor(进程监控器),OS负责协调每一个运行在其上进程对于资源的申请
  例:
  1> 线性地址  →  物理地址(mmu)
       2> 每一个IO设备都会注册一个端口(相当于唯一ID);注册使用中断号
         IO端口是让CPU实现数据交换的设备;中断是让IO设备通知CPU,它有一个紧急事件需要处理
         CPU利用可编程中断控制器,让每一个IO设备注册使用一个中断线上的中断设备号
       当IO设备有信号接入时,必须向中断控制器发起一个中断请求(中断控制器上有针脚,电压感应),CPU就马上能意识到,并通知内核有中断产生,这时候内核必须完成模式切换,内核指挥CPU将信号读入内存缓冲区

 

 

2、虚拟化分类

  如果把X86平台的CPU、内存和外设作为资源,那对应的虚拟化技术就是平台虚拟化(Platform Virtualization),在同一个X86平台上面,可以虚拟多个X86平台,每个平台可以运行自己独立完整的操作系统。
    QEMU,KVM,XEN Server,ESXI,Hyper-V ......
  如果把操作系统及其提供的系统调用作为资源,那虚拟化就表现为操作系统虚拟化,例如Linux容器虚拟化技术,就是在同一个Linux操作系统之上,虚拟出多个同样的操作系统,每个应用程序认为自己运行在一个独立的OS。
    LXC、Docker ......

  X86平台指令集权限划分:
    Ring 0: 操作系统使用
    Ring 1-2:驱动程序使用
    Ring 3:应用程序使用

  

 

   

 

3、虚拟化管理程序 Hypervison(VMM)

  1> 定义:一种运行在物理机和虚拟机操作系统之间的中间软件层,可以容许多个操作系统和应用共享硬件,也称为VMM(Virtual Machine Monitor),即虚拟机监视器。

  

 

  2> Hypervisor类型1:半虚拟化(para virualization)

  对操作系统(VM)的内核进行修改,将运行在Ring0上的指令转为调用Hypervison。GuestOS的内核了解自己工作在虚拟(hypercall)之上

  

 

   

 

 

  3> Hypervisor类型2:全虚拟化/辅助虚拟化技术(Full virtualization)

  对CPU指令集进行改造,Inter VT-x/AMD-V,客户操作系统可以直接使用Ring 0 而无需修改 

    CPU不支持硬件虚拟化技术,模拟特权指令:模拟

    CPU支持硬件虚拟化技术,VMM运行 Ring 1,而GuestOS运行在 Ring 0

  

 

  

  4> Hypervisor类型3:软件全虚拟化

  模拟CPU让VM使用,即软件全虚拟化 QEMU,效率最低

 

  5> 操作系统虚拟化(轻量级)

  允许操作系统内核拥有彼此隔离和分割的多用户空间实例instance,这些实例也称之为容器。基于Linux内核中的namespace、cgroup实现,例如 LXC、Docker。

  

 

  

 

 

  6> Hypervisor 比较

  

 

  QEMU:
  软件模拟虚拟化、可以模拟多种硬件,包括X86架构处理器、AMD64架构处理器、ARM、SPARC 与 PowerPC 架构等。效率低,一般用于研究测试场景。

  KVM:
  KVM(kernel-based virtual machine)是x86架构下硬件辅助的全虚拟化的首选解决方案。KVM需要经过修改的QEMU软件(qemu-kvm)来实现虚拟机的管理KVM就是内核的一个模块,用户空间通过QEMU模拟硬件提供给虚拟机使用,一台虚拟机就是一个普通的Linux进程,虚拟机中的VCPU就是该进程中的线程。
  

 

  Libvirt:
  libvirt是一套免费、开源的支持Linux下主流虚拟化管理程序的C函数库,其旨在为包括KVM在内的各种虚拟化管理程序提供一套方便、可靠的编程接口。当前主流Linux平台上默认的虚拟化管理工具virt-manager,virsh等都是基于libvirt开发。
  

 

4、虚拟化原理

1> CPU虚拟化
  利用了和原始操作系统类似的机制——定时中断,在中断触发时陷入VMM,从而根据调度机制进行调度。分配全量的CPU时间片。
  以x86架构为例:
    X86的ICA中有19条敏感指令不是特权指令,因此X86无法使用经典的虚拟化技术完虚拟化。
  于是乎:
  (1)半虚拟化:修改guest的OM使其运行于Ring0上。问题:对闭源系统是一种阻碍。
  (2)全虚拟化:修改VMM,使得不敏感指令同样可以中断陷入VMM。
  (3)硬件辅助虚拟化:对CPU微指令集的修改,使非root Ring0-3同样可使用CPU,而VMM只起监控作用。

2> 内存虚拟化
  问题1:内存空间地址不唯一
  问题2:内存连续性
  解决:内存映射表
  内存虚拟化:把物理机的真实内存统一管理,包装成多份虚拟的内存给若干虚拟机使用

3> I/O虚拟化
  问题:多个客户机如何实现使用有限的外设资源?
  VMM必须通过I/O虚拟化的方式来复用有限的外设资源。
  现实中外设资源是有限的,为了满足多个客户机操作的需求,VMM必须通过I/O虚拟化的形式来复用有限的外设资源。
  VMM截获客户操作系统对设备的访问请求,然后通过软件的方式来模拟真实设备的效果:
  两个阶段:发现,使用
  前端设备驱动将数据通过VMM提供的接口转发到后端驱动;
  后端驱动对VM的数据进行分时分通道处理

  

 

 

4> 存储虚拟化

  存储虚拟化是在存储设备上加了一个逻辑卷,通过逻辑层访问存储资源。对管理员来说,可以方便的调整资源,提高存储利用率;对终端用户来说,集中的存储设备可提供更好的性能和易用性。
  存储虚拟化的实现方式:
  (1)裸金属+逻辑卷

  

 

  (2)存储设备虚拟化

  

 

  (3)主机存储虚拟化+文件系统

 

5> 网络虚拟化:

  问题1:一个服务器一个网络端口对应多个虚拟机的多个服务
  问题2:虚拟机动态迁移时网络端口随之迁移
  大二层网络请求、IO透传技术
  服务器虚拟化:

  

 

 



 


 

posted @ 2020-05-05 16:47  我听过  阅读(630)  评论(0编辑  收藏  举报