Advertisement

Understanding the Three Types of Hypervisors and How Th

阅读量:

作者:禅与计算机程序设计艺术

1.简介

虚拟化技术是一种将计算资源进行仿生或复制以满足多用户需求的技术。它能够通过硬件加速等方式支持虚拟机在物理服务器上运行,并通过资源隔离等方式实现性能上的提升。hypervisor 作为其中的核心技术有三种主要类型:第一类 hypervisor 作为基础型设计,在实际应用中使用广泛。这种设计提供了逻辑上的抽象功能,在同一个物理系统中允许多个操作系统并存,并为每个操作系统分配独立的 CPU 和内存资源;第二类 hypervisor 基于 Xen 或 KVM 操作系统内核的功能实现了对硬件设备的完全虚拟化支持;第三类 hypervisor 则采用用户空间模拟器的方式实现功能模拟机制,例如 VMware 的 ESXi 系列产品等。这些不同类型的设计在支持硬件设备的程度以及架构实现方式等方面均存在差异,具体表现为对硬件的支持程度不同、架构实现方式不同、管理复杂度不同以及部署难度不同等特性方面存在差异。因此,在选择合适的 hypervisor 时,请根据具体场景进行评估与分析;本文将深入阐述这三种主要类型的 hypervisor 及其工作原理,并提供选择适合自身需求 hypervisor 的建议。

2.基本概念术语说明

2.1 Hypervisor

The virtual machine monitor, also referred to as a virtual machine monitor, functions as a software layer within computer systems. It provides an environment that allows multiple operating systems to coexist on a single physical server while sharing the host's hardware resources. Because hypervisors exhibit characteristics akin to hardware components (e.g., CPUs and disks), they are commonly referred to as virtual machine hosts. In the current era of cloud computing and containerization, 'hypervisor' has become a widely discussed topic.

2.2 Virtualization Technologies

2.2.1 Type I Hypervisor (Native Hypervisor)

主要 hypervisor 是最常用的类型, 通常称为 Native Hypervisor. 它无需额外安装即可直接运行于宿主操作系统上, 所有虚拟机均直接运行于宿主操作系统内核上. 尽管是真实的实体存在, 虚拟机操作系统却无法感知这些实体, 只能看到本系统的专用指令集和处理器. 该类型 hypervisor 基于基础指令集以及特权模式运行, 因此具备较高的运行效率, 但却受限于无法利用宿主操作系统的高级特性如超线程或多处理器技术等.

2.2.2 Type II Hypervisor (Xen or KVM based Hypervisor)

第二种 hypervisor 由 Xen 或 KVM 基于 Linux 操作系统内核功能构成,并实现了对硬件设备的完全虚拟化处理。该方法从而提升了整体运行效率,并且其采用的指令集与宿主操作系统相似但会隐藏底层硬件细节如 CPU 缓存和 TLB。Type II hypervisor 通常允许多颗 CPU 同时运行虚拟机,并且支持多种操作系统类型包括 Windows、Linux 和 Solaris。

2.2.3 Type III Hypervisor (User-Space Emulator)

第三类 hypervisor 通过在用户空间构建模拟器来实现功能;例如 VMware 的 ESXi 系统。这些 hypervisors 并未直接由宿主的操作系统内核执行,在用户空间中模拟了一个完整的硬件架构;所有操作系统、应用程序和服务都在同一个虚拟环境中运行;这些虚拟机会根据需求灵活组合配置,并充分运用宿主操作系统的特性;尽管这些 hypervisors 提供了更高的灵活性程度;然而,在部署、调试和管理过程中会面临较高的复杂度

2.3 Virtual Machines (VMs)

VMs(虚拟机)是基于 hypervisor 架构设计出的一种功能完善的计算资源分配方案。通过该方案实现操作系统的逻辑隔离与资源共享,在服务器端部署多台独立的操作系统实例。
虚拟机不仅支持多种功能组件的独立运行,还能够涵盖操作系统内核、应用程序以及相关服务等多个层次的功能模块。

2.4 Guest Operating Systems (Guest OS)

guest operating system(客体操作系统)主要指 virtual machines internal operating systems。这些系统的资源通常是隔离的,在 host computer 上无法直接获取。当前最常见的是 Windows、Linux 和 Solaris 等操作系统。

2.5 Processors, Memory, Storage Devices

These include processors, memory units, and storage hardware components. They are also the fundamental building blocks that a hypervisor can provide resources to.

2.6 Virtualization Layers

Virtualization layers (虚拟化层)也称虚拟化架构(Virtualization Layers),指的是由hypervisor(通常称为Virtualization Engine, VE)、managing software, hardware,以及operating system协同作用形成的完整软件系统。其中,hypervisor位于最外围层,负责为虚拟机管理提供底层支持;managing software则通过实现与用户之间的交互接口,能够控制虚拟机的创建、启动、关闭及迁移操作;而硬件和operating system共同提供了最基础的资源支持,包括处理器(CPU)、内存(RAM)、网络设备等关键组件。

2.7 Virtualization Software Architecture

Virtualization software architecture (虚拟化软件架构)指的是采用虚拟化平台设计模式的一种方法学框架,主要用于阐述hypervisor(虚拟处理器)、managing agent(管理程序)、hardware(硬件设备)与operating system(操作系统)之间的相互关系及协调机制。具体来说,则包括以下三种主要结构形式:

  1. Physical Layer - 物理层:外围的物理设备集合构成了底层功能。
  2. Virtualization Layer - 虚拟化层:基于hypervisor构建的应用程序能够隔离并运行。
  3. Application Layer - 应用层面:以Guest OS形式存在的操作系统负责处理应用程序逻辑。

2.8 Resource Isolation

Resource isolation (资源隔离)必须是指当多个虚拟机共享一个物理设备时,必须限制其中一个或多个虚拟机独占该设备.例如,在两个虚拟机同时申请同一块内存时,应确保它们获得不同的内存分配.

2.9 Consolidation & Sharing

Virtual Machine Consolidation & Resource Sharing refers to the process of integrating multiple virtual machines into a unified whole, enabling the efficient utilization of shared resources. For instance, it is possible to consolidate two virtual machines from different physical servers into a single virtual machine, which will possess double the processing power, memory capacity, and storage resources compared to individual machines.

2.10 VM Mobility

VM迁移性(VMmobility)指的是虚拟机可以在目标服务器之间实现动态迁移。这些目标服务器既可以基于相同的虚拟化平台配置运行(即使用相同的hypervisor),也可以基于不同的虚拟化平台配置运行(即采用不同的virtualization platforms)。

2.11 Fault Tolerance

容错能力(容错性)即为此。它指的是虚拟机必须始终能够正常运行,并且即使发生意外故障也不会影响其他虚拟机的操作。

3.Core Algorithm and Operations for Each Type of Hypervisor

为了便于读者深入理解每种 hypervisor 的工作原理,请详细阐述这些核心算法的操作流程和执行机制。

3.1 First Class Hypervisor (Native Hypervisor)

首先对第一类 hypervisor —— Native Hypervisor 进行介绍。该 hypervisor 类别完全集成于宿主的操作系统内核之中,在这种架构下所有的虚拟机都会直接受到宿主机系统的直接影响并运行在其内核之上。该 hypervisor 使用基础指令集并采用特权模式实现功能从而具有高效的执行性能但它无法充分利用宿主机系统的高级特性

Native Hypervisor 的管理程序运行在宿主机的操作系统中,它的职责是:

  1. 实时监控并调度GuestOS作业流程。
  2. 在宿操作系统上部署 guest 虚拟机。
  3. 将 guest 操作系统资源分配到物理内存地址空间。
  4. 在 guest 操作系统内运行应用逻辑服务实例。

在虚拟机的创建过程中, 虚拟机的管理机制首先会生成一个新进程, 然后通过调用系统提供的操作来生成一个新的地址空间. 这个地址空间包括guest操作系统所需的各类文件, 如代码段. 数据段. 堆栈等. 当进程被调度投入运行时, 系统会进入内核态, 此时guest操作系统即可启动并执行自身的代码.

当 Guest OS 执行完毕后, 系统切换至用户态, 并由管理机制回收相关虚拟机资源.

3.2 Second Class Hypervisor (KVM/Xen Based Hypervisor)

下面将介绍第二种基于虚拟化技术的 hypervisor——KVM/Xen Based Hypervisor。其中 KVM 简称代表 Kernel-based Virtual Machine 技术。从其名称可知,则是一种基于Linux内核设计的虚拟机监视器。与传统 Native Hypervisor 类似,在底层操作系统提供的基础指令集上运行,并采用特权模式以实现资源隔离功能。然而它区别于传统类型在于可以通过 QEMU 等工具模拟相应的硬件配置,并支持更多细节层面的操作机制。例如,在内存管理方面可模拟 CPU 寄存器、MMIO(Memory-mapped I/O)设备以及中断控制器等多种功能模块的工作流程。

与 Native Hypervisor 相比,KVM 有如下优点:

  1. 更高效地使用计算资源。
  2. 允许多种操作系统运行。
  3. 通过统一的管理接口:
    • 采用智能配置生成虚拟机实例;
    • 配置存储和网络参数;
    • 通过统一接口快速转移虚拟机到新环境;
    • 部署到目标服务器进行复制操作

Xen 作为 Xetteren’s Universal Network Virtualisation Environment 的缩写,在软件领域中被广泛采用作为一种通用网络虚拟化环境(NVE)解决方案。该方案旨在提供一个开源解决方案以支持虚拟化服务器的操作和管理,并通过硬件实现完全虚拟化的架构以提升资源利用率和灵活性。例如以下几点:稳定性、可扩展性、高效率等。

  1. 更高的系统处理效率。
  2. 对共有资源的严格保障。
  3. 无需额外管理软件依赖且便于部署

与 KVM 相比,Xen 有如下优点:

  1. 该系统能够充分地利用硬件资源。
  2. 该软件能够兼容多种操作系统。
  3. 该软件能够兼容 Virtuozzo、OpenVZ 和 DomU 等非 Linux 操作系统。

在创建新虚拟机的过程中,在其生命周期刚开始时,KVM会随后为其生成一个独立的运行环境,随后通过系统调用机制并生成一个新的虚拟机实例.这一实例将包含 guest操作系统所需的所有基础资源,包括但不限于代码段、数据段以及堆栈等存储结构.当该虚拟机会被调度进入运行状态时,KVM将切换到内核态模式,从而使得 guest操作系统能够启动并开始执行其自身的代码.

当 Guest OS 启动完成后,KVM 将会迁移至宿主机操作系统,并释放相应的虚拟机实例资源。

3.3 Third Class Hypervisor (User-space Emulator)

最后介绍第三种类型的虚拟化类型——用户空间模拟器。这种类型不直接由宿主操作系统的内核执行。而是在用户空间模拟一个完整的硬件系统。作为管理程序(如VMware ESXi),它们在宿主机的操作系统中运行。它提供了一个图形界面,在此界面中用户可以创建、管理和转移虚拟机。

管理程序负责协调多个用户空间模拟器运行,并每个模拟器都代表了一个完整的硬件架构。该系统能够将一系列关键配置参数转化为统一的模板文件,并在此基础上构建出完整且功能齐全的虚拟环境。当实际运行需求出现时,管理程序会向对应的模拟器中导入目标虚拟机配置,并通过VNC等远程访问手段进行实时沟通以完成操作流程。

与另外两类 hypervisor 的区别在于,该系统由一个专门负责管理和维护用户空间模拟器与硬件资源的关系问题,无需处理硬件资源本身,从而能够更好地优化系统性能.然而,由于用户空间模拟器必须模仿硬件组件的行为模式,这就导致该系统在运行过程中必须消耗更多的计算资源.此外,为了支持不同种类的操作系统环境需求,该系统架构必须能够灵活应对各种操作系统的功能特性差异,从而使得实际部署和配置工作变得更加复杂.

4.Code Examples and Explanations

最后给出一些代码示例,帮助读者了解各个模块的作用。

4.1 Code Snippet for Setting Up a New Virtual Machine Employing a Type I VM Hardware Platform (Self-contained Hypervisor Architecture)

复制代码
    import mmap
    import resource
    
    class MyVirtMachine(object):
    
    def __init__(self, vm_id, memory_size=1024*1024*1024, num_pages=1024):
        self._vm_id = vm_id
        self._memory_size = memory_size
        self._num_pages = num_pages
    
        # allocate virtual address space for this machine
        rsrc = resource.RLIMIT_AS
        soft, hard = resource.getrlimit(rsrc)
        if soft == resource.RLIM_INFINITY:
            soft = memory_size 
        else:
            soft = min(soft, memory_size * 2)
        memlock_limit = soft + hard
        resource.setrlimit(resource.RLIMIT_MEMLOCK, (-1, memlock_limit))
    
        self._memfile = open('/dev/mem', 'rw')
        self._vaddr = mmap.mmap(-1, memory_size, flags=mmap.MAP_SHARED|mmap.MAP_ANONYMOUS, prot=mmap.PROT_READ | mmap.PROT_WRITE)
    
    @property
    def id(self):
        return self._vm_id
    
    def create_process(self, executable_path, args=[]):
        pass
    
    def execute(self, process):
        pass
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

4.2 Code Example for Creating a New Virtual Machine with Type II Hypervisor (KVM based Hypervisor)

复制代码
    #include <iostream>
    #include <stdlib.h>
    #include "libvirt/libvirt.h"
    #include "libvirt/virterror.h"
    #include "libvirt/libvirt-domain.h"
    
    
    int main() {
      virConnectPtr conn;
    
      /* Connect to libvirt daemon */
      conn = virConnectOpen("qemu:///system");
    
      /* Check connection status */
      if (!conn) {
      std::cerr << "Failed to connect to qemu:///system" << std::endl;
      exit(EXIT_FAILURE);
      }
    
      /* Create new domain */
      virDomainPtr dom = NULL;
      dom = virDomainCreateXML(conn, "<domain><name>mytest</name></domain>", 0);
    
      /* Check creation status */
      if (!dom) {
      std::cerr << "Failed to create domain" << std::endl;
      virConnectClose(conn);
      exit(EXIT_FAILURE);
      }
    
      /* Start created domain */
      int result = virDomainCreate(dom, 0);
      if (result!= 0) {
      std::cerr << "Failed to start domain." << std::endl;
      virDomainFree(dom);
      virConnectClose(conn);
      exit(EXIT_FAILURE);
      }
    
      /* Wait until domain is running */
      while (true) {
      unsigned int state;
      state = virDomainGetState(dom, 0);
      switch (state) {
          case VIR_DOMAIN_NOSTATE:
              break;
    
          case VIR_DOMAIN_RUNNING:
              printf("Domain started successfully\n");
              goto cleanup;
    
          default:
              printf("Waiting for domain startup...\n");
              sleep(1);
              continue;
      }
    
      if ((state & VIR_DOMAIN_NOSTATE) && 
         !(state & VIR_DOMAIN_RUNNING)) {
          printf("Domain failed to start.\n");
          goto cleanup;
      }
      }
    
    cleanup:
    
      /* Clean up */
      virDomainDestroy(dom);
      virConnectClose(conn);
      return EXIT_SUCCESS;
    }
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

An illustrative code sample is provided to demonstrate the management of a virtual machine running on a Type III hypervisor, which functions as a user space emulator.

复制代码
    from pyVmomi import vim
    
    def print_vm(vm):
    summary = vm.summary
    print("Name       : ", summary.config.name)
    print("Guest      : ", summary.config.guestFullName)
    annotation = summary.config.annotation
    if annotation:
        print("Annotation : ", annotation)
    print("State      : ", summary.runtime.powerState)
    ip_address = summary.guest.ipAddress
    if ip_address:
        print("IP         : ", ip_address)
    memory_mb = summary.config.memorySizeMB / 1024
    print("Memory     : {} MB".format(memory_mb))
    
    def find_obj(content, vimtype, name):
    obj = None
    container = content.viewManager.CreateContainerView(content.rootFolder, vimtype, True)
    for c in container.view:
        if name:
            if hasattr(c, 'name') and c.name == name:
                obj = c
                break
        else:
            obj = c
            break
    return obj
    
    def list_vms():
    si = SmartConnectNoSSL(host="localhost", user="admin", pwd="vmware")
    atexit.register(Disconnect, si)
    content = si.RetrieveContent()
    vms = content.viewManager.CreateContainerView(content.rootFolder, [vim.VirtualMachine], True).view
    for vm in vms:
        print_vm(vm)
    
    list_vms()
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

全部评论 (0)

还没有任何评论哟~