虚拟化与KVM

来源:互联网 发布:淘宝退货要申请售后吗 编辑:程序博客网 时间:2024/04/27 16:50

虚拟化技术与KVM、libvirt等

虚拟化技术

虚拟化指的是特殊的技术,通过隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境(称为虚拟机)(IBM定义)。使用软件方式重新定义划分硬件资源,实现硬件资源的动态分配、跨系统共享,提高资源利用率,降低成本。计算机元件在虚拟的基础上而不是真实的基础上运行。它可以扩大硬件的容量,简化软件的重新配置过程。为有效利用大型机的资源提供了技术支持。

可以通过虚拟化技术将一台计算机虚拟为多台逻辑计算机:同时运行多个不同的操作系统、相互独立运行,也可以相互通信。

全虚拟化与半虚拟化

  • 完全虚拟化
    VMWareVmware Workstation、KVM
    完全虚拟化通常调用管理程序或虚拟机监视器,存在于虚拟操作系统和硬件层之间,这个层在操作系统实例之间多路复用竞争系统资源。

  • 半虚拟化
    ESXi、Xen
    管理程序在一个协作的环境中运作,因为每个客户操作系统都知道它正运行在一个虚拟化环境中,因此每个使用管理程序的协作都在硬件下完成虚拟。

两个途径都有优势也有劣势。半虚拟化的主要优势在于它运行尽可能快地基于软件的虚拟化,以不支持有专利的操作系统为代价。完全虚拟化没有这个限制,但是,完全虚拟化管理程序非常复杂。

KVM是一个相对较新的、简单但强大的虚拟化引擎。需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。它已经集成到Linux内核中去了,让内核天生有虚拟化的能力,因为KVM使用的是基于硬件的虚拟化技术,它不需要修改客户操作系统,因此,部署在一个受支持的处理器上,它可以从Linux支持任何平台。

Xen,用户模式Linux(UML)和其他提供的是半虚拟化解决方案。

架构

全虚拟化
全虚拟化

OS层半虚拟化
OS层半虚拟化

硬件层半虚拟化
硬件层半虚拟化

KVM——基于内核的虚拟化技术

KVM(Kernel-based Virtual Machine),是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。kvm开发者通过将KVM作为一个内核模块来实现让Linux内核自身变成一个管理程序。在虚拟环境下,Linux内核集成管理程序将其作为一个可加载的模块来简化管理和提升性能,这也是开发者将KVM添加到内核的一个主要原因。

KVM要求硬件须达到一定标准的硬件架构。对于Intel-VT与AMD-V都是支持的。对于是否支持可以通过命令行查看

egrep ‘(vmx|svm)’ /proc/cpuinfo

如果有任何内容则说明当期硬件架构是支持kvm的,否则就不支持。

这里写图片描述

通过添加虚拟化功能到一个标准的Linux内核,虚拟环境能从所有正在Linux内核上运行的工作中受益。在这种模式下,每个虚拟机都是一个常规的Linux进程,通过Linux调度程序进行调度。
通常,一个标准的Linux进程都有两个执行模式:

  • 内核模式 :对于应用程序而言用户模式是默认模式
  • 用户模式 :应用程序需要一些来自内核的服务时(如往磁盘上写入),使用内核模式。

而KVM添加了第三个模式:

  • 客户模式

客户模式进程运行在虚拟机内,它非常象正常模式(无虚拟实例),有它自己的内核和用户空间变量、在客户模式下可以使用正常的kill和ps命令,因为无虚拟实例,KVM虚拟机表现为一个正常的进程,能和其他进程一样被杀掉,KVM利用硬件虚拟技术虚拟处理器的形态,虚拟机的内存管理由内核直接处理,目前的版本I/O在用户空间处理,主要通过QEMU完成。

QEMU

QEMU也是一款虚拟化技术。其实,单纯qemu也可以完全实现一个虚拟机。但即使kvm的技术已经相当成熟而且可以对很多东西进行隔离,在某些方面还是无法虚拟出真实的机器(如对网卡的虚拟)。那这个时候就需要另外的技术来做补充,而qemu-kvm则是这样一种技术。它补充了kvm技术的不足,而且在性能上对kvm进行了优化。

libvirt

libvirt它是一系列提供出来的库函数,可用以其他技术调用,来管理机器上的虚拟机。包括各种虚拟机技术,kvm、xen与lxc等,都可以调用libvirt提供的api对虚拟机进行管理。libvirt提供了多种语言的编程接口,可以直接通过编程,调用libvirt提供的对外接口实现对虚拟机的操作。如今流行的云计算中的IaaS是与该库联系相当密切的。通过下图可以看出它的架构设计思想。

这里写图片描述

从上图可以见,在libvirt api之上会有很多个driver,对于每一种虚拟机技术都会有一种driver,用来充当该虚拟机技术与libvirt之间的包装接口。如此设计就可以避免libvirt需要设计各种针对不同虚拟机技术的接口,它主要关注底层的实现,提供对外接口调用,而不同的虚拟机技术通过调用libvirt提供的接口来完成自己所需要的功能。

0 0
原创粉丝点击