- 虚拟化技术与应用项目教程(微课版)
- 崔升广编著
- 5字
- 2023-09-06 19:01:09
1.2 必备知识
1.2.1 虚拟化基本概念和应用
虚拟化是一个广义的术语,本书的重点是IT领域的虚拟化,目的是快速部署IT系统,提升系统性能和可用性,实现运维自动化,同时降低拥有成本和运维成本。虚拟化是指为运行的程序或软件营造它们所需要的执行环境。采用虚拟化技术后,程序或软件可以运行在完全相同的物理计算资源中,但不再独享底层的物理计算资源,且完全不会影响所运行的计算机的底层结构。虚拟化的主要目的是对IT基础设施和资源管理方式进行简化。虚拟化的消费者可以是最终用户、应用程序、操作系统、访问资源或与资源交互相关的其他服务。虚拟化是云计算的基础,使得用户可以在一台物理服务器上运行多台虚拟机。虚拟机共享物理机的中央处理器(Central Processing Unit,CPU)、内存、输入/输出(Input/Output,I/O)硬件资源,但在逻辑上是相互隔离的。基础设施即服务(Infrastructure as a Service,IaaS)可实现底层资源虚拟化。OpenStack作为IaaS云操作系统,主要的服务就是为用户提供虚拟机。在目前的OpenStack实际应用中,主要使用KVM和Xen这两种Linux虚拟化技术。
1. 虚拟化的基本概念
虚拟化是一种可以为不同规模的企业降低IT开销、提高效率的有效方式,代表当前IT的一个重要发展方向,并在多个领域得到广泛应用。服务器、存储、网络、桌面和应用等的虚拟化技术发展很快,并与云计算不断融合。服务器虚拟化主要用于组建和改进数据中心,是极为核心的虚拟化技术,也是云计算的基础技术,更是数据中心企业级应用的关键。
(1)资源虚拟化的使用效率
资源虚拟化的使用效率可以从虚拟化前和虚拟化后的角度进行比较。
① 虚拟化前。一台主机对应一个操作系统,后台多个应用程序会对特定的资源进行争抢,存在相互冲突的风险;在实际情况下,业务系统与硬件进行绑定,难以灵活部署;就统计数据来说,虚拟化前的系统资源利用率一般只有15%左右。
② 虚拟化后。一台主机可以“虚拟出”多个操作系统,独立的操作系统和应用程序拥有独立的CPU、内存和I/O资源,相互隔离;业务系统独立于硬件,可以在不同的主机之间进行迁移;充分利用系统资源,虚拟化后的系统资源利用率可以达到60%。
(2)虚拟化分类
虚拟化可分为平台虚拟化、资源虚拟化、应用程序虚拟化、存储虚拟化、网络虚拟化等。
① 平台虚拟化(Platform Virtualization),是针对计算机和操作系统进行的虚拟化,又分为服务器虚拟化和桌面虚拟化。
• 服务器虚拟化,是一种通过区分资源的优先次序,将服务器资源分配给最需要它们的工作负载的虚拟化模式,它通过减少为单个工作负载峰值而储备的资源来简化管理和提高效率,如微软公司的Hyper-V、Citrix公司的XenServer、VMware公司的ESXi。
• 桌面虚拟化,是指对计算机的终端系统(也称桌面)进行虚拟化,可以使用户利用任何设备,在任何地点、任何时间通过网络访问属于个人的桌面系统,是一种为提高人对计算机的操控力,降低计算机使用的复杂性,为用户提供更加方便适用的使用环境的虚拟化模式,如微软公司的Remote Desktop Services、Citrix公司的XenDesktop、VMware公司的View。
平台虚拟化主要通过CPU虚拟化、内存虚拟化和I/O接口虚拟化来实现。
② 资源虚拟化(Resource Virtualization),是针对特定的计算资源进行的虚拟化,例如,存储虚拟化、网络资源虚拟化等。存储虚拟化是指把操作系统有机地分布于若干内、外存储器中,所有内、外存储器结合成虚拟存储器。网络资源虚拟化的典型应用是网格计算。网格计算通过使用虚拟化技术来管理网络上的数据,并在逻辑上将其作为一个系统呈现给用户。它动态地提供符合用户和应用程序需求的资源,同时提供对基础设施的共享和访问的简化。当前,有些研究人员提出了利用软件代理技术来实现计算网络空间资源虚拟化的设想。
③ 应用程序虚拟化(Application Virtualization),包括仿真、模拟、解释技术等。Java虚拟机是典型的在应用层进行虚拟化的应用程序。基于应用层的虚拟化技术,通过保存用户的个性化计算环境的配置信息,可以在任意计算机上重现用户的个性化计算环境。服务虚拟化是近年来研究的一个热点,可以使用户按需快速构建应用。服务虚拟化通过服务聚合,可降低服务资源使用的复杂性,使用户更易于直接将业务需求映射到虚拟化的服务资源中。现代软件体系结构及其配置的复杂性阻碍了软件开发,通过在应用层建立虚拟化的模型,可以提供较好的开发、测试和运行环境。
④ 存储虚拟化(Storage Virtualization),是指将具体的存储设备或存储系统同服务器操作系统分隔开来,为存储用户提供统一的虚拟存储池。它是具体存储设备或存储系统的抽象,将展示给用户一个逻辑视图,同时将应用程序及用户所需要的数据存储操作和具体的存储控制分离。
存储虚拟化可在存储设备上加入一个逻辑层,管理员通过逻辑层访问或者调整存储资源,提高存储资源利用率。这样便于集中存储设备,可以提高易用性。存储虚拟化包括基于主机的存储虚拟化、基于存储设备的存储虚拟化。
• 基于主机的存储虚拟化依赖代理或管理软件,通过在一个或多个主机上进行安装和部署,来实现存储虚拟化的控制和管理。基于主机的存储虚拟化的优点是实现起来比较容易,设备成本低。这种方式的缺点是可扩充性较差,实际运行的性能不是很好。这种方式要求在主机上安装控制软件,因此一个主机的故障可能影响整个存储区域网(Storage Area Network,SAN)系统中数据的完整性。
• 基于存储设备的存储虚拟化是通过第三方的虚拟软件实现的,通常只能提供一种不完全的存储虚拟化解决方案。这种技术主要用在同一存储设备内部,可进行数据保护和数据迁移。其优势在于与主机无关,不占用主机资源,数据管理功能丰富;容易和某个特定存储供应商的设备相协调,这样也就更容易管理。
⑤ 网络虚拟化(Network Virtualization),是指将以前基于硬件的网络转变为基于软件的网络。与所有形式的虚拟化一样,网络虚拟化的基本目标是在硬件和利用该硬件的活动之间引入一个抽象层。具体地说,网络虚拟化允许独立于硬件来交付网络功能、硬件资源和软件资源,即虚拟网络。网络虚拟化以软件的形式完整再现物理网络,应用程序在虚拟网络上的情况与在物理网络上的情况完全相同,网络虚拟化向已连接的工作负载提供逻辑网络连接设备和服务,如逻辑端口、交换机、路由器、防火墙、虚拟专用网(Virtual Private Network,VPN)等。它可以用来合并许多物理网络,或者将网络进一步细分,又或者将虚拟机连接起来。借助它可以优化数字服务提供商使用服务器资源的方式,使它们能够使用标准服务器来执行以前必须由昂贵的专有硬件才能执行的功能,并提高其网络的速度、灵活性和可靠性。虚拟网络不仅可以提供与物理网络相同的功能特性和保证,还具备虚拟化所具有的运维优势和硬件独立性。
(3)全虚拟化与半虚拟化
根据虚拟化实现技术的不同,虚拟化可分为全虚拟化和半虚拟化两种。其中,全虚拟化产品将是未来虚拟化产品的主流。
① 全虚拟化(Full Virtualization),也称为原始虚拟化技术,用全虚拟化模拟出来的虚拟机中的操作系统是与底层的硬件完全隔离的。虚拟机中所有的硬件资源都通过虚拟化软件来模拟,包括处理器、内存和外部设备,支持运行任何理论上可在真实物理平台上运行的操作系统,为虚拟机的配置提供了较大的灵活性。在客户机操作系统看来,完全虚拟化的虚拟平台和物理平台是一样的,客户机操作系统察觉不到程序是运行在一个虚拟平台上的。这样的虚拟平台可以运行现有的操作系统,无须对操作系统进行任何修改,因此这种方式被称为全虚拟化。全虚拟化的运行速度要快于硬件模拟的运行速度,但是在性能方面不如裸机,因为Hypervisor(虚拟机监视器,一种运行在物理服务器和操作系统之间的中间层软件,可以允许多个操作系统和应用共享一套基础物理硬件)需要占用一些资源。
② 半虚拟化(Para Virtualization),是一种类似于全虚拟化的技术,需要修改虚拟机中的操作系统来集成一些虚拟化方面的代码,以减小虚拟化软件的负载。半虚拟化模拟出来的虚拟机整体性能会更好一些,因为修改后的虚拟机操作系统承载了部分虚拟化软件的工作。其不足之处是,由于要修改虚拟机的操作系统,用户会感知到使用的环境是虚拟化环境,而且兼容性比较差,用户使用起来比较麻烦,需要获得集成虚拟化代码的操作系统。
2. 基于Linux内核的虚拟化解决方案
基于内核的虚拟机(Kernel-based Virtual Machine,KVM)是一种基于Linux的x86硬件平台开源全虚拟化解决方案,也是主流的Linux虚拟化解决方案,支持广泛的客户机操作系统。KVM需要CPU的虚拟化技术的支持,如Intel虚拟化技术(Intel Virtualization Technology,Intel VT)或AMD虚拟化(AMD Virtualization,AMD-V)技术。
(1)KVM模块
KVM模块是一个可加载的内核模块kvm.ko。基于KVM对x86硬件架构的依赖,KVM需要使用处理模块。如果使用Intel架构,则加载kvm-intel.ko模块;如果使用AMD架构,则加载kvm-amd.ko模块。
KVM模块负责对虚拟机的虚拟CPU和内存进行管理及调试,主要任务是初始化CPU硬件,打开虚拟化模式,然后使虚拟机运行在虚拟模式下,并对虚拟机的运行提供一定的支持。
至于虚拟机的外部设备交互,如果是真实的物理硬件设备,则利用Linux系统内核来管理;如果是虚拟的外部设备,则借助快速仿真(Quick Emulator,QEMU)来处理。
由此可见,KVM本身只关注虚拟机的调试和内存管理,是一个轻量级的Hypervisor,很多Linux发行版将KVM作为虚拟化解决方案,CentOS也不例外。
(2)QEMU
KVM模块本身无法作为Hypervisor模拟出完整的虚拟机,而且用户也无法直接对Linux系统内核进行操作,因此需要借助其他软件,QEMU就是这样一款软件。
QEMU并非KVM的一部分,而是一款开源的虚拟机软件。与KVM不同,作为宿主型的Hypervisor,即使没有KVM模块,QEMU也可以通过模拟来创建和管理虚拟机,但因为是纯软件实现,所以其性能较低。QEMU的优点是,在支持QEMU的平台上就可以实现虚拟机的功能,甚至虚拟机可以不与主机使用同一个架构。KVM在QEMU的基础上进行了修改。在虚拟机运行期间,QEMU将通过KVM模块提供的系统调用进入内核,KVM模块负责将虚拟机置于处理器的特殊模式下运行;当虚拟机进行I/O操作时,KVM模块将任务转交给QEMU解析和模拟虚拟机。
QEMU使用KVM模块的虚拟化功能,为自己的虚拟机提供硬件虚拟化的加速能力,从而极大地提高了虚拟机的性能。除此之外,虚拟机的配置和创建,虚拟机运行时依赖的虚拟设备,虚拟机运行时的用户操作环境和交互,以及一些针对虚拟机的特殊技术(如动态迁移),都是由QEMU自己实现的。
KVM的创建和运行是用户空间的QEMU程序和内核空间的KVM模块相互配合的过程。KVM模块作为整个虚拟化环境的核心,工作在系统空间,负责CPU和内存的调试;QEMU作为模拟器,工作在用户空间,负责虚拟机的I/O模拟。
(3)KVM架构
从前面的分析来看,KVM作为Hypervisor,主要包括两个重要的组成部分:一个是Linux系统内核的KVM模块,主要负责虚拟机的创建、虚拟内存的分配、虚拟CPU寄存器的读写以及虚拟CPU的运行;另一个是提供硬件仿真的QEMU,用于模拟虚拟机的用户空间组件、提供I/O设备模型和访问外部设备的途径。KVM的基本架构如图1.1所示。
图1.1 KVM的基本架构
在KVM中,每一个虚拟机都是一个由Linux调度程序管理的标准进程,可以在用户空间启动客户机操作系统。普通的Linux进程有两种运行模式,即内核模式和用户模式;而KVM增加了第3种模式,即客户模式,客户模式又有自己的内核模式和用户模式。当新的虚拟机在KVM上启动时,它就成为主机操作系统的一个进程,因此可以像调度其他进程一样调度它。但与传统的Linux进程不同的是,每个虚拟机都是通过/dev/kvm设备映射的,它们拥有自己的虚拟地址空间,该空间映射到主机内核的物理地址空间。如前所述,KVM使用硬件的虚拟化支持来提供完整的(原生)虚拟化,I/O请求通过主机内核映射到在主机(Hypervisor)上执行的QEMU进程。
(4)KVM虚拟磁盘(镜像)文件格式
在KVM中往往使用镜像(Image)这个术语来表示虚拟磁盘,虚拟磁盘主要有以下3种文件格式。
① RAW。这是原始的格式,它直接将文件系统的存储单元分配给虚拟机使用,采取直读直写的策略。该格式实现简单,不支持诸如压缩、快照、加密和写时拷贝(Copy-On-Write,COW)等特性。
② QCOW2。这是QEMU引入的镜像文件格式,也是目前KVM默认的格式。QCOW2文件存储数据的基本单元是簇(Cluster),每一簇由若干个数据扇区组成,每个数据扇区的大小是512B。在QCOW2中,要定位镜像文件的簇,需要经过两次地址查询操作,QCOW2根据实际需要来决定占用空间的大小,而且支持更多的主机文件系统格式。
③ QED。这是QCOW2的一种改进格式,QED的存储、定位、查询方式以及数据块大小均与QCOW2一样,它的目的是改进QCOW2格式的一些缺点,提高性能,不过目前还不够成熟。
如果需要使用虚拟机快照,则可选择QCOW2格式;对于大规模数据的存储,可以选择RAW格式。QCOW2格式只能增加文件容量,不能减少文件容量,而RAW格式可以增加或减少文件容量。
3. Libvirt套件
为了使KVM的整个虚拟环境易于管理,仅有KVM模块和QEMU组件是不够的,还需要使用Libvirt服务和基于Libvirt开发出来的管理工具。
Libvirt是一个软件集合,是为管理平台虚拟化技术而设计的开源的应用程序接口(Application Program Interface,API)、守护进程和管理工具。它不仅可以对虚拟机进行管理,还可以对虚拟网络和存储进行管理。Libvirt最初是为Xen虚拟化平台设计的API,目前还支持其他多种虚拟化平台,如KVM、ESXi和QEMU等。在KVM解决方案中,QEMU用来进行平台模拟,面向上层进行管理和操作;而Libvirt用来管理KVM,面向下层进行管理和操作。Libvirt架构如图1.2所示。
图1.2 Libvirt架构
Libvirt套件包括两部分,一部分是服务(守护进程名为libvirtd),另一部分是Libvirt API。Libvirt API是目前广泛使用的虚拟机管理API,它是一系列标准的库文件,可以给多种虚拟化平台提供统一的编程接口。一些常用的虚拟机管理工具(如virsh)和云计算框架平台(如OpenStack)都是在底层使用Libvirt API的。
libvirtd作为运行在主机上的服务器守护进程,为虚拟化平台及其虚拟机提供了本地和远程的管理功能。libvirtd在管理工具和虚拟化平台之间起到了“桥梁”的作用,基于Libvirt开发的管理工具可通过libvirtd服务管理整个虚拟化环境,且可以支持多种虚拟化平台。
4. 虚拟化的应用
虚拟化一方面应用于计算领域,包括虚拟化数据中心、分布式计算、服务器整合、高性能应用、定制化服务、私有云部署、云托管提供商等;另一方面应用于测试、实验和教学培训,如软件测试和软件培训等。