zoukankan      html  css  js  c++  java
  • 虚拟化

      引言——美国环境保护署 (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透传技术
      服务器虚拟化:

      



     


  • 相关阅读:
    js获取数组,对象的真实长度
    http和https区别
    react调用setstate后发生了什么
    for in for of foreach及map的区别
    事件委托(事件代理)
    CSS隐藏元素的几种方法
    react一些扩展
    [软件构造]异常的捕获与自定义
    [软件构造]可能是笔记总结吧
    计算机系统大作业
  • 原文地址:https://www.cnblogs.com/zyybky/p/12594712.html
Copyright © 2011-2022 走看看