【原创】虚拟化技术及实时虚拟化概述

版权声明:本文为本文为博主原创文章,未经本人同意,禁止转载。如有问题,欢迎指正。博客地址:https://www.cnblogs.com/wsg1100/

实时虚拟化技术是一种针对实时应用场景的虚拟化技术,它要求在保证虚拟化优势的同时,满足严格的时间约束和高可靠性要求。本系列文章文将对实时虚拟化技术进行介绍,分析其原理、特征、关键技术和难点,以及应用场景。

一、前言

  • 虚拟化技术是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境。
  • 虚拟化技术最早出现在20世纪60年代的IBM大型机系统,在70年代的System 370系列中逐渐流行起来。随着云计算、物联网等新兴技术的发展,虚拟化技术也得到了广泛的应用和创新。
  • 虚拟化技术可以提高资源利用率、简化管理复杂度、增强系统灵活性和可扩展性等优势。同时,也带来了一些新的需求和挑战,如如何保证虚拟环境中的实时性、可靠性、安全性等。

二、分时系统

现代系统级虚拟机的快速发展,实际上是源于分时系统的设计思路。主要解决物理硬件资源共享和利用的问题,分时系统起源可以追溯到上世纪60年代的分时系统,上世纪 60 年代之前,计算机还都是大型机,主要用于科学研究使用,是异常昂贵的设备,因为大型机价格昂贵,所以如何让多个用户共享一台大型机成为很多人思考的问题,而后诞生了分时操作系统。

1954年,约翰·瓦格纳·巴克斯(John Warner Backus,后面设计了FORTRAN语言) 就在MIT举办的“数学计算机高级编码暑假班”上提出了分时系统的想法,他指出,使用分时(time sharing)方法,一台大计算机就可以当做很多个小的来用,每个用户只需要一个阅读工作站(reading station)。

1962年秋,BBN分时操作系统在诞生BBN公司诞生,BBN分时操作系统基于PDP-1b开发,系统的内存空间为8192字,其中4096保留给分时系统使用,另外4096字给用户使用。系统设计的基本思路是根据当前用户来切换用户部分内存,成为内存交换(memory swap)。当切换用户时,把 上一个用户使用的内存交换到高速的磁鼓中保存,并把新用户的数据从磁鼓中加载到内存中,磁鼓上的空间被分为22个区域,每个区域大小为4096字。每个用户在获得使用机会时,它的程序可以运行140毫秒。

在软件历史上,BBN的分时操作系统是较早实践和投入使用的多用户操作系统,为后来UNIX等操作系统的出现奠定了基础[1]

分时系统使得个人用户、小公司或机构不必自己购买昂贵的电脑。只需要购买一个输入输出终端,就像购买一套鼠标、键盘和显示器等设备,然后通过电话线连接到机房中的大型计算机。该计算机会自动分配计算时间给程序或任务。

三、虚拟化介绍

那么,什么是虚拟化技术呢?虚拟化技术同样是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境,进而发挥计算机硬件的最大利用率。

虚拟化技术的发展经历了几个阶段,虚拟化技术最早出现在大型机时代,用于将硬件资源划分为多个虚拟计算机。上世纪60年代,IBM开始在其CP-40大型机系统中尝试虚拟化的实现,后来在System/360-67中采用,并衍生出VM/CMS到后来的z/VM等产品线。

随着时间推移,微型计算机和PC能够提供更为有效、经济的方法来对资源进行分配和处理,所以到20世纪80年代之后,虚拟技术不再被广泛使用[2]。 直到 21 世纪,随着云计算的兴起,虚拟化技术再次成为热门话题,虚拟化技术也得到了广泛的应用和创新,并逐渐走向成熟。所以虚拟化技术是云计算的核心技术之一,通过虚拟化技术,可以将一台物理服务器划分为多个虚拟服务器,并将其作为服务提供给用户,实现资源的动态调度和按需使用。

虚拟化分为很多种,服务器虚拟化只是其中之一,还可以用于创建存储、网络和其他物理机的虚拟表示。常见的类型有服务器虚拟化、桌面虚拟化、网络虚拟化、存储虚拟化、数据虚拟化应用虚拟化等。它们都可以帮助用户节省成本,简化管理,提高效率和灵活性。无论是公有云还是私有云,都离不开虚拟化技术的支持,它让云提供商和云用户都能够根据不同的业务需求,灵活地扩展计算资源。

四、虚拟化实现方式及分类

虚拟化技术听起来很高大上,但虚拟化技术应用场景不只有云计算,它其实很早就在我们身边,给我们带来了很多便利。

我们的个人电脑越来越强大,我们不需要花钱买新的硬件,只需要下载一些免费或者低价的虚拟化软件,比如 VMware Workstation Player 或者 Oracle VM VirtualBox虚拟化软件,就可以在一台电脑上同时使用多种操作系统,无论是 Windows,Mac 还是 Linux,都可以随心所欲地切换。这样就可以在同一个设备上完成不同的任务,比如开发软件,或者学习新的技能,体验不同的OS;再比如,电脑上安装安卓模拟器来玩安卓游戏或做安卓APP开发调试等等。

虚拟化应用场景很多,实现虚拟化的方式有全虚拟化半虚拟化硬件辅助完全虚拟化操作系统级虚拟化等。

  • 全虚拟化技术通过在客户操作系统和硬件之间捕捉和处理那些对虚拟化敏感的特权指令,使客户操作系统无需修改就能运行,该技术在 1999 年出现,里面又包含了解释执行(如 Bochs)、扫描与修补(如 VirtualBox)、二进制代码翻译(如 Vmware、Qemu)三种技术。

  • 半虚拟化技术需要对客户操作系统进行一些修改,使客户操作系统意识到自己是处于虚拟化环境的,该技术在 2003 年出现,也叫类虚拟化技术,典型的 Hypervisor 代表是 Xen。

  • 硬件辅助完全虚拟化技术利用处理器中的虚拟化扩展(如Intel 的 VT-x 和 AMD 的 AMD-V)来加速虚拟机的性能,该技术在 2006 年出现。

    • 硬件结构支持,且有相应实现:包括
      • 模式切换:Host CPU<->Guest CPU切换,即CPU资源隔离。
      • 二阶段地址转换:GVA->GPA和GPA->HPA, 即内存资源隔离。
      • 中断控制器支持:中断注入和透传,即中断资源隔离。
      • IOMMU: Input-Output Memory Management Unit, DMA Remapping。DMA和设备访问内存隔离。
    • 相关软件支持:包括
      • Firmware:OpenSBI, BIOS
      • Hypervisor:KVM,XEN
      • I/O用户态:qemu
      • OS

    当前云计算普遍使用的主流虚拟化技术,就是以 KVM 为代表的硬件辅助的完全虚拟化。

  • 操作系统级虚拟化技术则通过在同一台物理服务器上运行多个隔离的用户空间实例来实现虚拟化,也就是容器技术,容器是一种轻量级的虚拟化技术,能够在单一主机上提供多个隔离的操作系统环境。

上面简单介绍了虚拟化的实现方式,不同的实现方式效率不同,它们之间暗含了虚拟化技术发展经历。如果我们想知道一个虚拟化产品基于哪些虚拟化技术,我们一般听到的是type1和type2这类词,这指的是这些虚拟化技术的分类,分为以下几种:

模拟器

模拟器是指基于全虚拟化技术实现的一种软件,可以模拟一个不同于本身的计算机系统或者硬件设备,并且可以执行该系统或者设备的程序或者指令。模拟器通常需要对目标系统或者设备的指令进行解释或者翻译,然后在本身的系统或者设备上执行。在这个过程中,我们把原先的操作系统叫作宿主机(Host OS),把能够有能力去模拟指令执行的软件,叫作模拟器(Emulator),而实际运行在模拟器上被“虚拟”出来的系统呢,我们叫客户机(Guest VM)。

这种方式的优点是可以实现跨硬件平台的运行,比如在x86平台上模拟ARM平台。缺点是性能很差,因为有很多解释或者翻译工作。另外是做不到精确模拟,一些模拟的硬件程序运行要依赖特定的电路乃至电路特有的时钟频率,想要通过软件达到 100% 模拟是很难做到。这种方式主要用于游戏、教育、娱乐等场景,提供趣味、创新、体验等功能。常见的模拟器有Android模拟器、MAME、QEMU,游戏模拟器等。

Type2虚拟化

Type2虚拟化也叫主机式虚拟化,是指在一个已经安装了操作系统(Host OS)的物理硬件上,运行一个虚拟机监视器(Hypervisor),它作为一个应用程序,管理多个虚拟机(Guest VM)。每个虚拟机也有自己的操作系统和应用程序,但是它们需要通过Hypervisor和Host OS来访问硬件资源。这种虚拟化技术的优点是兼容性好,因为可以在各种操作系统上运行,而且可以支持不同的硬件平台。缺点是性能低,因为有额外的中间层和转换开销,客户机的操作系统把最终到硬件的所有指令,先发送给虚拟机监视器。虚拟机监视器再把这些指令交给宿主机的操作系统去执行。

Type2虚拟化只是把在模拟器里的指令翻译工作,挪到了虚拟机监视器里。主要用在我们日常的个人电脑和开发测试场景,提供方便、快速、多样的计算环境。常见的Type2虚拟化产品有VirtualBox、Vmware workstation、Xvisor、Lguest等。

Type1 虚拟化

Type1虚拟化:也叫裸机虚拟化,是指直接在物理硬件上运行一个虚拟机监视器(Hypervisor),一般虚拟机监视器其实并不是一个操作系统之上的应用层程序,可能是一个嵌入在操作系统内核里面的一部分,能够直接操作控制硬件并管理多个虚拟机(Guest VM)。每个虚拟机都有自己的操作系统和应用程序,可以完全独立运行。Type 1虚拟化通常使用半虚拟化、硬件辅助虚拟化或一些混合形式来实现。

Type1与type2虚拟的主要差别是type1虚拟机监视器(Hypervisor)能直接操作控制硬件。这种虚拟化技术的优点是性能高,因为虚拟机可以直接访问硬件资源,没有多余的开销。缺点是兼容性差,不能像 Type-2 型那么好,因为不同的硬件平台可能需要不同的Hypervisor。type1虚拟化技术应用场景广泛,进一步可以分为:

a. “传统”Hypervisor

如上图,这种Hypervisor主要用于数据中心和云计算场景,提供高效、灵活、可扩展的计算资源。代码量大,功能齐全,有专用虚拟化硬件:网卡、磁盘、图形适配器等;使用半虚拟化、硬件辅助虚拟化或一些混合形式来实现。典型代表:KVM(Kernel Virtual Machine), Xen,VMWare ESX Server,微软 Hyper-V。

b. 普通嵌入式Hypervisor

这种Hypervisor主要用于通用嵌入式系统。不考虑实时性,如同时运行安卓和linux,Hypervisor提供CPU虚拟化,提供N:1 虚拟到物理 CPU 映射和调度,IO 设备模拟、硬件直通访问等特性,具有合理的代码量100K-10K SLoC(Source lines of code),典型代表:XvisorACRN

c. 微内核 Hypervisors

这种Hypervisor主要用于对功能安全(security, safety and reliability)有要求嵌入式系统。在航空电子设备、自动驾驶、医疗设备、关键基础设施和国防等行业,要求安全性、隔离性和健壮性,意味着软件具备设计安全(Formal verification-形式验证),典型代表:seL4、NOVA;

d. 硬件静态分区Hypervisors(Static Partitioning Hypervisors)

这种Hypervisor主要用于实时与非实时混合关键性系统,且更关注实时性、硬件强隔离。以上几种Hypervisor或多或少提供了GutsOS硬件虚拟化,如CPU虚拟化(提供N:1 虚拟到物理 CPU 映射和调度),IO 设备虚拟化,也就是说GustOS共享Hypervisors管理的硬件,而硬件静态分区Hypervisors不提供这些机制,代码量较小5K-10K SLoC。

为什么要强隔离呢?我们工业实时控制、医疗、汽车、通信等实时实时场景下的虚拟化,因为实时应用场景的特殊性,通常Gust OS不仅包含Windows/linux等系统负责人机交互等非实时工作,Gust OS还包含RTOS或裸机应用程序,负责实时相关控制和应用。

为保证Gust OS的实时性,Gust OS必须独占硬件资源,包括CPU 1:1映射、设备直通访问、RAM资源静态分配、硬件中断直通等,这样才能保证Gust OS访问硬件的实时性,并且系统运行过程中非特殊情况严禁Hypervisor介入,不能像云计算场景下Hypervisor那样可以将多个Gust OS在同一个CPU上调度,否则会引入额外的延迟,无法保证Gust OS运行的确定性,这就是为什么要强隔离。

另外虽然Hypervisors实现了硬件分区,但硬件层面很多资源还是共享的,比如共享内存总线带宽、LLC cache等,非实时GustOS的io负载增加(例如网络流量、磁盘等),会导致总线拥塞或缓存冲突,进而影响实时Gust OS的实时性,所以一些分区Hypervisors还会根据硬件特性,对内存总线带宽进行划分,缓存着色Cache Coloring (Partitioning)等方式来降低Gust OS之间对实时性的影响。

因为硬件分区虚拟化Hypervisor直接控制硬件,所以它还是属于Type1虚拟化类型。典型代表 jailhouseBao、Xen Dom0-less、QNX Hypervisor、vxworks Hypervisor、ACRN等。

这里简单提一下:jailhouse项目负责人与xenomai X86平台maintainer是同一人 jan-kiszka

注意:虽然Hypervisor实现了硬件分区,但判断一个分区Hypervisor,是否是实时Hypervisor,要看GustOS运行过程中是否需要Hypervisor介入,如果实时操作系统运行过程中需要Hypervisor介入,Gust RTOS实时性取决于Hypervisor介入时间,实时性可能完全没有保证,那这个Hypervisor就不是一个实时Hypervisor。

综上,若只关注实时,硬件静态分区Hypervisors、微内核 Hypervisors均可用于实时应用场景。

容器(Container)

虽然,Type-1 型的虚拟机看起来已经没有什么硬件损耗。但是,这里面还是有一个浪费的资源。那就是每一个虚拟机,都运行了一个属于自己的单独的操作系统。

2005 年,诞生了一种新的虚拟化技术,容器技术。容器是一种轻量级的虚拟化技术,能够在单一主机上提供多个隔离的操作系统环境,通过一系列的命名空间隔离进程,每个容器都有唯一的可写文件系统和资源配额。

容器技术是一种利用操作系统级虚拟化来实现,操作系统内核提供的资源隔离和控制功能,创建出多个相互隔离但共享内核的用户空间实例。容器技术的的代表项目就是 Docker,Docker 是 Docker 公司在 2013 年推出的容器项目,因为轻量、易用的特点,迅速得到了大规模的使用。Docker 的大规模应用使得系统资源的形态由虚拟机阶段进入到了容器阶段。

Docker是一种实现了容器技术的软件平台,它提供了创建、管理、分发容器的工具和服务。Docker的优点是启动快速、占用资源少、移植方便、可扩展性强等。缺点是安全性较低,因为容器之间共享内核,可能存在漏洞或攻击风险。Docker主要用于微服务架构、持续集成部署等场景,提供高效、灵活、可靠的应用交付能力。

与虚拟机不同,容器共享主机操作系统内核,并且不需要单独的 Guest OS,这使得容器更加轻量级,并且启动速度更快。

每个容器都可以运行一个或多个应用程序,并且具有自己的文件系统、网络配置、进程空间等。

Docker (容器)通过 Linux Namespace 技术来进行资源隔离,通过 Cgroup 技术来进行资源分配,具有更高的资源利用率。Docker 跟宿主机共用一个内核,不需要模拟整个操作系统,所以具有更快的启动时间。在 Docker 镜像中,已经打包了所有的依赖和配置,这样就可以在不同环境有一个一致的运行环境,所以能够支持更快速的迁移。另外,Docker 的这些特性也促进了 DevOps 技术的发展。

除docker 外,还有在 Linux 系统的容器中运行整个 Android 用户空间的技术--Waydroid ,它在一个容器中运行一个完整的 Android 系统,其方式与在 Fedora 上的容器中运行 Debian 一样。这使Waydroid 拥有比在虚拟机或模拟器中运行更好的性能。

容器 VS 虚拟机

一个例子是,嵌入式Linux开发中,假设我们的物理机是Ubuntu 20,但是我们的linux SDK要求基于Ubuntu 14或16,你有两种选择:一种是使用虚拟机,另一种是使用Docker。

如果你使用虚拟机,你需要为每个虚拟机分配一定的内存、磁盘空间和CPU资源,并且安装完整的Ubuntu系统。如果你使用Docker,你只需要从Docker Hub上拉取两个Ubuntu镜,像然后在容器中运行它们,就可以享受不同版本的Ubuntu环境了,无需创建新的虚拟机。这样做的好处是,Docker容器占用的资源更少,启动的速度更快,而且更容易管理

这里有个一个容器与虚拟机的对比[2:1]

特性 容器(Docker) 虚拟机
启动时间 秒级 分钟级
硬盘占用量 一般为MB 一般为GB
性能 接近原生 弱于原生
系统支持量 单机支持上千个容器 一般几十个
资源使用率
环境配置 自带配置,基本不需要 不带配置,需要全量配置

四、总结

本文简单介绍了虚拟化技术的分类和发展经历。应用领很广,我们应用开发中,或多或少都会使用到部分虚拟化相关技术。

由于本博客主要集中于工业实时控制、汽车、通信等实时场景下的基础软件技术分享。行业内常用的是实时虚拟化技术,所以后面的文章主要集中在实时虚拟化(具体的实时Hypervisor是ACRN和jailhouse),敬请关注!

五、参考链接


  1. 《软件简史》张银奎著 ↩︎

  2. https://time.geekbang.org/column/article/414159
    3.http://gk.link/a/126YZ ↩︎ ↩︎

posted @ 2023-07-16 20:47  沐多  阅读(1778)  评论(1编辑  收藏  举报