KVM虚拟化原理探究(一)
一、KVM虚拟化简介:
1、kvm介绍
KVM全称kernel-based virtual machine,由Qumranet公司发起,2008年被RedHat收购。
KVM实现主要基于Intel-V或者AMD-V提供的虚拟化平台(完全虚拟化),利用普通的Linux进程运行与虚拟态的指令集,模拟虚拟机监视器和CPU。KVM不提供硬件虚拟化操作,其IO操作等都借助QEMU来完成。
KVM有如下特点:
- guest作为一个普通进程运行于宿主机
- guest的CPU(Vcpu)作为进程的线程存在,并受到宿主机内核的调度
- guest继承了宿主机内核的一些属性,比如huge pages(大页表)
- guest的磁盘IO和网络IO会受到宿主机的设置影响
- guest通过宿主机上的虚拟网桥与外部相连
提示:KVM是linux内核中的一个模块,而对于用户要操作Linux内核中的模块所提供的功能,必须在用户空间装上一个用户控件软件,通过系统调用的方式去操作;QMU就是KVM在用户空间的管理功能,有点类似iptables是netfilter的管理工具;上面架构图上kvm的主要作用是提供CPU和内存的虚拟化,以及客户机的I/O的拦截,Guest的部分I/O被kvm拦截后,交给QEMU处理。QEMU通过修改过的KVM虚机使用的QEMU代码,运行在用户空间,提供硬件I/O虚拟化,通过IOCTL/dev/kvm设备和KVM交互,但是,KVM本身不执行任何硬件模拟,需要用户空间程序通过/dev/KVM接口设置一个客户机虚拟服务器的地址空间,向它提供模拟I/O,并将它的视频显示映射回宿主机的显示屏。
二、虚拟化技术分类:
虚拟化是云计算的基础。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟化,虚拟化共享物理机的CPU、内存、IO硬件资源,但逻辑上虚拟机之间是相互隔离的。物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(guest)。
1、分类
(1)、模拟:Emulation
Qemu,PearPC,Bochs
(2)、完全虚拟化:Full Virtualization,Native Virtualization
- 完全虚拟化提供底层物理系统的全部抽象化,且抽象一个新的虚拟系统,客户机操作系统可以在里面运行,不需要对客户机操作系统或者应用程序进行修改(客户机操作系统或者应用程序像往常一样运行,意识不到虚拟环境的存在)
- VMware是一款完全虚拟化软件。完全虚拟的弱点是效率不如半虚拟化高。半虚拟化系统性能可以接近在裸机上的性能。
- VMWare Workstation, VirtualBox, VMWare Server, Parallels Desktop, KVM(hvm), XEN(hvm)
(3)、半虚拟化:Para-Virutalization
- 半虚拟化需要对运行在虚拟机上的客户机操作系统进行修改(这些客户机操作系统会意识到它们运行在虚拟环境里)并提供相近的性能,但半虚拟化的性能要比完全虚拟化更优越。
- 特点:GuestOS明确知道自己运行在虚拟机之上
- xen,UML(user-mode linux)
(4)、容器级虚拟化
LXC,OpenVZ,libcontainer,runC,rkt,Linux V Server,Virtuozzo
(5)、库级别虚拟化
wine
(6)、程序级虚拟化
jvm,pvm
2、主机虚拟化:
Emulation,Full Virtualization,Parz-Virutalization
Type-I:Hypervisor直接运行于硬件;
Type-II:Hypervisor运行主机OS之上;
3、云栈的类别:
- IaaS(Infrastructure-as-a-Service)基础设施服务
- Paas(Plantfrom-as-a-Service)系统平台服务
- SAAS(Software-as-a-Service)软件服务
- FWaaS(FireWall as a Service)防火墙服务
- DBaaS(DataBasw-as-a-Service)数据库服务
- LBaaS(load-balancer-as-a-Service)负载均衡服务
三、主流虚拟化架构
3.1 主流虚拟化技术架构:ESXI、Xen、KVM
主要差别在于各组件(CPU、内存、磁盘与网络IO)的虚拟化与调度管理实现组件有所不同。在ESXI中,所有虚拟化功能都在内核中实现。Xen内核仅实现CPU与内存虚拟化,IO虚拟化与调度管理由Domain0(主机上启动的第一个管理VM)实现。KVM内核实现CPU与内存虚拟化,QEMU实现IO虚拟化,通过Linux进程调度器实现VM管理。
3.2、KVM整体架构
1)kvm内核模块:主要包括kvm虚拟化核心模块KVM.ko,以及硬件相关的KVM_intel或KVM_AMD模块;负责CPU与内存虚拟化,包括VM创建,内存分配与管理、VCPU执行模式切换等;
2)QEMU设备模拟:实现IO虚拟化与各设备模拟(磁盘、网卡、显卡、声卡等),通过IOCTL系统调用与KVM内核交互。KVM仅支持基于硬件辅助的虚拟化(如Intel-VT与AMD-V),在内核加载时,KVM先初始化内部数据结构,打开CPU控制寄存器CR4里面的虚拟化开关,执行VMXON指令将Host OS设置为root模式,并创建的特殊设备文件/dev/kvm等待来自用户空间的命令,然后KVM内核与QEMU相互配合实现VM的管理。KVM会复用部分Linux内核的能力,如进程管理调度、设备驱动、内存管理等;
3)、虚拟cpu
guest的所有用户界别(user)的指令集,都会直接由宿主机线程执行,此线程会调用KVM的ioctl方式提供的接口加载guest的指令并在特殊的CPU模式下运行,不需要经过cpu指令集的软件模拟转化,大大的减少了虚拟化成本,这也是KVM优于其他虚拟化方式的点之一。
4)、虚拟IO设备
guest作为进程存在,但让他的内核的所有驱动等都存在,只是硬件被QEMU所模拟(后面介绍livtio的时候特殊)。guest的所有硬件操作都会有QEMU来接管,QEMU负责与真实宿主机打较交道。
5)、虚拟内存
guest的内存在host上emulator提供,对emulator来说,guest访问的内存就是他的虚拟地址空间,guest上需要经过一次虚拟地址到物理地址的转换,转换到guest的物理地址其实也就是emulator的虚拟地址,emulator再次经过一次转换,转换为host的物理地址。后面会有介绍各种虚拟化的优化手段,这里只是一个overview。
guest的内存在host上由emulator提供,对emulator来说,guest访问的内存就是他的虚拟地址空间,guest上需要经过一次虚拟地址到物理地址的转换,
3.3 CPU虚拟化
1)、pCPU与vCPU:
物理服务器上通常配置2个物理PCPU(Socket),每个CPU有多个核;开启超线程Hyper-Threading技术后,每个core有两个线程(Thread);在虚拟化环境中一个Thread对应一个vCpu。在KVM中每个VM就是一个用户空间的QEMU进程,分配给Guest的vCPU就是该进程派生的一个线程Thread,由Linux内核动态调度到基于时分复用的物理pCPU上运行。KVM支持设置CPU亲和性,将vCPU绑定到特定物理pCPU,如通过libvirt驱动指定从NUMA节点为Guest分配vCPU与内存。KVM支持vCPU超分(over-commit)使得分配给Guest的vCPU数量超过物理CPU线程总量。
2)、虚拟化类型对比