阅读目录
- 什么是kvm
- 为何要用kvm
- kvm的功能
- 常见虚拟化模式
- KVM架构
- KVM工具集合
一 什么是kvm
KVM 全称 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的,这就使得linux内核本身就相当于一个Hypervisor。
Hypervisor即vmm,主要功能就是用来控制生成vm,并管理多个vm的运行,不同的vm中可以安装不同的操作系统,这些操作系统共用一台硬件主机,
因为直接使用linux内核的调度器进行管理,所以比xen的代码少很多
二 为何要用kvm
虚拟化是云计算的基础之一,而无论是在部署,还是在研发、测试方面,kvm都是排在第一位的Hypervisor(即vmm)。
kvm以高性能,可扩展性、高安全性,以及低成本而深受用户喜爱,这一切也与他基于linux内核实现有关。
三 kvm的功能
kvm用一个个进程来运行虚拟机。
最主要的功能:
- 基于kvm,可以执行热迁移,将一个运行的虚拟机从一个运行vm从一台物理机移动到另外一台物理主机,而vm里的运行不受影响(几台部署kvm虚拟化的物理机共享一个存储,存储内存放虚拟机的xml文件,这样在另外一台主机启一个虚拟机的进程是很快的,然后关联上待迁移主机的xml文件,就实现了热迁移);
- 可以保存当前虚拟机的运行状态到硬盘,然后可以重新启动虚拟机,这是虚拟机的运行状态和之前一样。
其余功能:
- 支持CPU 和 memory 超分(Overcommit)
- 支持半虚拟化I/O (virtio)
- 支持热插拔 (cpu,块设备、网络设备等)
- 支持对称多处理(Symmetric Multi-Processing,缩写为 SMP )
- 支持 PCI 设备直接分配和 单根I/O 虚拟化 (SR-IOV)
- 支持 内核同页合并 (KSM )
- 支持 NUMA (Non-Uniform Memory Access,非一致存储访问结构 )
四 常见虚拟化模式
按照Hypervisor的实现方式和位置不同,常见的形式分两种
1. 全虚拟化
物理机上首先安装常规的操作系统( Redhat、Ubuntu 和 Centos等),然后在操作系统上安装kvm,kvm即Hypervisor,它会 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。除此之外:VirtualBox 和 VMWare Workstation 都属于这个类型。
2. 半虚拟化
Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型。
五 KVM架构
openstack可以兼容很多虚拟化解决方案,其中最主要的就是针对x86平台的kvm。
KVM 全称 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的,这就使得linux内核本身就相当于一个Hypervisor。
具体的:
基于kvm创建的vm就是一个普通的linux进程,由linux内核调度程序进行调度,vm因此可以使用linux内核已有的功能。vm的执行本质就是vm中cpu的执行,因此vm的每个cpu就是普通的linux进程。
KVM有一个内核模块叫 kvm.ko,只提供 CPU 和内存的虚拟化,而针对于IO及其他硬件设备(网络及存储等)的虚拟化,则是交给qemu实现,qemu运行在用户态通过/dev/kvm接口设置一个客户机虚拟机服务器的地址空间,向kvm提供模拟的I/O,并且将它的视频显示映射回宿主的显示屏。
其实qemu本身就是一种虚拟化技术,它与kvm的区别如下
1. 上图的左侧:完全基于Qemu纯软件(不包含操作系统内核)实现的虚拟化。kqemu是通过kqemu模块实现内核态的加速,在用户态的qemu通过访问/dev/kqemu设备文件接口调用改进加速。不过,此类模式主要针对Guest os与Host os属于统一cpu架构(比如都是x86的架构)。一个明显的缺点是性能低下。
2. 上图的右侧:qemu+kvm实现的虚拟化(即qemu-kvm)。具体的,KVM并不能算是一个完整的虚拟化解决方案,kvm只是Linux标准内核加载了一个据说有几万行代码的模块kvm.ko。也就是说KVM仅可以在VT技术的基础上,提供虚拟的处理器和虚拟内存,至于IO硬件的模仿都交给qemu去做。
创建虚拟机流程
-
- 标准的Linux内核中加入KVM的模块kvm.ko变身成为一个VMM(VMM Virtual MachineMonitor)
- 在原有的用户模式(工作在ring3)和内核模式(工作在ring0)两种模式的基础上增加了新的客户模式。客户模式存在的特权级别与ring0-3正交。(也就是说客户模式也存在4个特权级别)
- 用户创建虚拟机,通过调用用户模式的qemu程序,qemu与kvm提供的libkvm库为接口,传递创建指令。
- 打开/dev/kvm文件并获得文件描述符fd后,通过ioctl指令写入KVM_CREATE_KVM,即可创建一个虚拟机,并返回一个fd_vm的虚拟机文件描述符。
- 获得fd_vm后,通过ioctl调用KVM_CREATE_VCPU指令,可以对fd_vm所对应的虚拟机创建vCPU,并对vCPU做初始化操作。
- 然后通过KVM_RUN指令对fd_vcpus操作,启动运行虚拟机。
总结:
- Guest OS(此处vm1的linux os):客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被 KVM 置于一种受限制的 CPU 模式下运行。
- KVM:运行在内核空间,提供CPU 和内存的虚级化,以及客户机的 I/O 拦截。Guest 的 I/O 被 KVM 拦截后,交给 QEMU 处理。
- QEMU:修改过的为 KVM 虚机使用的 QEMU 代码,运行在用户空间,提供硬件 I/O 虚拟化,通过 IOCTL /dev/kvm 设备和 KVM 交互。
KVM 是实现拦截虚机的 I/O 请求的原理:
现代 CPU 本身实现了对特殊指令的‘截获’和‘重定向’的硬件支持,甚至新的硬件会提供额外的资源来帮助软件实现对关键硬件资源的虚拟化从而提高性能。以 X86 平台为例,支持虚拟化技术的 CPU 带有特别优化过的指令集来控制虚拟化过程。通过这些指令集,VMM 很容易将客户机置于一种受限制的模式下运行,一旦客户机视图访问物理资源,硬件会暂停客户机的运行,将控制权交回给 VMM 处理。VMM 还可以利用硬件的虚级化增强机制,将客户机在受限模式下对一些特定资源的访问,完全由硬件重定向到 VMM 指定的虚拟资源,整个过程不需要暂停客户机的运行和 VMM 的参与。由于虚拟化硬件提供全新的架构,支持操作系统直接在上面运行,无需进行二进制转换,减少了相关的性能开销,极大简化了VMM的设计,使得VMM性能更加强大。从 2005 年开始,Intel 在其处理器产品线中推广 Intel Virtualization Technology 即 IntelVT 技术。
QEMU-KVM:
其实 QEMU 原本不是 KVM 的一部分,它自己就是一个纯软件实现的虚拟化系统,所以其性能低下。但是,QEMU 代码中包含整套的虚拟机实现,包括处理器虚拟化,内存虚拟化,以及 KVM需要使用到的虚拟设备模拟(网卡、显卡、存储控制器和硬盘等)。
为了简化代码,KVM 在 QEMU 的基础上做了修改。VM 运行期间,QEMU 会通过 KVM 模块提供的系统调用进入内核,由 KVM 负责将虚拟机置于处理的特殊模式运行。遇到虚机进行 I/O 操作,KVM 会从上次的系统调用出口处返回 QEMU,由 QEMU 来负责解析和模拟这些设备。
从 QEMU 的角度看,也可以说是 QEMU 使用了 KVM 模块的虚拟化功能,为自己的虚机提供了硬件虚拟化加速。除此以外,虚机的配置和创建、虚机运行说依赖的虚拟设备、虚机运行时的用户环境和交互,以及一些虚机的特定技术比如动态迁移,都是 QEMU 自己实现的。
KVM:
KVM 内核模块在运行时按需加载进入内核空间运行。KVM 本身不执行任何设备模拟,需要 QEMU 通过 /dev/kvm 接口设置一个 GUEST OS 的地址空间,向它提供模拟的 I/O 设备,并将它的视频显示映射回宿主机的显示屏。它是KVM 虚机的核心部分,其主要功能是初始化 CPU 硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚机的运行提供一定的支持。以在 Intel 上运行为例,KVM 模块被加载的时候,它:
- 首先初始化内部的数据结构;
- 做好准备后,KVM 模块检测当前的 CPU,然后打开 CPU 控制及存取 CR4 的虚拟化模式开关,并通过执行 VMXON 指令将宿主操作系统置于虚拟化模式的根模式;
- 最后,KVM 模块创建特殊设备文件 /dev/kvm 并等待来自用户空间的指令。
接下来的虚机的创建和运行将是 QEMU 和 KVM 相互配合的过程。两者的通信接口主要是一系列针对特殊设备文件 dev/kvm 的 IOCTL 调用(ioctl是设备驱动程序中对设备的I/O通道进行管理的函数)。其中最重要的是创建虚机。它可以理解成KVM 为了某个特定的虚机创建对应的内核数据结构,同时,KVM 返回一个文件句柄来代表所创建的虚机。
针对该句柄的调用可以对虚机做相应地管理,比如创建用户空间虚拟地址和客户机物理地址、真实物理地址之间的映射关系,再比如创建多个 vCPU。KVM 为每一个 vCPU 生成对应的文件句柄,对其相应地 IOCTL 调用,就可以对vCPU进行管理。其中最重要的就是“执行虚拟处理器”。通过它,虚机在 KVM 的支持下,被置于虚拟化模式的非根模式下,开始执行二进制指令。在非根模式下,所有敏感的二进制指令都被CPU捕捉到,CPU 在保存现场之后自动切换到根模式,由 KVM 决定如何处理。
除了 CPU 的虚拟化,内存虚拟化也由 KVM 实现。实际上,内存虚拟化往往是一个虚机实现中最复杂的部分。CPU 中的内存管理单元 MMU 是通过页表的形式将程序运行的虚拟地址转换成实际物理地址。在虚拟机模式下,MMU 的页表则必须在一次查询的时候完成两次地址转换。因为除了将客户机程序的虚拟地址转换了客户机的物理地址外,还要将客户机物理地址转化成真实物理地址。
四 KVM工具集合
Libvirt:简单说就是 KVM 的管理工具。并且Libvirt 除了能管理 KVM 这种 Hypervisor,还能同时管理 vmware,XEN,Hyper-v, LXC,QEMU 等多种Hypervisor。
Libvirt 本质就是一组API,通常部署完libvirt后,都会包含 3 样东西:一个API 库,一个后台守护进程libvirtd和一个命令行工具virsh。
- API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化管理KVM的常用工具。;
- libvirtd是服务程序,接收和处理 API 请求;
- virsh :基于 libvirt 的 命令行的常用工具 (CLI)。
一:libvirt实现在一台物理机上同时跑多个虚拟机监控程序vmm
libvirt期初是专门为Xen设计的一种管理API,后来被扩展为可支持多个VMM,libvirt以一组API的形式存在,负责与每个vmm通信,完成API请求
左图是没有引入libvirt时,一台机器只能运行一个Hypervisor/vmm,右图是引入了libvirt时,一台机器可以同时运行多个Hypervisor/vmm,此时需要注意的是,libvirt把物理主机称作节点,将来宾操作系统(guest os)称为域Domain,而libvirt及其应用程序在宿主机Domain 0中运行
二 libvirtd提供从远程应用程序访问本地域的方式
三 libvrt api与相关驱动程序的层次结构。
libvirt 已经为表 1 所列举出来的的虚拟机监控程序实现了驱动程序。随着新的虚拟机监控程序在开源社区出现,其他驱动程序无疑也将可用。
四 libvirt主要功能总结
- Domain(虚拟机)管理:启动、停止、暂停、保存、恢复和迁移。支持多种涉笔类型的热插拔,如磁盘、网卡、内存和cpu。
- 远程访问支持:见图2,只要在一台主机上运行libvirtd守护进程,所有的libvirt功能就都可以访问和使用。支持多种网络远程传播,使用最简单的SSH,不需要额外的配置工作,比如example.com物理机运行了libvirtd,而且允许SSH访问,下面命令就可以在远程的主机上使用virsh命令:virsh -connect qemu+ssh://[email protected]/system
- 存储管理:任何运行了libvirtd的主机都可以用来管理不同类型的存储,如创建不同格式的文件映像(qcow2,vmdk,raw等),挂接NFS共享、列出现有的LVM卷组、创建新的LVM卷组和逻辑卷、对未处理过的磁盘设备分区、挂在iSCSI共享等等,因为libvirt可以远程工作,所有这些都可以通过远程主机来使用。
- 网络接口管理:任何运行了libvirtd的主机都可用来管理物理和逻辑的网络接口,可以列出现有的接口、配置参数、桥接、VLAN和关联设备等,也可以创建新的网络接口。
- 虚拟NAT和基于路由的网络:任何运行了libvirtd的主机都可以用来管理和创建虚拟网络。libvirt虚拟网络使用防火墙规则作为路由器,让虚拟机可以透明访问主机的网络。
ps:libvirt使用 C 语言编写,可以由 Python,Ruby, Perl, PHP, Java 等语言调用,OpenStack 底层也使用 libvirt。更详细猛击这里
除此之外还包含下列工具:
virt-v2v:虚机格式迁移工具
virt-* 工具:包括 virt-install(创建KVM虚机的命令行工具),virt-viewer(连接到虚机屏幕的工具),virt-clone(虚机克隆工具),virt-top 等
sVirt:安全工具