2 虚拟化技术之KVM架构和部署

2.1 KVM概述

2.1.1 KVM介绍

KVM(Kernel-based Virtual Machine)是一个完整的虚拟化解决方案,适用于包含虚拟化扩展(Intel VT或AMD-V)的x86硬件上的Linux。目前也支持ARM等其它硬件平台,它由可加载的内核模块kvm.ko组成,它提供核心虚拟化基础架构和处理器特定模块,kvm-intel.ko或kvm-amd.ko,KVM的用户空间组件包含在QEMU1.3后续版本中,KVM目前已成为学术界的主流VMM(virtual machine monitor,虚拟机监视器,也称为hypervisor)之一

KVM是开源软件,可运行多个运行未修改的Linux或Windows映像的虚拟机

依赖于HVM;Intel VT-x,AMD AMD-V

官网:https://www.linux-kvm.org/

2006年10月,以色列Qumranet公司发布KVM,早期开发者Avi Kivity

2007年2月,KVM内核组件收录至Linux 2.6.20及后续版本中

2008年9月,Redhat 1.7亿美元收购

2009年9月,RHEL5.4中在集成XEN的同时,也将KVM添加进来

2011年11月,RHEL6使用KVM代替XEN

红帽kvm介绍

https://www.redhat.com/zh/topics/virtualization/what-is-KVM

RedHat虚拟化指南

https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/virtualization_getting_started_guide/index

RedHat创建虚拟机数量限制:

https://access.redhat.com/articles/rhel-kvm-limits

2.1.2 KVM架构

KVM是基于虚拟化扩展(Intel VT或者AMD-V)的X86硬件的开源的Linux原生的全虚拟化解决方案。KVM中,虚拟机被实现为常规的Linux进程,由标准Linux调度程序进行调度;虚机的每个虚拟CPU被实现为一个常规的Linux进程。这使得KVM能够使用Linux内核的已有功能。

但是,KVM本身不执行任何硬件模拟,需要客户空间程序通过/dev/kvm接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是QEMU。

2.1.2.1 KVM体系结构

  • KVM:初始化CPU硬件,打开虚拟机模式,负责CPU,内存,中断控制器,时钟,由内核模块kvm_xx.ko实现,工作于hypervisor,设备/dev/kvm,是一个字符设备,在用户空间可通过ioctl()系统调用来完成VM创建、启动,为VM分配内存、读写VCPU的寄存器、向VCPU注入中断、时钟等管理功能
  • QEMU进程:工作于用户空间,主要用于实现模拟IO设备,如显卡,网卡,硬盘等,qemu-kvm进程:工作于用户空间,用于实现一个虚拟机实例
  • Libvirt:提供统—APl,守护进程libvirtd和相关工具,如:virsh,virt-manager等

2.1.2.2 KVM模块载入后的系统的运行模式

内核模式:GuestOS执行I/O类操作,或其它的特殊指令的操作;称作"来宾-内核"模式

用户模式:代表GuestOS请求I/O类操作

来宾模式:GuestOS的非I/O类操作;它被称作"来宾-用户”模式,称作虚拟机的用户模式更贴切

2.1.2.3 KVM的组件

KVM:运行在内核空间,提供CPU和内存的虚级化,以及客户机的I/O拦截,Guest的部分I/O被KVM拦截后,交给QEMU处理。

两类组件:

  • (kvm.ko)/dev/kvm:工作为hypervisor,在用户空间可通过系统调用ioctl()与内核中的kvm模块交互,从而完成虚拟机的创建、启动、停止、删除等各种管理功能,可虚拟CPU和内存
  • qemu-kvm进程:工作于用户空间,用于实现IO设备模拟;也用于实现一个虚拟机实例

2.1.2.4 KVM功能

KVM所支持的功能包括:

  • 支持CPU和memory超分(Overcommit)
  • 支持半虚拟化I/O(virtio)
  • 支持热插拔(cpu,块设备、网络设备等)
  • 支持对称多处理(Symmetric Multi-Processing,缩写为SMP)
  • 支持实时迁移(Live Migration)
  • 支持PCI设备直接分配和单根I/O虚拟化(SR-IOV)
  • 支持内核同页合并(KSM)
  • 支持NUMA(Non-Uniform Memory Access,非一致存储访问结构)

2.1.2.5 QEMU

QEMU是一个广泛使用的开源计算机仿真器和虚拟机。当作为仿真器时,可在一种架构(如PC机)下运行另一种架构(如ARM)下的操作系统和程序。而通过动态转化,其可以获得很高的运行效率。当作为一个虚拟机时,qemu可以通过直接使用物理机的系统资源,让虚拟系统能够获得接近于物理机的性能表现。qemu支持xen或者kvm模式下的虚拟化。当用kvm时,qemu可以虚拟x86、服务器和嵌入式powerpc,以及s390的系统

QEMU当运行与主机架构相同的目标架构时可以使用 KVM。例如,当在一个x86兼容处理器上运行qemu-system-x86时,可以利用KVM加速——为宿主机和客户机提供更好的性能

Qemu是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,最熟悉的就是能够模拟一台能够独立运行操作系统的虚拟机,虚拟机认为自己和硬件打交道,但其实是和Qemu模拟出来的硬件打交道,Qemu将这些指令转译给真正的硬件,正因为Qemu是纯软件实现的,所有的指令都要经Qemu,性能非常低,所以,在生产环境中,大多数的做法都是配合KVM来完成虚拟化工作,KVM完成复杂及要求比较高的设备虚拟化,而Qemu完成像鼠标、键盘等设备的虚拟化。

QEMU有如下几个部分组成:

  • 处理器模拟器(x86、PowerPC和Sparc)
  • 仿真设备(显卡、网卡、硬盘、鼠标等)
  • 用于将仿真设备连接至主机设备(真实设备)的通用设备,实现透传
  • 模拟机的描述信息
  • 调试器
  • 与模拟器交互的用户接口

2.1.2.6 KVM局限性

  • CPU overcommit:过载使用,性能下降
  • 时间记录难以精确,依赖于时间同步机制,如NTP
  • VM量特别大时,MAC地址存在冲突的可能性
  • 实时迁移:共享存储,CPU架构,版本等
  • 性能局限性