虚拟化技术--云计算之基石
Posted 志善志美8
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚拟化技术--云计算之基石相关的知识,希望对你有一定的参考价值。
虚拟化技术
一、什么是虚拟化
虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器(Virtual Machine Monitor,VMM)的程序在物理硬件之上生成许多可以运行独立操作系统软件的虚拟机(Virtual Machine)实例。随着近年多核系统、集群、网格甚至云计算的广泛部署,虚拟化技术在商业应用上的优势日益体现,不仅降低了 IT 成本,而且还增强了系统安全性和可靠性,虚拟化的概念也逐渐深入到人们日常的工作与生活中。
虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
虚拟化使用软件的方法重新定义划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率,使IT资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。
虚拟化就是由位于下层的软件模块,根据上层的软件模块的期待,抽象(虚拟)出一个虚拟的软件或硬件模块,使上一层软件直接运行在这个与自己期待完全一致的虚拟环境上。从这个意义上来看,虚拟化既可以是软件层的抽象,又可以是硬件层的抽象。
二、虚拟化技术的分类
虚拟化技术主要分为以下几个大类 :
1. 平台虚拟化(Platform Virtualization),针对计算机和操作系统的虚拟化。
2. 资源虚拟化(Resource Virtualization),针对特定的系统资源的虚拟化,比如内存、存储、网络资源等。
3. 应用程序虚拟化(Application Virtualization),包括仿真、模拟、解释技术等。
我们通常所说的虚拟化主要是指平台虚拟化技术,通过使用控制程序(Control Program,也被称为 VirtualMachine Monitor 或 Hypervisor),隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境(称为虚拟机)。虚拟机中运行的操作系统被称为客户机操作系统(Guest OS),运行虚拟机监控器的操作系统被称为主机操作系统(Host OS),当然某些虚拟机监控器可以脱离操作系统直接运行在硬件之上(如VMWARE 的 ESX 产品)。运行虚拟机的真实系统我们称之为主机系统。
平台虚拟化技术又可以细分为如下几个子类:
1. 全虚拟化(Full Virtualization)
2. 超虚拟化(Paravirtualization)
3. 硬件辅助虚拟化(Hardware-Assisted Virtualization)
硬件辅助虚拟化是指借助硬件(主要是主机处理器)的支持来实现高效的全虚拟化。例如有了 Intel-VT 技术的支持,Guest OS 和 VMM 的执行环境自动地完全隔离开来,Guest OS 有自己的“全套寄存器”,可以直接运行在最高级别。因此在上面的例子中,Guest OS 能够执行修改页表的汇编指令。Intel-VT 和 AMD-V 是目前 x86 体系结构上可用的两种硬件辅助虚拟化技术。
4. 部分虚拟化(Partial Virtualization)
VMM 只模拟部分底层硬件,因此客户机操作系统不做修改是无法在虚拟机中运行的,其它程序可能也需要进行修改。在历史上,部分虚拟化是通往全虚拟化道路上的重要里程碑,最早出现在第一代的分时系统 CTSS 和 IBM M44/44X 实验性的分页系统中。
5. 操作系统级虚拟化(Operating System LevelVirtualization)
在传统操作系统中,所有用户的进程本质上是在同一个操作系统的实例中运行,因此内核或应用程序的缺陷可能影响到其它进程。操作系统级虚拟化是一种在服务器操作系统中使用的轻量级的虚拟化技术,内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程,不同实例中的进程完全不了解对方的存在。比较著名的有 Solaris Container [2],FreeBSD Jail 和 OpenVZ 等。
这种分类并不是绝对的,一个优秀的虚拟化软件往往融合了多项技术。例如 VMware Workstation 是一个著名的全虚拟化的 VMM,但是它使用了一种被称为动态二进制翻译的技术把对特权状态的访问转换成对影子状态的操作,从而避免了低效的 Trap-And-Emulate 的处理方式,这与超虚拟化相似,只不过超虚拟化是静态地修改程序代码。对于超虚拟化而言,如果能利用硬件特性,那么虚拟机的管理将会大大简化,同时还能保持较高的性能。
三、虚拟化技术的目的
虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件,简单来说就是将底层资源进行分区,并向上层提供特定的和多样化的执行环境。
四、虚拟机监控器应当具备的条件
1974 年,Popek 和 Goldberg 在《FormalRequirements for Virtualizable Third Generation Architectures》论文中提出了一组称为虚拟化准则的充分条件,满足这些条件的控制程序可以被称为虚拟机监控器(Virtual Machine Monitor,简称 VMM):
资源控制。控制程序必须能够管理所有的系统资源。
等价性。在控制程序管理下运行的程序(包括操作系统),除时序和资源可用性之外的行为应该与没有控制程序时的完全一致,且预先编写的特权指令可以自由地执行。
效率性。绝大多数的客户机指令应该由主机硬件直接执行而无需控制程序的参与。
尽管基于简化的假设,但上述条件仍为评判一个计算机体系结构是否能够有效支持虚拟化提供了一个便利方法,也为设计可虚拟化计算机架构给出了指导原则。
五、虚拟化的原理
在OS中加入一个虚拟化层(VMM),虚拟化层可以对下层(HostOS)硬件资源(物理CPU、内存、磁盘、网卡、显卡等)进行封装、隔离,抽象为另一种形式的逻辑资源,再提供给上层(GuestOS)使用。所以你可以理解VMM其实就是联系HostOS和GuestOS的一个中间件,当然虚拟化可以将一份资源抽象为多份,也可以将多份资源抽象为一份。
通过虚拟化技术实现的虚拟机一般被称之为GuestOS(客户),而作为GuestOS载体的物理主机称之为HostOS(宿主)。
传统的 x86 体系结构缺乏必要的硬件支持,任何虚拟机监控器都无法直接满足上述条件,所以不是一个可虚拟化架构,但是我们可以使用纯软件实现的方式构造虚拟机监控器。
六、VMM
VMM 全称是Virtual Machine Monitor,虚拟机监控系统,也叫 Hypervisor,是虚拟化层的具体实现。主要是以软件的方式,实现一套和物理主机环境完全一样的虚拟环境,物理主机有的所有资源,包括 CPU、内存、网络 IO、设备 IO等等,它都有。这样的方式相当于 VMM 对物理主机的资源进行划分和隔离,使其可以充分利用资源供上层使用。虚拟出的资源以虚拟机的形式提供服务,一个虚拟机本质上和一台物理机没有什么区别,可以跑各种操作系统,在之上再跑各种应用。这种方式无疑是计算机历史上非常里程碑的一步,你想想,以前可能要买多台服务器才能解决的事,现在只用一台就解决了。
虚拟机通常叫做客户机(guest),物理机叫宿主机(host),VMM 处在中间层,既要负责对虚拟资源的管理,包括虚拟环境的调度,虚拟机之间的通信以及虚拟机的管理等,又要负责物理资源的管理,包括处理器、中断、内存、设备等的管理,此外,还要提供一些附加功能,包括定时器、安全机制、电源管理等。
1.VMM 分类
VMM 根据平台类型和实现结构有两种不同的分类,按平台类型可以分为完全虚拟化和类虚拟化,完全虚拟化就是VMM 完全模拟出一个跟物理主机完全一样的环境。但是这个是非常困难的,首先,这需要硬件的支持,而硬件在初期设计的时候,没有那么远的前瞻性,可以预想到为虚拟化提供支持,前次,指令的复杂性,即使通过模拟的方式也很难做到全部指令都模拟。所以,就需要借助其他的一些技术来辅助虚拟化。
软件辅助虚拟化是通过优先级压缩(Ring Compression)和二进制代码翻译(Binary Translation)这两个技术来完成的。简单讲,RC 基于 CPU 特权级的原理,也就是guest、VMM 和 host 分别处于不同的特权级上(这个后面讲 CPU 虚拟化的时候会详述),guest 要访问 host 就属于越级访问,会抛异常,这时 VMM 会截获这个异常,并模拟出其可能的行为,从而进行相应处理。但这个问题很明显,就是由于硬件设计的缺陷,有些指令并不能截获,从而导致“漏洞”。
BT 可以弥补这个缺陷,它通过去扫描 guest 的二进制的代码,将难以虚拟化的指令转为支持虚拟化的指令,从而可以配合VMM 完成虚拟化功能。这两种方式都是通过「打补丁」的方式来辅助虚拟化,很难再架构上保证完整性。
所以,后期的硬件厂商就在硬件上对虚拟化提供了支持,有了硬件辅助的虚拟化。通过对硬件本身加入更多的虚拟化功能,就可以截获更多的敏感指令,填补上漏洞。在这一块,Intel 的 VT-x/d 技术和AMD 的 AMD-V 技术是其中的代表。
而类虚拟化则是另外一种通过软件来避免漏洞的方式,就是通过修改 guest 操作系统内核代码(API 级)来避免漏洞,这种方式好处就是可以自定义内核的执行行为,某种程度上对性能进行优化。
上面这种分类仅供了解即可,重点掌握下面这种分类,就是根据 VMM 的实现结构分类,主要分类** Hypervisor 模型(1 型)和宿主模型(2 型)**。
Hypervisor模型中 VMM 既是操作系统,也是虚拟化软件,也就是集成了虚拟化功能的操作系统,对上为 guest 提供虚拟化功能,对下管理着所有物理资源,它的优点就是效率高,虚拟机的安全性只依赖于 VMM,缺点就是管理所有的物理资源,意味着 VMM 要承担很多的开发工作,特别是驱动层面的开发,我们知道硬件的 I/O 设备是很多的,这些设备都要有对应的驱动来设配才能为虚拟机提供功能。
宿主模型剥离了管理功能和虚拟化功能,虚拟化功能只是作为内核的一个模块来加载,比如KVM 技术就是其中的佼佼者,KVM 技术可以说是云计算最核心的技术了,后面会经常用到。一般 KVM 只负责 CPU 和内存的虚拟化,I/O 的虚拟化则由另外一个技术来完成,即 Qemu。这些技术都是后面的重点,在这里只是提一下。
2.常见虚拟机技术
1).KVM(Kernel-based Virtual Machine)基于内核的虚拟机
KVM 是一款开源软件,已集成到Linux内核的Hypervisor,是X86架构且硬件支持虚拟化技术(Intel VT或AMD-V)的Linux的全虚拟化解决方案。它是Linux的一个很小的模块,利用Linux做大量的事,如任务调度、内存管理与硬件设备交互等。使用 KVM 的厂商很多啊,像我们比较熟悉 VMware Workstation 和 VirtualBox 都在使用。
KVM是linux内核的模块,它需要CPU的支持,采用硬件辅助虚拟化技术Intel-VT,AMD-V,内存的相关如Intel的EPT和AMD的RVI技术,Guest OS的CPU指令不用再经过Qemu转译,直接运行,大大提高了速度,KVM通过/dev/kvm暴露接口,用户态程序可以通过ioctl函数来访问这个接口。见如下伪代码:
open("/dev/kvm")
ioctl(KVM_CREATE_VM)
ioctl(KVM_CREATE_VCPU)
for (;;) {
ioctl(KVM_RUN)
switch (exit_reason) {
case KVM_EXIT_IO:
case KVM_EXIT_HLT:
}
}
KVM内核模块本身只能提供CPU和内存的虚拟化,所以它必须结合QEMU才能构成一个完成的虚拟化技术
kvm部署环境准备:
操作系统 |
CentOS Linux release 7.2.1511 (Core) |
192.168.2.231 |
|
软件包:yum安装 |
yum install -y |
关闭防火墙和selinux |
systemctl stop iptables.service vim /etc/sysconfig/selinux 文件里改成SELINUX=disabled |
安装kvm
1 2 3 4 5 6 7 8 9 10 11 |
[root@localhost ~]# yum install qemu-kvm libvirt libguestfs-tools virt-install virt-manager libvirt-python bridge-utils -y Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.cn99.com * extras: mirrors.cn99.com * updates: mirrors.aliyun.com Package 10:qemu-kvm-1.5.3-105.el7_2.7.x86_64 already installed and latest version Package libvirt-1.2.17-13.el7_2.5.x86_64 already installed and latest version Package virt-install-1.2.1-8.el7.noarch already installed and latest version Package virt-manager-1.2.1-8.el7.noarch already installed and latest version Nothing to do |
qemu-kvm 主要的KVM程序包kvm相关安装包及其作用
python-virtinst 创建虚拟机所需要的命令行工具和程序库
virt-manager GUI虚拟机管理工具
virt-top 虚拟机统计命令
virt-viewer GUI连接程序,连接到已配置好的虚拟机
libvirt C语言工具包,提供libvirt服务
libvirt-client 为虚拟客户机提供的C语言工具包
virt-install 基于libvirt服务的虚拟机创建命令
bridge-utils 创建和管理桥接设备的工具
安装x-windows,使用图形化界面管理虚拟机
[root@localhost ~]# yum groupinstall "X Window System" -y
创建vm
[root@localhost ~]# mkdir -pv /var/kvm/images
mkdir: created directory ‘/var/kvm’
mkdir: created directory ‘/var/kvm/images’
[root@localhost ~]# mkdir -pv /var/kvm/images
mkdir: created directory ‘/var/kvm’
mkdir: created directory ‘/var/kvm/images’
virt-install \
--network bridge:br0 \
--name vm1 \
--ram=1024 \
--vcpus=1 \
--disk path=/var/kvm/images/vm1.img,size=10 \
--graphics none \
--location 'http://ftp.iij.ad.jp/pub/linux/centos/7/os/x86_64/' \
--extra-args="console=tty0 console=ttyS0,115200"
#详细每个参数的意义可以查看扩展资料
#安装过程会让你选择textmode 还是vnc,选择textmode继续安装吧
#如果网络会有问题的话,尽量选择用--cdrom /path/to/centos7.iso
2).qemu-kvm
Qemu将KVM整合进来,通过ioctl调用/dev/kvm接口,将有关CPU指令的部分交由内核模块来做。kvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备。qemu模拟IO设备(网卡,磁盘等),kvm加上qemu之后就能实现真正意义上服务器虚拟化。因为用到了上面两个东西,所以称之为qemu-kvm。
Qemu模拟其他的硬件,如Network, Disk,同样会影响这些设备的性能,于是又产生了pass through半虚拟化设备virtio_blk, virtio_net,提高设备性能。
3). Xen
Xen是第一类运行在裸机上的虚拟化管理程序(Hypervisor)。它支持全虚拟化和半虚拟化,Xen支持hypervisor和虚拟机互相通讯,而且提供在所有Linux版本上的免费产品,包括Red Hat Enterprise Linux和SUSE LinuxEnterprise Server。Xen最重要的优势在于半虚拟化,此外未经修改的操作系统也可以直接在xen上运行(如Windows),能让虚拟机有效运行而不需要仿真,因此虚拟机能感知到hypervisor,而不需要模拟虚拟硬件,从而能实现高性能。
环境准备同kvm
开始安装:
yum -y install centos-release-xen
sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/CentOS-Xen.repo
yum --enablerepo=centos-virt-xen -y update kernel
yum --enablerepo=centos-virt-xen -y install xen
vi /etc/default/grub
# change memory amount for Domain0 (specify proper value on your system)
GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=4096M,max:4096M cpuinfo com1=115200,8n1.....
/bin/grub-bootxen.sh
reboot
后面参考kvm过程,此处略
4). QEMU
QEMU是一套由Fabrice Bellard所编写的模拟处理器的自由软件。它与Bochs,PearPC近似,但其具有某些后两者所不具备的特性,如高速度及跨平台的特性。经由kqemu这个开源的加速器,QEMU能模拟至接近真实电脑的速度。
Qemu是一个模拟器,它向Guest OS模拟CPU和其他硬件,Guest OS认为自己和硬件直接打交道,其实是同Qemu模拟出来的硬件打交道,Qemu将这些指令转译给真正的硬件。
由于所有的指令都要从Qemu里面过一手,因而性能较差
5). libvirt
libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和API。Libvirtd是一个daemon进程,可以被本地的virsh调用,也可以被远程的virsh调用,Libvirtd调用qemu-kvm操作虚拟机。
libvirt体系结构
没有使用libvirt的虚拟机管理方式如下图所示:
为支持各种虚拟机监控程序的可扩展性,libvirt实施一种基于驱动程序的架构,该架构允许一种通用的API以通用方式为大量潜在的虚拟机监控程序提供服务。下图展示了libvirt API与相关驱动程序的层次结构。这里也需要注意,libvirtd提供从远程应用程序访问本地域的方式。
libvirt的控制方式有两种:
1)管理应用程序和域位于同一节点上。管理应用程序通过libvirt工作,以控制本地域。
2)管理应用程序和域位于不同节点上。该模式使用一种运行于远程节点上、名为libvirtd的特殊守护进程。当在新节点上安装libvirt时该程序会自动启动,且可自动确定本地虚拟机监控程序并为其安装驱动程序。该管理应用程序通过一种通用协议从本地libvirt连接到远程libvirtd。
3.openstack, kvm, qemu-kvm以及libvirt之间的关系
KVM是最底层的hypervisor,它是用来模拟CPU的运行,它缺少了对network和周边I/O的支持,所以我们是没法直接用它的。
QEMU-KVM就是一个完整的模拟器,它是构建基于KVM上面的,它提供了完整的网络和I/O支持。
Openstack不会直接控制qemu-kvm,它会用一个叫libvirt的库去间接控制qemu-kvm。libvirt提供了跨VM平台的功能,它可以控制除了QEMU之外的模拟器,包括vmware, virtualbox, xen等等。
所以为了openstack的跨VM性,所以openstack只会用libvirt而不直接用qemu-kvm。libvirt还提供了一些高级的功能,例如pool/vol管理。
KVM和QEMU的关系:
准确来说,KVM是Linux kernel的一个模块。可以用命令modprobe去加载KVM模块。加载了模块后,才能进一步通过其他工具创建虚拟机。但仅有KVM模块是 远远不够的,因为用户无法直接控制内核模块去作事情,你还必须有一个运行在用户空间的工具才行。这个用户空间的工具,kvm开发者选择了已经成型的开源虚拟化软件 QEMU。说起来QEMU也是一个虚拟化软件。它的特点是可虚拟不同的CPU。比如说在x86的CPU上可虚拟一个Power的CPU,并可利用它编译出可运行在Power上的程序。KVM使用了QEMU的一部分,并稍加改造,就成了可控制KVM的用户空间工具了。所以你会看到,官方提供的KVM下载有两大部分(qemu和kvm)三个文件(KVM模块、QEMU工具以及二者的合集)。也就是说,你可以只升级KVM模块,也可以只升级QEMU工具。这就是KVM和QEMU 的关系。
七、未来虚拟化技术的发展
1. 提高操作模式间的转换速度。
两种操作模式间的转换发生之如此频繁,如果不能有效减少其转换速度,即使充分利用硬件特性,虚拟机的整体性能也会大打折扣。早期的支持硬件辅助虚拟化技术的 Pentium 4 处理器需要花费 2409 个时钟周期处理 VM entry,花费 508 个时钟周期处理由缺页异常触发的 VM exit,代价相当高。随着 Intel 技术的不断完善,在新的 Core 架构上,相应时间已经减少到 937 和 446 个时钟周期。未来硬件厂商还需要进一步提高模式的转换速度,并提供更多的硬件特性来减少不必要的转换。
2. 优化翻译后援缓冲器(TLB)的性能。
3. 提供内存管理单元(MMU)虚拟化的硬件支持。
4. 支持高效的 I/O 虚拟化。
以上是关于虚拟化技术--云计算之基石的主要内容,如果未能解决你的问题,请参考以下文章