KVM in OpenStack




图裂请查看原文!

原文地址:http://aspirer2004.blog.163.com/blog/static/1067647201531452142289/

本文结构及部分内容参考了:http://files.meetup.com/10602292/kvm%20features.pdf海云捷迅–Dexin(Mark) Wu)

本文主要介绍KVM(QEMU)在OpenStack开源云平台中的地位、作用、用途,以及目前各种功能的应用情况,最后介绍了一些常见场景的具体使用方式和流程。 目录结构如下:

  1. KVM介绍
  2. KVM与QEMU及libvirt三者的关系
  3. KVM子系统在OpenStack中的应用
    • Cpu
    • Memory
    • Storage
    • Network
    • others
  4. OpenStack应用实例分析
    • 创建云主机
    • 挂载云硬盘
    • 修改云主机规格
    • 在线迁移云主机

KVM简单介绍

KVM是Kernel-based Virtual Machine的简称,一套X86平台CPU架构下的完全虚拟化解决方案,它依赖Intel-VT或者AMD-V硬件辅助虚拟化技术[1],同时支持EPT和AMD NPT内存虚拟化技术[2],以提升CPU和内存的虚拟化性能[3]。 06年10月以色列qumranet公司发布,2.6.20加入内核主干(充分利用Linux内核既有代码),08年qumranet被redhat收购,之后由redhat主导开发。 kvm提供可动态加载的内核模块kvm.ko,以及支持具体的CPU厂商的kvm_intel.ko或kvm_amd.ko。 提供与内核交互的途径(/dev/kvm)、管理内核中虚拟机数据结构、状态信息、捕获并处理虚拟机遇到的特殊指令等,不模拟具体的设备。 简化版架构图如下:

2015年04月14日 - aspirer - Aspirers blog

2015年04月14日 - aspirer - Aspirers blog

从上图中可以看出,KVM主要是负责kernel-mode部分。

KVM与QEMU的关系

既然KVM不负责具体的虚拟机运行必须的硬件如BIOS、磁盘、IO设备、PCI设备等,那么就得依靠其他软件来实现,目前来说,实现这部分硬件模拟功能的软件就是QEMU。 QEMU:quick emulate简写而成,一个开源的硬件设备模拟软件,比KVM历史更早,优点是可以模拟多种架构和设备[4],不足在于原始的qemu是不支持硬件加速的,所以效率比较低。 qemu本身不依赖kvm,没有kvm,qemu照样可以做到配合kvm可以做的任何事(只是性能很差,这一点可以从Android设备模拟的时候体验到),qemu本身就不是为kvm而生的。 kvm出现后,为了专门支持kvm,形成了qemu-kvm,目前qemu已经原生支持kvm,也就是不需要做任何改动就可以配合kvm使用(当然还有专门支持Xen而形成了qemu-xen),KVM与QEMU二者在内核态和用户态互相配合,极大的提升了虚拟化性能,二者目前来说是一个整体,打个比方来解释二者的关系:QEMU是普通发动机汽车,KVM+QEMU就是喷气式发动机汽车!

2015年04月14日 - aspirer - Aspirers blog

QEMU和libvirt的关系

目前要直接使用QEMU,只能用命令行方式运行,没有相关API提供,使用不方便,很多在线命令,如热插拔磁盘、网卡等,是需要交互式执行的,显然是不适合大规模环境下应用,要记住那么多的参数也是一件及其痛苦的事情[5]。

2015年04月14日 - aspirer - Aspirers blog

为了解决这一问题,也为了形成统一的管理接口层,libvirt诞生了,最初libvirt是为了解决qemu-xen遇到的上述管理问题,但由redhat主导开发的libvirt的目标远不止于此。 libvirt[6],顾名思义,是lib+virt的意思,虚拟化软件库,专门提供各种虚拟化平台的统一接口,支持很多虚拟化软件如:qemu、xen、virtual box,lxc等等。 原生C开发,提供各种绑定语言接口,C#、python、Java、ruby等,各大开源云计算平台几乎都是用libvirt作为底层虚拟化软件接口层提供服务。 libvirt使用更加人性化的xml格式配置来定义虚拟机各种参数信息,libvirt会解析这些xml配置,并最终转化为qemu的命令行参数,并在用户执行启动虚拟机命令时把qemu进程拉起来(用xml中的各种参数)。

2015年04月14日 - aspirer - Aspirers blog

KVM子系统在OpenStack中的应用

在此我们不再区分KVM和QEMU,认为他们是一个整体,统称为KVM。 KVM在OpenStack中应用的整体架构图如下:
2015年04月14日 - aspirer - Aspirers blog

CPU子系统

  • 可以使用host-model、host-passthrough两种模式
  • 每个vm都是一个用户态的qemu进程
  • 每个vcpu都是一个用户态的隶属于qemu进程的线程
  • 可以通过cgroup或者其他Linux工具对qemu进程执行各种资源限制操作(qemu默认就提供cgroup支持)
  • 支持vcpu绑定到特定范围的pcpu,防止vm影响宿主机进程(vcpu_pin_set配置项指定)
  • 支持设置vcpu的weight、period、quota,网易云利用该特性还开发了ecu功能,可以保障每个vcpu的计算能力
  • 单个vm的vcpu绑定设置、vcpu拓扑结构设置、vNUMA等功能正在开发中(qemu和libvirt已经支持),网易云利用拓扑结构设置,支持了超过2核的windows云主机
  • vcpu热插拔功能还没有开发计划(qemu和libvirt已经支持,但不够稳定)

MEMORY子系统

  • 支持设置内存复用比例(overcommit,通过配置项ram_allocation_ratio)
  • 支持内存预留(预留内存无法分配给vm,通过配置项reserved_host_memory_mb)
  • vm内存映射到qemu进程地址空间,qemu利用malloc和mmap分配内存
  • vm内存支持各种Linux内核的内存交互、合并、压缩等特性
  • vm支持内存大页(2M)(OpenStack开发中) 、透明大页特性
  • vm气泡方式(balloon)内存复用(qemu和libvirt已经支持,OpenStack未支持)
  • 内存热插(qemu已支持,libvirt和OpenStack未支持)

STORAGE子系统

  • 前端(vm内部驱动)支持IDE、SCSI、virtio、virtio-scsi,OpenStack默认使用virtio方式,也可以配置其他方式(镜像设置属性:hw_disk_bus=ide, hw_scsi_model=virtio-scsi)
  • 后端(qemu进程)支持的文件镜像格式包括raw、qcow2、vmdk、qed、vdi、vpc、vhdx等(通过glance上传镜像时可以指定镜像格式,也可以配置nova实际创建云主机的时候使用的格式libvirt_images_type、use_cow_images)
  • qemu支持的存储后端包括file、iscsi、host、ceph、sheepdog、glusterfs等
  • 后端磁盘缓存模式支持none、directsync、writeback、writethrough、nosafe
  • 支持IO限速功能(qemu内部实现和cgroup实现两种方式,支持限制读写bps和iops,新版支持burst模式),网易云硬盘使用的是cgroup方式,OpenStack支持单个vm的IO限速,可以在云主机规格里增加限制条件,但还不支持集群级别的限速
2015年04月14日 - aspirer - Aspirers blog
2015年04月14日 - aspirer - Aspirers blog

NETWORK子系统

  • 前端支持多种网卡类型包括virtio、i82551、i82557b、i82559er、ne2k_pci、ne2k_isa、pcnet、rtl8139、e1000等,可以通过镜像属性hw_vif_model选择网卡型号
  • 后端支持bridge、socket、tap、vhost-net、sriov、vhost-user等网络设备
  • 支持多队列virtio网卡
2015年04月14日 - aspirer - Aspirers blog

OTHERS

  • 显卡设备:支持cirrus、std vga、vmware、qxl等显卡,也可以设置为none不配置显卡设备,OpenStack默认使用std vga显卡,也通过镜像属性设置其他设备:hw_video_model=qxl,还可以设置显存容量:hw_video_ram
  • 串口设备:qemu-guest-agent(镜像属性里可以控制是否启用:hw_qemu_guest_agent=yes/no)、pty、文件
  • 图形终端:VNC、spice
  • 输入输出设备:usb、ps2

OpenStack应用实例分析

OpenStack用到的KVM管理操作功能

主要有启动、关机、暂停、休眠、恢复、唤醒、磁盘冷热插拔、网卡冷热插拔、快照、VNC、在线迁移等

创建云主机

2015年04月14日 - aspirer - Aspirers blog

挂载云硬盘

2015年04月14日 - aspirer - Aspirers blog

修改云主机规格

2015年04月14日 - aspirer - Aspirers blog

在线迁移云主机

2015年04月14日 - aspirer - Aspirers blog

参考资料:

[1] X86虚拟化: http://zh.wikipedia.org/wiki/X86虚拟化 [2] AMD NPT/Intel EPT简介: http://blog.pchome.net/article/458429.html [3] Extending KVM with new Intel ? Virtualization technology: http://www.linux-kvm.org/wiki/images/c/c7/KvmForum2008$kdf2008_11.pdf [4] http://zh.wikipedia.org/wiki/QEMU, http://blog.chinaunix.net/uid-25714487-id-3560065.html [5] http://linux.die.net/man/1/qemu-kvm, [6] http://www.xuebuyuan.com/930444.html,

其他资料:

《系统虚拟化——原理与实现》 《KVM虚拟化技术:实战与原理解》 《云计算与OpenStack(虚拟机Nova篇)》 http://www.linux-kvm.org/ http://wiki.qemu.org/ http://libvirt.org/ http://docs.openstack.org/