计算虚拟化

CPU分为4个级别:Ring0-3

虚拟化的操作系统:hypervisor/VMM

CNA、ESXI

计算虚拟化的矛盾

OS必须处在Ring0,而guest os又不能处于Ring0,这是从虚拟机不能直接操作底层硬件,如果直接操作会对系统环境造成破坏这一角度去看的。

而特权指令都放在0级别,普通指令放在3级别,由于上述的矛盾,guest os只能放在Ring 3级。

解决虚拟化难点的方式:全虚拟化、半虚拟化、硬件辅助虚拟化

经典的虚拟化方法主要使用特权解除(Privilege deprivileging)和陷入-模拟(Trap-and-Emulation)的方式。即:将guest os运行在非特权级(特权解除),而将VMM(Virtual Machine Monitor)运行于最高特权级(完全控制系统资源)。解除了guest os的特权后,guest os的大部分指令仍可以在硬件上直接运行,只有当执行到特权指令时,才会陷入大VMM模拟执行(陷入-模拟)。CPU运行模式分内核态与用户态:客户操作系统运行在用户态;VMM运行在内核态。Ring 0的特权性体现在稍有不慎的修改系统的关键就有可能导致系统崩溃。也是用于驱动物理设备。

CPU虚拟化

全虚拟化(full-v):性能差,全部由hypervisor实现。

半虚拟化(PV):虚拟机知道自己是虚拟机,并且对19条敏感指令进行修改,hypervisor提供hypervisor call给虚拟机调用。性能会提升很多。缺点是只能linux,并且难度大。

硬件辅助虚拟化(HVM):用的最多,性能最好。开机进BIOS,打开CPU选项中的VT-x或者AMD-v。在硬件辅助虚拟化中,在ring0 之上加了一个ring -1,ring -1拥有root权限,放hypervisor。这时ring 0是没有特权指令的,特权指令都在ring  -1。因此我们虚拟机就可以使用原来的ring级别,工作在ring 0。一旦要执行特权指令,硬件可以直接参与中断。

内存的虚拟化:从MA机器地址翻译到PA,在从PA翻译到VA。而MMU只能参与一次,需要软件模拟MMU。

HVM参与翻译,那么MMU就只需要翻译一次即可。

IO虚拟化

现实中的外设资源是有限的,为了满足多个客户机操作系统的需求,VMM必须通过I/O虚拟化的方式来复用有限的外设资源。

VMM截获客户操作系统对设备的访问请求,然后通过软件的方式模拟真实设备来实现。

虚拟化的本质:分区、隔离、封装、相对于硬件独立。

虚拟机以文件的形式存放。VMDK、VHD。

考虑一种情况,有20台虚拟机都以文件的形式放在一个硬盘中,那么在这20台虚拟机同时进行虚拟硬盘的IO操作时,我们这个硬盘的IO并发量就很大,性能就会变差。

这样考虑,我们之间不以文件系统形式存放,而是将一整块硬盘做成多个逻辑卷,每个卷还是块设备,只是没有文件系统,这样就少了一层转换,性能就会好一点,还可以实现一块虚拟硬盘对应一块逻辑卷。但性能还是只能提升一点点,同时IO带来的高并发IO还是没有解决。

好的解决方法就是使用SAN存储(存储区域网络storage area network)。可以走IP协议、也可以走FC协议。使用了这种方法后,就可以在SAN里面划分出多个LUN,将这些LUN单独映射给这些虚拟机之后,虚拟机看到的就是一个块设备。这样,只要网络带宽没问题,那IO就没问题。这就叫做IO直通技术。

IO虚拟化也分为:FV、PV、直通IO(HVM)

其中,IO半虚拟化(PV)场景下,给虚拟机打上一个特殊的驱动,这个特殊的驱动叫做PV Driver,或者叫VirtIO。打了这个驱动之后,虚拟机的半虚拟化就会直接去对真实硬件驱动发起调用,这里也是用的hyper call。

如果这里使用的是网卡,而网卡是有限的,这意味着硬件辅助虚拟化带来的IO直通技术是有限制的,但是性能最好。

IO半虚拟化需要安装PV Driver(就是挂载Tools):1、安装PV driver,2、安装UVP Tools。(只装PVdriver只能实现半虚拟化,而装了UVP Tools还可以看到配置信息)

因此,目前虚拟化一般使用技术是这样的:

CPU:HVM

IO:PV(半虚)

虚拟化类型介绍

1.

2.

hypervlsor

3.XEN

domain 
driver 
domain 1J 
XEN kemel

前后端驱动模型:通过前端驱动把IO发到后端驱动中,driver放在xenstore里面,当后端驱动接收到IO请求之后,直接调用真实驱动下发IO。因此,所有的IO全部要经过Dom0,因此,Dom0是有配置要求的。

/usr/bin/modifyUVPSpec.sh可以修改dom0参数

Dom0通过第三方软件来模拟硬件—QEMU。它可以模拟硬件。qemu-image可以模拟出磁盘镜像之类的。

在Xen使用的方法中,没有指令翻译。这是通过两种方法之一实现的。第一,使用一个能理解和翻译虚拟操作系统发出的未修改指令的CPU(此方法称作完全虚拟化或full virtualization)。另一种,修改操作系统,从而使它发出的指令最优化,便于在虚拟化环境中执行(此方法称作准虚拟化或paravirtualization)。

在Xen环境中,主要有两个组成部分。一个是虚拟机监控器(VMM),也叫hypervisor。Hypervisor层在硬件与虚拟机之间,是必须最先载入到硬件的第一层。Hypervisor载入后,就可以部署虚拟机了。在Xen中,虚拟机叫做“domain”。在这些虚拟机中,其中一个扮演着很重要的角色,就是domain0,具有很高的特权。通常,在任何虚拟机之前安装的操作系统才有这种特权。

Domain0要负责一些专门的工作。由于hypervisor中不包含任何与硬件对话的驱动,也没有与管理员对话的接口,这些驱动就由domain0来提供了。通过domain0,管理员可以利用一些Xen工具来创建其它虚拟机(Xen术语叫domainU)。这些domainU也叫无特权domain。这是因为在基于i386的CPU架构中,它们绝不会享有最高优先级,只有domain0才可以。

在domain0中,还会载入一个xend进程。这个进程会管理所有其它虚拟机,并提供这些虚拟机控制台的访问。在创建虚拟机时,管理员使用配置程序与domain0直接对话。

来自 <https://baike.baidu.com/item/Xen/11050512>

虚 拟 化 类 型 介 绍 
搡 作 
寄 居 虚 拟 化 
裸 金 属 虚 拟 化 
· 虚 拟 枳 不 依 體 于 作 系 
· 简 单 易 于 实 现 
· 攴 持 多 种 作 东 统 · 多 种 应 用 
缺 点 
厂 家 
· 安 和 运 行 应 用 序 依 賴 于 主 
机 作 系 对 设 备 的 支 持 
· 管 亓 较 大 , 悭 能 损 耗 大 
VMwa• 笔 《 才 k ati 仇 、 
t “ 
· 虚 拟 层 内 核 开 发 难 度 大 
WMWare ESXSe•ver 
厂 X 引 、 S 引 ver 
RedhatKVM 
MicrosoftHyper-V 
华 为 FusionSphere 
TECH-LAB 
虚 器 
操 作 系 统 虚 拟 化 
· 简 单 飞 易 于 实 现 
· 管 理 汁 沩 非 牮 
· 隔 寓 性 差 。 多 睿 器 共 享 
一 作 系 统 内 核 
《 旧 娌 0 
d 毳 疒

容器与虚拟机

容 器 带 来 的 好 处 ( 1 / 3 ) 
。 更 高 效 的 虚 拟 化 
Docker 容 器 的 运 行 不 需 要 额 外 的 hypervisor 攴 持 , 它 是 内 核 级 
的 虚 拟 化 , 囚 此 可 以 实 现 更 高 的 性 能 和 效 率 。 
。 更 安 全 的 运 行 应 用 
Do ” 容 器 内 运 行 的 进 程 完 全 与 系 统 隔 离 , 一 些 恶 意 行 为 对 系 统 
造 成 的 影 响 不 参 波 及 宿 主 系 统 。
容 器 与 虚 拟 机 比 较 
· 容 器 和 虚 拟 机 具 有 类 似 的 资 源 隔 离 和 分 配 优 势 , 但 功 能 不 同 , 因 为 容 器 是 虚 拟 化 
操 作 系 统 而 不 是 硬 件 , 容 器 更 加 便 携 和 高 效 。 
CONTAINER 
0 
Bins•'Libs 
B 貊 L 上 , 
糨 們 山 b 、 
Infrastructure
启 动 度 
飆 使 川 
憧 支 持 量 
个 容 器 
安 全 到 
一 取 为 GH 
一 儿 个 
完 全 隔 离

虚拟化基础知识

虚拟化的起源

发展由来

  • 60年代在大型机上虚拟技术已经有所应用
  • 99年在小型机上已经出现逻辑分区的应用
  • 2000年x86平台虚拟技术开始出现(VMWare)
  • 2001年x86平台虚拟化技术在服务器上应用

虚拟化技术动力

  • CPU速度越来越快,超出软件对硬件性能的要求
  • INTEL和AMD在CPU里加入虚拟指令
  • 企业成本压力
  • 环保压力
  • 不断增长的业务压力

传统架构资源利用率低

传统架构下,APP:OS:Phy=1:1:1。这样就造成资源利用率低,为了不造成资源浪费,会增加APP部署。进而产生的影响就是不同应用之间的资源抢占,隔离性差。而OS只提供应用运行的环境,不能解决一时问题。

为了在不造成冲突的前提下提高资源利用率,最好是在一个OS上部署一个APP,于是就出现了虚拟化的技术。在一台主机上部署多个虚拟客户机并安装OS,每个OS安装一个APP,这样就解决了问题。APP:OS:Phy=n:n:1。

为什么需要操作系统

应用运行时需要用到多种资源,CPU、内存、IO等。而每个应用都会认为这些资源全部是自己可用的,这时多个应用之间就会出现资源使用冲突。这是因为没有一个调控机制。这时就需要一个操作系统。

操作系统把CPU抽象化,让应用认为自己拿到了CPU。当应用想要使用CPU这些资源时,就发动系统调用:System Call,由操作系统进行资源分配。

在单核单线程时,如果要让两个应用同时运行,这时操作系统就会对CPU进行时间片分片。

指令集

硬件CPU可以模拟,而指令集是让CPU干活的命令。如果虚拟机能够全部使用指令集,那么有一些特殊指令如关机,被发送给CPU,就会导致真实机器受影响。

在经典虚拟化里面,如果虚拟机想要使用一些特殊的指令集,真机操作系统检测到了,就立即捕获这个指令请求,然后将指令的结果模拟给虚拟机。这种虚拟化需要对真机操作系统做改造。

而在x86架构中,除了特权指令集合普通指令集,还有一个敏感指令集,它不是特权指令但可能会触发特权指令的执行。这种敏感指令很难捕获,却必须捕获。目前有三种方式解决x86的敏感指令问题:全虚拟化,半虚拟化,硬件辅助虚拟化。