虚拟化技术详解——少年想自己做个虚拟机吗?

白嫖了这么久的VMare workstation来搞Linux系统,一直不知道虚拟机的虚拟两个字是什么东西。看了《现代操作系统》才有所了解,那就顺手做个虚拟化技术的笔记进行总结。私信可以给电子书,如果我那时候还保留的话(现2020年4月21日)

虚拟化技术是一个比较复杂的领域,这里仅仅对虚拟化技术做一个比较简单的介绍,具体的一些东西没有能力全部列举出来,每一个小知识点需要扩展的部分都会有链接进行扩充

1. 虚拟化技术究竟是个什么鬼东西

尽管虚拟化技术这几年一直吹的很nb,但其实它并不是一个新兴的东西,早在20世纪60年代,IBM就试验了两个独立开发的虚拟机管理程序SIMMONCP-40。但是真正能够用到实际中、可以直接商用是20世纪90年代,斯坦福大学的研究人员开发了一种名为DISCO(蹦迪的意思?)的新型虚拟机管理程序,接下来成立了我们熟知的VMware公司,随后逐渐发展到了云技术。云的核思想很直接:将你的计算或存储需要外包给一个管理良好的数据中心。

其实云的运用有很多,像云计算,百度网盘(也用到了虚拟化技术,这个限速到几kb的渣男出来挨打)
在这里插入图片描述
时间2020年4月16号。


  1. 虚拟化的目的:使用逻辑来表示资源,从而摆脱物理限制的约束。提高物理资源的利用率。
  2. 虚拟化的原理:在OS中加入一个虚拟化层(VMM),虚拟化层可以对下层(HostOS)硬件资源(物理CPU、内存、磁盘、网卡、显卡等)进行封装、隔离,抽象为另一种形式的逻辑资源,再提供给上层(GuestOS)使用。所以你可以理解VMM其实就是联系HostOS和GuestOS的一个中间件,当然虚拟化可以将一份资源抽象为多份,也可以将多份资源抽象为一份。
  3. 虚拟化的主要思想:虚拟机管理程序(Virtual Machine Monitor,VMM)在同一物理硬件上创建出有多台虚拟机器的环境。VMM分为两类:第一类虚拟机管理程序和第二类虚拟机管理程序前者运行在裸机上,后者依赖于底层操作系统
  4. 虚拟化比较通俗的理解:一台电脑里面可以用多几个系统。那么比较靠谱的说法是:

虚拟化技术就是在一台机器上模拟出独立的cpu、存储器等使得同一台主机能虚拟为多台主机或者多台主机能虚拟为一台主机。————CSDN 博主逃离地球的小小呆

  1. 虚拟化技术比较实在的好处一台电脑即可以在windows系统里面打英雄联盟,又可以在虚拟机里面学习并且用Linux操作系统。现在计算机专业的学生毕业出去说自己不会用Linux系统,那给HR的感受是:好家伙直接往我嘴里面塞了个电饭煲🌭🌭。
  2. 虚拟化技术的组成部分:VMM和对于硬件设备(CPU、内存、存储设备(硬盘、磁盘)、网络设备、I/O输入输出设备),接下来围绕这些部分进行讲解。

通过虚拟化技术实现的虚拟机一般被称之为GuestOS(客户机操作系统),而作为GuestOS载体的物理主机称之为HostOS(宿主操作系统)。
在这里插入图片描述

2. 虚拟化技术的优点?

  1. 可靠性:把各个服务放到独立的计算机上之后,如果一个服务器崩溃了,其他还可以正常运作。服务全放在一个电脑,服务器崩了怎么办,就如同写检讨书写了两个小时,刚按下结尾句号,蓝屏了(我***没保存),就只能再写一遍白给。做事情总要一个备份的嘛。
  2. 安全性:黑客即使攻陷了Web服务器,也不能立即看到敏感的电子邮件,这个性质有时候也叫沙盒。听说现在网络安全有个做法是,在电脑上做个虚拟机模拟当前的环境用来钓鱼,坏蛋攻击就记下IP地址,然后警察叔叔去抓人
  3. 省钱:确实上面两个性质可以通过放多几台电脑来减少崩溃丢失数据的风险,但是小钱包顶不住啊,电脑这么贵。物理机数量的减少节省了硬件和电力开销以及机架空间的占用。

  1. 设置检查点和虚拟机迁移(例如跨多台服务器进行负载均衡)比起普通操作系统上运行的迁移要容易得多:在后一种情况下,在操作系统中保留有关于每个进程的大量关键状态信息,包括打开的文件、计时器、信号处理程序等。而迁移虚拟机时,只需要迁移虚拟机的内存和磁盘镜像就能完成整个系统的迁移。
  2. 方便运行上古程序:在已停止支持或无法工作于当前硬件的操作系统(或操作系统版本)上运行遗留应用程序。遗留应用程序可以与当前应用程序同时运行在相同硬件上。事实上,能同时运行不同操作系统中的应用程序时虚拟机受欢迎的重要原因。通俗一点讲:就是代码屎山再利用
  3. 协助软件开发。程序员不需要在多台机器上安装不同操作系统来保证软件能在Windows 7、Windows 8、不同版本的Linux,FreeBSD、OpenBSD、NetBSD、OS X及其他操作系统上运行。相反,它只需要一台机器上创建一些虚拟机来安装不同的操作系统。当然,他也可以对磁盘进行分区,在每个分区上安装不同的操作系统,但这种方法更加困难。简单点比较好

  1. 虚拟装置:有了虚拟机之后,软件开发人员可以精心构造一个虚拟机,装上需要的操作系统、编译器、运行库和应用程序代码,固定整个虚拟机使之可以随时运行。这个虚拟机镜像可以刻录到CD-ROM或发布到网站上让用户安装或下载。这种方法意味着只有软件开发人员需要知道所有的依赖关系,客户得到的是能够实际运行的完整包,与它们使用的操作系统和安装的其他软件包、运行库完全无关。这类“盒装”的虚拟机通常称为虚拟装置
    在这里插入图片描述

3. 怎么样才配叫做一个虚拟机

现代操作系统上面说的很烂,这里的必要条件的第二条参考了:博客园博主又是火星人的《虚拟化的发展历程和实现方式》,网址:https://www.cnblogs.com/echo1937/p/7222606.html

虚拟机(Virtual Machine)的必要条件 :

  1. 虚拟机管理程序(Virtual Machine Monitor,VMM):往下管理底层硬件虚拟化,往上支持操作系统。

  1. 拥有自己的硬件(CPU、内存、网络设备、I/O设备、存储设备):对于底层硬件的虚拟化(等一下详细解释)而言,虚拟化技术的方式有三种:
    1. 全虚拟化( Full virtualization)(软件方面)GuestOS(客户机操作系统)可以直接在全虚拟化VMM上运行而不需要对GuestOS本身的核心代码做任何修改,全虚拟化的GuestOS具有完全的物理机特性。既VMM会为GuestOS抽象模拟出它所需要的包括CPU、磁盘、内存、网卡、显卡等抽象硬件资源,所以全虚拟化的GuestOS并不会知道自己其实是一台虚拟机。
    2. 半虚拟化(Paravirtualization)(软件方面)半虚拟化是需要GuestOS协助的虚拟化。因为在半虚拟化VVMM中运行的GuestOS,都需要将其内核源码进行都进过了特别的修改。半虚拟化VMM在处理敏感指令和内核态指令的流程上相对更简单一些。在半虚拟化VMM上运行的GuestOS都需要修改内核代码,主要是修改GuestOS指令集中的敏感指令核心态指令。让HostOS在捕抓到没有经过半虚拟化VMM模拟和翻译处理的GuestOS内核态指令或敏感指令时,HostOS也能够准确的判断出该指令是否属于GuestOS(GuestOS知道自己是虚拟机)。这样就可以高效的避免了上述问题。典型的半虚拟化软件有——Xen、KVM-PowerPC(简易指令集)。提供一层类似物理机器的软件接口,显示暴露出自身是一个虚拟化的环境。
    3. 硬件辅助虚拟化 HVM(硬件方面):2005年 — Intel提出并开发了由CPU直接支持的虚拟化技术。这种虚拟化技术引入新的CPU运行模式和新的指令集,使得VMM和GuestOS运行于不同的模式下(VMM=Root Mode;GuestOS=Non-Root Mode),GuestOS运行于受控模式,原来的一些敏感指令在受控模式下会全部陷入VMM,由VMM来实现模拟,这样就解决了部分非内核态敏感指令的陷入——模拟难题,而且模式切换时上下文的保存恢复由硬件来完成,这样就大大提高了陷入——模拟时上下文切换的效率 。该技术的引入使x86 CPU可以很容易地实现完全虚拟化。故皆被几乎所有之前分歧的各大流派所采用,包括KVM-x86,VMWare ESX Server 3,Xen 3.0 。

  1. 由VMM提供的高效、独立的计算机系统,

名词解释:模拟:仿照真实的计算机。


对于虚拟机来讲,非常重要的一点是要像 真实的机器那样运转。因此虚拟机管理程序(VMM)在一下三个维度上有良好的表现:

  1. 安全性:虚拟机管理程序应完全掌控虚拟资源。
  2. 保真性:程序在虚拟机上执行的行为应该与裸机上相同。
  3. 高效性:虚拟机中运行的大部分代码应该不受虚拟机管理程序的干涉。

4. VMM技术的分类:第一类和第二类虚拟机管理程序

VMM分为两类:第一类虚拟机管理程序(全虚拟化)和第二类虚拟机管理程序(半虚拟化)前者运行在裸机上,后者依赖于底层操作系统

从技术而言:

  1. 第一类虚拟机管理程序就像一个操作系统,因为它是唯一一个运行在最高特权级(也就是直接操控硬件)的程序。它的工作时支持真实硬件的多个虚拟机(virtual machine)拷贝,类似于普通操作系统支持的进程。
  2. 第二类虚拟机管理程序,也就是现在流行的VMare Workstation所用的,它是一个依赖于Windows、Linux等操作系统分配和调度资源的程序,很像一个普通的进程。当然,他还是会假装自己是个靠谱的操作系统,具有CPU和各种设备的完整计算机。
    在这里插入图片描述

运行在两类虚拟机管理程序上的操作系统都被称为客户操作系统(guest operating system)。 对于第二类虚拟机管理程序,运行在底层硬件上的操作系统称为宿主操作系统

第二类虚拟机管理程序有时又称作托管型虚拟机管理程序,依赖于Windows、Linux、OS X等宿主操作系统提供的功能。首次启动时,第二类虚拟机管理程序好像一个刚启动的计算机那样运行,期待找到一个包含操作系统的DVD、u盘这类的,这些驱动器可以是虚拟设备。接下来,虚拟机管理程序运行DVD上的安装程序,将操作系统安装到虚拟磁盘(virtual disk,其实只是宿主操作系统中的一个文件上)。客户操作系统安装好后,就能启动并运行。


5. CPU虚拟化(非常复杂)

cpu虚拟化指的就是把物理的cpu虚拟为多个虚拟cpu,从而实现一个cpu能被多台虚拟机共用,但是却相互隔离的场景。cpu的运转是以时间为单位的,cpu虚拟化要解决的问题主要是隔离和调度问题,隔离指的是让不同的虚拟机之间能够相互独立的执行命令,调度指的是VMM决定cpu当前在哪台虚拟机上执行。
由于x86体系设计的cpu在虚拟化上具有一定的缺陷(每个包含内核态和用户态的CPU都有一个特殊的指令集合,其中的指令在内核态和用户态执行的行为不同)所以我们有两种方法来实现cpu的虚拟化。其一是采用完全虚拟化的方式,利用动态指令转换或者硬件辅助来帮助实现cpu的虚拟化;其二是采用半虚拟化得方式,在客户的操作系统内核上进行一定的更改使得操作系统自己明白自己是虚拟机的角色,能够在VMM的管理下尽可能的访问硬件。


CPU虚拟化这一部分我是真的没有看懂那个《现代操作系统》到底在讲一些什么,我也是看了下面两个博文,我才比较明白。

  1. 博客园博主又是火星人的《CPU纯软件半虚拟化技术》,网址:https://www.cnblogs.com/echo1937/p/7227385.html
  2. . 博客园博主又是火星人的《CPU纯软件全虚拟化技术》,网址:https://www.cnblogs.com/echo1937/p/7222606.html
  3. 博客园博主又是火星人的《CPU硬件辅助虚拟化技术》,网址:https://www.cnblogs.com/echo1937/p/7218201.html

6. 内存的虚拟化

这一点内存虚拟化阅读之前,要有点虚拟内存的知识背景,这里不过多展开,贴一个链接完事:
简书博主:要上班的斌哥的《深入理解虚拟内存机制》,网址:https://www.jianshu.com/p/13e337312651

内存的虚拟化指的是把物理内存包装成若干虚拟内存来使用,把物理内存抽象出来,给每一台虚拟机都分配一个连续的内存空间。说的明白一点,物理内存是一块蛋糕,虚拟内存是分号的给你的最小的那个蛋糕——大的肯定给弟弟了嘛,内存的虚拟化是切蛋糕,你一块我一块。

一台电脑由硬件和软件两个部分组成,那么相应的虚拟机的内存虚拟化技术也有两个部分组成:影子页表和PET技术

下面参考资料那里有更加详细的讲解。

6.1 影子页表(软件部分)

参考了:CSDN博主sicofield的《影子页表》,网址:https://blog.csdn.net/sicofield/article/details/54863202

影子页表简化了内存地址映射的问题,让VMM程序不用每一次找个东西都要n次转换,加快了速度。对每台虚拟机,虚拟机管理程序都需要创建一个影子页表(shadow page table),将虚拟机使用的虚拟页映射到他分配给虚拟机的实际物理页上

什么都没有的时候,虚拟机内存映射的步骤:
在这里插入图片描述


创建了影子页表之后


在这里插入图片描述


通过创建一个影子页表,虚拟机的内存映射到实际物理内存可以直接两步到胃


但是影子页表有点比较捞的一点呢,缺页异常的时候它的花销很大。具体详情可以看下面参考资料。

6.2 EPT技术(硬件部分)

为了避免处理影子页表的巨大开销,芯片生产商添加了嵌套页表(nested page table)的硬件支持。嵌套页表是AMD使用的术语,Intel将其称为EPT(extend page table,扩展页表)两者目的相似,都是在无需陷入的情况下由硬件处理虚拟化引发的额外页操作,以此降低开销
在这里插入图片描述

7. I/O虚拟化

I/O 虚拟化在虚拟化技术中算是比较复杂,也是最重要的一部分。从整体上看,I/O 虚拟化也包括基于软件的虚拟化和硬件辅助的虚拟化,软件虚拟化部分又可以分为全虚拟化和半虚拟化,如果根据设备类型再细分的话,又可以分为字符设备 I/O 虚拟化(键盘、鼠标、显示器)、块设备 I/O 虚拟化(磁盘、光盘)和网络设备 I/O 虚拟化(网卡)等。

书上没有特别详细的说明,我找到了两个比较nice的文章,讲述的比较详细,可以看一下:

  1. 微信公众号:Linux云计算网络《I/O 虚拟化》,网址:https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247483764&idx=1&sn=93c492e6e72ff941a32033188de1ab02&chksm=ea7435ccdd03bcda43b3e4a9496982a899cddd926ab630da1e864c3ca27ad76a7f40fd271b07&scene=21#wechat_redirect
  2. 简书博主Linux云计算网络的《I/O 虚拟化的三种形式》,网址:https://www.jianshu.com/p/7a656326c439

7.1 I/O虚拟化的三种方式

这里简要说一下,I/O虚拟化的三种方式

  1. 全虚拟化(软件方面):通过纯软件的形式来模拟虚拟机的I/O请求。

以 qemu-kvm 来举例,内核中的 kvm 模块负责截获 I/O 请求,然后通过事件通知告知给用户空间的设备模型 qemu,qemu 负责完成本次 I/O 请求的模拟。更具体的内容可以翻阅前文。
优点:不需要对操作系统做修改,也不需要改驱动程序,因此这种方式对于多种虚拟化技术的「可移植性」和「兼容性」比较好。缺点:纯软件形式模拟,自然性能不高,另外,虚拟机发出的 I/O 请求需要虚拟机和 VMM 之间的多次交互,产生大量的上下文切换,造成巨大的开销。

  1. 半虚拟化(软件方面):使得 Guest 端与 Host 端可以建立连接,直接通信,摒弃了截获模拟这种方式,从而获得较高的性能。

优点:性能较 I/O 全虚拟化有了较大的提升。缺点:要修改操作系统内核以及驱动程序,因此会存在移植性和适用性方面的问题,导致其使用受限。

  1. I/O 直通或透传技术(Direct I/O Access)(硬件方面):直接让虚拟机独占一个物理设备,同时还有软件加以辅助,具体详情看链接,这里不过多诉述(最主要是比较麻烦)。

8. 网络设备的虚拟化

书上没有,我都是在别人的文章上看的。

网络虚拟化是让一个物理网络能够支持多个逻辑网络,虚拟化保留了网络设计中原有的层次结构、数据通道和所能提供的服务,使得最终用户的体验和独享物理网络一样,同时网络虚拟化技术还可以高效的利用网络资源如空间、能源、设备容量等。

网络虚拟化相对计算、存储虚拟化来说是比较抽象的,以我们在学校书本上学的那点网络知识来理解网络虚拟化可能是不够的。
在我们的印象中,网络就是由各种网络设备(如交换机、路由器)相连组成的一个网状结构,世界上的任何两个人都可以通过网络建立起连接。
带着这样一种思路去理解网络虚拟化可能会感觉云里雾里——这样一个庞大的网络如何实现虚拟化?
其实,网络虚拟化更多关注的是数据中心网络、主机网络这样比较「细粒度」的网络,所谓细粒度,是相对来说的,是深入到某一台物理主机之上的网络结构来谈的。
如果把传统的网络看作「宏观网络」的话,那网络虚拟化关注的就是「微观网络」。网络虚拟化的目的,是要节省物理主机的网卡设备资源。从资源这个角度去理解,可能会比较好理解一点。

这是一个非常复杂的事情,具体可以看下面链接

  1. 博客园博主Linux云计算网络的《网络虚拟化》,网址:https://www.cnblogs.com/bakari/p/8037105.html
  2. 博客园博主Linux云计算网络的《虚拟机网络模型详解,看这篇就够了(图文并茂)》,网址:https://www.cnblogs.com/bakari/p/10592421.html
  3. 博客园博主Linux云计算网络的《从 Bridge 到 OVS,探索虚拟交换机》,网址:https://www.cnblogs.com/bakari/p/8097439.html

蹭上面博主文章的一个图片,做装饰,来源:博客园博主Linux云计算网络的《虚拟机网络模型详解,看这篇就够了(图文并茂)》,网址:https://www.cnblogs.com/bakari/p/10592421.html
在这里插入图片描述

9. 存储设备的虚拟化(硬盘)

这个书上也没有讲解,我也是看别人的文章才弄明白,这里简略介绍。


根据网络存储工业(Storage Network Industry Association,简称SNIA)的定义:通过将存储系统/子系统的内部功能从应用程序、计算服务器、网络资源中进行抽象、隐藏或隔离,实现独立于应用程序、网络的存储与数据管理

参考文章:博客园博主世民谈云计算的《虚拟化 - 存储虚拟化》,网址:https://www.cnblogs.com/sammyliu/articles/4389392.html

10. 云的介绍

在云计算令人炫目的崛起背后,虚拟化技术起到了决定性作用。
在这里插入图片描述
云有很多种,一些云是公有的、可以为任何付费者提供资源,另外一些则是某个机构私有的。不同云的功能也有所不同。一些云允许用户访问物理硬件,但大多数云会将物理环境虚拟化。一些云除了物理裸机或虚拟裸机外不提供任何软件,另外一些则提供可随意组合并直接使用的软件,或是简单方便地新服务开发平台。云提供商通常提供不同类型地资源,例如既有“大机器”,又有“小机器”。

美国国家标准与技术研究院(National Institute of Standards and Technology)列出云的五条必要特征:

  1. 按需自助服务:无需人为操作就能自动为用户提供资源。
  2. 普适的网络访问:所有资源都可以通过网络用标准化的机制访问,以支持各种异构设备。
  3. 资源池:云提供商拥有的资源可以服务于多个用户并动态再分配,用户通常不知道他们使用的资源的具体位置。
  4. 快速可伸缩:能根据用户需求弹性甚至是自动的获取和释放资源。
  5. 服务可计量:云提供商按服务类型计量用户使用的资源

11. 参考资料

  1. CSDN博主逃离地球的小小呆的《虚拟化技术详解》,网址:https://blog.csdn.net/gui951753/article/details/81045508
  2. CSDN博主sicofield的《影子页表》,网址:https://blog.csdn.net/sicofield/article/details/54863202
  3. CSDN博主handw的《Xen的敏感指令陷入-《Xen虚拟化技术》学习》,网址:https://blog.csdn.net/handw/article/details/5770554
  4. 博客园博主又是火星人的虚拟化专栏《随笔分类 - Virtualization》,网址:https://www.cnblogs.com/echo1937/category/1086868.html
  5. 博客园博主公众号:Linux云计算网络的虚拟化专栏《虚拟化》,网址:https://www.cnblogs.com/bakari/tag/%E8%99%9A%E6%8B%9F%E5%8C%96/
  6. 博客园博主世民谈云计算的《虚拟化 - 存储虚拟化》,网址:https://www.cnblogs.com/sammyliu/articles/4389392.html
  7. 简书博主要上班的斌哥的《深入理解虚拟内存机制》,网址:https://www.jianshu.com/p/13e337312651
  8. 现代操作系统(原书第四版)P267-P290
    在这里插入图片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章