虚拟化就是由位于下层的软件模块,根据上层的软件模块的期待,抽象(虚拟)出一个虚拟的软件或硬件模块,使上一层软件直接运行在这个与自己期待完全一致的虚拟环境上。从这个意义上来看,虚拟化既可以是软件层的抽象,又可以是硬件层的抽象。

Virtual Machine Monitor VMM,即虚拟机监控系统,也叫 Hypervisor,是虚拟化层的具体实现。主要是以软件的方式实现一套和物理主机环境完全一样的虚拟环境,物理主机有的所有资源,包括 CPU、内存、网络 IO、设备 IO等等,它都有。相当于 VMM 对物理主机的资源进行划分和隔离,使其可以充分利用资源供上层使用。虚拟出的资源以虚拟机的形式提供服务,一个虚拟机本质上和一台物理机没有什么区别,可以跑各种操作系统,在之上再跑各种应用。

虚拟机通常叫做客户机(guest,物理机叫宿主机(host,VMM 处在中间层,既要负责对虚拟资源的管理,包括虚拟环境的调度,虚拟机之间的通信以及虚拟机的管理等,又要负责物理资源的管理,包括处理器、中断、内存、设备等的管理,此外,还要提供一些附加功能,包括定时器、安全机制、电源管理等。

Virtual Machine Monitor VMM根据平台类型和实现结构有两种不同的分类,按平台类型可以分为完全虚拟化类虚拟化,完全虚拟化就是 VMM 完全模拟出一个跟物理主机完全一样的环境。但是这个是非常困难的,首先,这需要硬件的支持,而硬件在初期设计的时候,没有那么远的前瞻性,可以预想到为虚拟化提供支持,前次,指令的复杂性,即使通过模拟的方式也很难做到全部指令都模拟。所以,就需要借助其他的一些技术来辅助虚拟化

软件辅助虚拟化通过优先级压缩(Ring Compression,RC)和二进制代码转译(Binary Translation,BT)来完成。RC 基于 CPU 特权级原理,也就是guest、VMM 和 host 分别处于不同的特权级上,guest 要访问 host 属于越级访问就会抛异常,VMM会截获异常,并模拟出其可能的行为,从而进行相应处理。但是由于硬件设计的缺陷,有些指令并不能被截获,从而导致“漏洞”(即指令不能转为支持虚拟化的指令)。BT可以弥补这个缺陷,通过扫描guest的二进制的代码,将难以虚拟化的指令转为支持虚拟化的指令,从而可以配合VMM 完成虚拟化功能。优先级压缩(Ring Compression,RC)和二进制代码转译(Binary Translation,BT)这两种方式都是通过「打补丁」的方式来辅助虚拟化,因此,很难在架构上保证完整性。后期的硬件厂商在硬件上对虚拟化提供了支持,即硬件辅助的虚拟化。通过对硬件本身加入更多的虚拟化功能,就可以截获更多的敏感指令,填补上漏洞。

类虚拟化是外一种通过软件来避免漏洞的方式,通过修改客户机 Guest操作系统内核代码(API级)来避免漏洞,因此,可以自定义内核的执行行为,某种程度上对性能进行优化。

根据Virtual Machine Monitor VMM的实现结构分类,主要分Hypervisor 模型(I 型)和宿主模型(II 型)两类。

Hypervisor 模型(I 型),也称裸机型:

直接安装在硬件计算资源上,操作系统安装并且运行在Hypervisor之上。Hypervisor 模型中 VMM 既是操作系统,又是虚拟化软件,即集成了虚拟化功能的操作系统,对上为 guest 提供虚拟化功能,对下管理着所有物理资源,它的优点是效率高,虚拟机的安全性只依赖于VMM,缺点是管理所有的物理资源,意味着 VMM 要承担很多的开发工作,特别是驱动层面的开发,硬件的 I/O 设备有很多,这些设备都需要有对应的驱动来设配才能为虚拟机提供功能。

宿主模型(II 型):

宿主模型剥离了管理功能和虚拟化功能,虚拟化功能只是作为内核的一个模块来加载,比如 Kernel Virtual Machine  KVM 技术,一般 KVM 只负责 CPU 和内存的硬件虚拟化,I/O 的虚拟化则由QEMU技术来完成。2006年10月,KVM模块的源代码被正式接纳进入Linux Kernel,成为内核源代码的一部分。因此,KVM是Linux完全原生的硬件虚拟化解决方案。

KVM架构

上图中,Linux内核运行在物理硬件之上,KVM模块将Linux内核本身变成一个Hypervisor。Hypervisor是位于物理硬件和虚拟硬件之间的一个中间层,可以理解为一个代理,它将虚拟硬件要执行的指令按一定的算法调度给物理硬件去执行。有了虚拟硬件,虚拟机就可以按照正常的流程安装操作系统以及运行APP了。

Hypervisor核心工作就是对多个虚拟硬件要求的资源进行统筹协调,最主要的就是协调CPU资源和内存资源。对于CPU资源,Hypervisor通过选择合适的调度算法,把物理CPU合理的分配给虚拟CPU使用。对于内存资源,Hypervisor需要先将物理硬件的内存地址转化为虚拟硬件的物理地址,虚拟机Operating System  OS会把虚拟硬件的物理地址映射为虚拟内存地址,进而提供给APP使用。KVM除了对CPU和内存资源进行管理之外,还能够使用Linux支持的任何存储形式来存储虚拟机系统盘。

型:

虚拟机运行在传统操作系统上,创建一个独立的虚拟化实例(容器),指向底层托管操作系统,即操作系统虚拟化。操作系统虚拟化是在操作系统中模拟出运行应用程序的容器,所有虚拟机共享内核空间,性能最好,耗费资源最少。但是缺点是底层和上层必须使用同一种操作系统,如底层操作系统运行的是Windows系统,则VPS/VE就必须运行Windows。

云计算的本质

云服务器:位于云上的使用虚拟化技术构建出的服务器;

CSP:Cloud Service Provider;

在云计算出现之前,互联网公司是需要购买服务器、存储和网关等基础设施的。在云计算出现之后,互联网公司还是需要购买服务器、存储和网关等基础设施的。因此,互联网的基础设施并没有因为云计算的出现而改变。但是可以发现,在云计算出现以前,企业IT采购基础设施的流程至少几个月。而云计算出现之后,企业IT采购基础设施的流程可以在很短时间内完成。因此,云计算颠覆的是互联网基础设施的交付方式。这种对互联网基础设施交付方式的改变就要求,Cloud Service Provider  CSP能够以一种区别于传统硬件的方式提供互联网的基础设施。于是,虚拟化技术就正式进入了历史舞台(虚拟化技术早在云计算出现之前很多年就已经存在,只不过彼时的虚拟化技术使用的场景比较有限,不被大家所关注)。

虚拟化技术(VMware、Xen、KVM等),即能够虚拟计算机硬件的技术。利用虚拟化技术虚拟出计算机必要的各个组件,再将虚拟出的组件组装起来,就得到一台虚拟的计算机(虚拟机),因此可以虚拟出千万台计算机组成云。

计算机由五大部分组成:运算器、控制器、存储器、输入设备和输出设备。其中,运算器和控制器统称为中央处理器(CPU)。存储器分为内存和外存(硬盘)。输入设备和输出设备统称外设(键盘显示器等等)

从Cloud Service Provider  CSP的角度来分析其必要性。首先,CSP的客户是通过网络连接到位于云上的虚拟机(虚拟的计算机)的,为此CSP并不需要关心虚拟机外设的实现。CSP需要关心的是如何利用虚拟化技术对虚拟机的CPU、内存及外存进行实现。

CPU内存的虚拟化实现统称为虚拟硬件。而外存实际上就是一个特定格式的文件(vid、qcow2等等)。但是单单有外存是没有意义的,还需要给这个外存安装操作系统。把安装了操作系统的外存统称为虚拟系统盘(实际上是一个文件)。CSP要实现一台云服务器,只需要关心两个问题:如何构建虚拟硬件?如何构建虚拟系统盘?

在常见的虚拟化技术中,这两个问题都有完整的解决方案。比如QEMU/KVM能够提供一套完整的虚拟硬件系统环境,而QEMU推荐的qcow2文件可以用来构建虚拟系统盘。

任何一台云服务器都是由虚拟硬件和虚拟系统盘组成的。但是,云上有成千上万台虚拟机,它们背后对应着海量的虚拟硬件和虚拟系统盘,如何组织这些虚拟硬件和虚拟系统盘是一个值得研究和思考的课题。

为什么用docker

在微服务的大背景下,一台物理机或者云主机可能要运行很多应用。应用必须依赖于开发环境。当我们遇到拓展物理机、云主机、应用迁移等场景,必然要重新搭建开发环境。这时,虚拟化技术就很好地保证环境一致、配置一致,并且让你更高效地迁移应用。

Docker正是应对这种场景的虚拟化技术。例如java,只要机器上安装了JVM,一份代码到处运行。应用好比java,只要机器上安装docker,我们事先保存的镜像可以到处运行。这些镜像可以是nginx、php、mysql、数据仓库等,无论你的主机从ubuntu迁移到centos,还是windows迁移linux,只要主机安装了docker,就能迅速地部署好新环境,并且保持环境、配置一致。

什么是镜像、容器、仓库?

镜像,是特殊的文件系统,他包含程序、配置、资源等;

容器,镜像的实例。就像是类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

仓库,用于保存镜像的服务。

Docker学习2-虚拟化的更多相关文章

  1. Docker学习总结

    本文作为总结性文章,不会详细讲解Docker.但会把已学习的.了解的内容按照由易到难的顺序串起来,更多的是帮助Docker新手快速的了解Docker,知道目前处在哪个阶段,接下来该学些什么,避免碰太多 ...

  2. docker学习资料整理(持续更新中..)

    docker最近可以说火得一踏糊涂,跟 51大神在交流技术的时候这个东西会多次被提到,当我们还玩vm+linux/freebsd的时候,人家已经上升到更高层次了,这就是差距,感觉好高大上的样子,技术之 ...

  3. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...

  4. Docker学习笔记【一】

    [本篇学习笔记来源于 Docker 从入门到实践] 1.什么事Docker?[What] Docker在容器的基础上,进行了进一步的封装,从文件系统.网络互联到进程隔离等,极大的简化了容器的创建和维护 ...

  5. 优秀的云计算工程师需要学什么?云计算Docker学习路线

    云计算工程师要学什么?随着互联网的快速发展,云计算这个词大家并不陌生,但是云计算究竟是做什么的,想要从事云计算要学习什么,很多都不知道,那么今天就给大家讲一下云计算. 云计算是基于互联网的相关服务的增 ...

  6. Docker学习记录--入门了解+安装

    Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制, ...

  7. Docker学习(一): 基本概念

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...

  8. Docker学习系列(一):windows下安装docker(转载)

    本文目录如下: windows按照docker的基本要求 具体安装步骤 开始使用 安装远程连接工具连接docker 安装中遇到的问题 Docker的更新 Docker中的jupyter windows ...

  9. [置顶] Docker学习总结(7)——云端基于Docker的微服务与持续交付实践

    本文根据[2016 全球运维大会•深圳站]现场演讲嘉宾分享内容整理而成 讲师简介 易立 毕业于北京大学,获得学士学位和硕士学位:目前负责阿里云容器技术相关的产品的研发工作. 加入阿里之前,曾在IBM中 ...

  10. DOCKER学习心得

    原文:DOCKER学习心得   前言: Docker的主要学习心得来源于<docker技术入门与实战> --2019.1.1->2019.1.5 la 着重从基础部分--实例分析-- ...

随机推荐

  1. Unix环境高级编程:文件 IO 原子性 与 状态 共享

    参考 UnixUnix环境高级编程 第三章 文件IO 偏移共享 单进程单文件描述符 在只有一个进程时,打开一个文件,对该文件描述符进行写入操作后,后续的写入操作会在原来偏移的基础上进行,这样就可以实现 ...

  2. 【 js 基础 】【 源码学习 】源码设计 (更新了backbone分析)

    学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析 第二部分:unders ...

  3. 洛谷P3586 [POI2015]LOG(贪心 权值线段树)

    题意 题目链接 Sol 显然整个序列的形态对询问没什么影响 设权值\(>=s\)的有\(k\)个. 我们可以让这些数每次都被选择 那么剩下的数,假设值为\(a_i\)次,则可以\(a_i\)次被 ...

  4. h5向上翻页图标晃动动画,css固定h5向上翻页图标在页面上

    //html结构<div class='upImg'><div> //css .upImg { background-image: url(../images/01.png); ...

  5. OSGI企业应用开发(十一)Bundle资源获取途径

    使用OSGI模块化标准构建Java EE项目,其中比较繁琐的一个方面就是Bundle资源的获取,因为很多开源框架官方都没有发布Bundle版本的Jar文件,这也是使用OSGI开发企业应用首先要解决的问 ...

  6. Expo大作战(二十二)--expo分离后的部署(expokit)

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  7. [Sublime-Text] Linux下用Sublime-Text3编译输出Java文件

    因为现在在借着经典的书籍巩固一些基础知识,所以会经常跑一些简单的程序,可又不想开庞大的IDE.所以就想试着用Sublime-Text来编译程序,哦,当然如果习惯的话,用 terminal 也可以.其实 ...

  8. Spring Boot (#1 quick start)

    Spring Boot (#1 quick start) 官方文档 Spring Boot是为了简化Spring应用的创建.运行.调试.部署等而出现的,使用它可以做到专注于Spring应用的开发,而无 ...

  9. LINQ学习:Select的用法

    转载于:http://www.cnblogs.com/ForEvErNoME/archive/2012/07/25/2606659.html 说明:在查询表达式中,select 子句可以指定将在执行查 ...

  10. python常用内置模块

    #持续更新 #在使用内置模块的时候需要导入,例如import abc,则导入abc模块,当然模块也可以自己写,相当于一个类,后面放到类里说,这个因为环境闲置,有些无法执行,只能理解了 #os系统操作 ...