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)、虚拟化类型对比

posted @ 2021-12-28 17:23  Day__Day_Up  阅读(71)  评论(0编辑  收藏  举报