KVM基础之一

KVM:

  虚拟化技术有两种类型的实现:

  Type-I : hypervisor------>VM

  Type-II:host------>VM----->VMS

  Xem:hypervisor,Dom0

  KVM(Kernel-based Virtual Machine):基于内核虚拟机  依赖于HVM:Inter VI-X,ADM ADM-V 两种技术任何一种

官网

一、 kvm架构
KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 线程。这使得 KMV 能够使用 Linux 内核的已有功能。
但是,KVM 本身不执行任何硬件模拟,需要用户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。

二、 CPU 配置

在 QEMU-KVM中,QEMU 提供对 CPU 的模拟,展现给客户机一定 CPU 数目和 CPU 的特性;在kvm开启的情况下,客户机中 CPU 指令的执行由硬件处理器的虚拟化功能来辅助执行,具有非常高的执行效率。

2.1  Vcpu 概念

QEMU/KVM 为客户机提供了一整套的硬件系统环境,在客户机看来其所拥有的 CPU 即是 vCPU(Virtual cpu)。在 KVM 环境中,每个客户机都是一个标准的 Linux 进程(QEMU 进程),而每一个 vCPU 在宿主机中是 QEMU 进程派生的一个普通线程。在 虚拟化基础 里已经提出过这个概念。

在普通的 Linux 系统中,进程一般有两种执行模式:内核模式和用户模式。而在 kvm 环境中,增加了第三种模式:客户模式。vCPU 在三种执行模式下的不同分工:

(1)用户模式(User mode)

  主要处理 I/O 的模拟和管理,由 QEMU 的代码实现;

(2)内核模式(Kernel mode)-------“来宾 内核” 模式

  这里的 内核模式 是 GuestOS 内核模式,主要处理特别需要高性能和安全相关的指令,如处理客户模式到内核模式的转换,处理客户模式下 I/O 指令或其他特权指令引起的退出(VM-Exit),处理影子内存管理(shadow MMU);

(3)客户模式(Guest mode)-----“来宾 用户”的用户模式

  主要执行 Guest 中的大部分指令, I/O 和一些特权指令除外。

◆ Guest:客户机系统,包括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 交互。

   在系统的底层 CPU 硬件中需要有硬件辅助虚拟化技术的支持(Intel VT 或 AMD-V),宿主机就运行在硬件之上,KVM 的内核部分是作为可动态加载内核模块运行在宿主机中的,其中一个模块是和硬件无关的实现虚拟化核心基础架构的kvm模块,另一个是硬件平台相关的 kvm_intel(或 kvm_amd)模块。而 KVM 中的一个客户机是作为一个用户空间进程(qemu-kvm)运行的,它和其他普通的用户空间进程一样由内核来调度使其运行在物理 cpu 上,不过它由 KVM 模块的控制,可以在前面介绍的三种模式下运行。

 Linux 上的用户空间、内核空间和虚机:

2.2、lscpu 能够查看当前主机是否开启虚拟化功能,通过上面信息得知:

  CPU 型号:英特尔核心处理器

  核心:4

  虚拟化技术:VT-x

由于上面是通过 KVM 虚拟机,可以看到 Hypervisor vendor: KVM

2.3、确认模块是否加载

[root@192.168.118.14 ~]#lsmod | egrep kvm
kvm_intel             162153  0
kvm                   525259  1 kvm_intel
[root@192.168.118.14 ~]#ls /dev/kvm
/dev/kvm

2.4、KVM的组件

  两类组件:

  /dev/kvm 工作于内核空间(物理机),可通过ioctl()系统调用来完成VM创建、启动等管理功能;它是一个字符设备创建VM、为VM分配内存、读写VCPU的寄存器、向VCPU注入中断、运行VCPU等

      是 kvm 内核模块提供给用户空间 qemu-kvm 程序使用的一个控制接口,它提供了客户机(Guest)操作系统运行所需要的模拟和实际的硬件设备环境。

 ·  qemu进程:工作于用户空间,主要用于实现模拟PC机的IO设备

2.5、KVM特性

  内存管理:

    •  将分配给VM的内存交换值SMAP
    •  支持使用Huge Page
    •  支持使用Inter EPT或AMD RVI技术完成内存地址映射:GVA------>GPA------>HPA
    •     支持KSM(Kernel  Same-page Merging)

 硬件支持:却决于Linux内核

 存储:

  • 本地存储
  • 网络附加存储
  • 存储区域网络
  • 分布式存储

设备驱动:

  I/O设备的完全虚拟化:模拟硬件

  I/O设备的半虚拟化:在GuestOS中安装驱动 ----- virtio

2.6、KVM局限性

 一般局限性:

    所有虚拟机虚拟的CPU核心数量不应大于物理CPU核心数量

    时间记录难以精确,依赖于时间同步机制

    MAC地址随机:VM量特别大时,存在冲突的可能性  

2.7、KVM工具

  • Qemu:
    • qemu-kvm
    • qemu-img
  • libvirt:
    • GUI:virt-manager,virt-viewer
    • CLI:virt-install,virsh  

 

 QEMU主要提供以下几个部分:

  •   处理器模拟器
  •   仿真IO设备
  •   关联模拟的设备至真是设备
  •   调试器
  •   与模拟器交互的用户接口

 补充:KVM内存管理

  KVM继承了linux系统管理内存的诸多特性,比如 分配给虚拟使用的内存可以被交换至交换空间、能够使用大内存页以实现更好的性能,以及对NUMA的支持能够让虚拟机高效访问更大的内存空间等。

  KVM基于Intel的EPT(Extended Page Table)或AMD的RVI技术可以支持更新的内存虚拟功能,这可以降低CPU的占用率,并提供较好的吞吐量

  KVM还借助于KSM(Kernel Same-page Merging)这个内核特性实现了内存页面共享,KSM通过扫描每个虚拟机的内存查找各虚拟机见相同的内存页,

并将这些内存页合并为一个被各相关虚拟机共享的单独页面,在某虚拟机试图修改此页面中的数据时,KSM会重新为其提供一个新的页面副本。实践中,运行于同一台物理主机上的具有享同GusetOS的虚拟机之间出现相同内存页面的概率是很小的,比如共享库、内核户或其它内存对向等都有可能表现为相同的内存页,因此,KSM技术可以降低内存占用进而提高整体性能。

  

https://www.cnblogs.com/hukey/p/11149976.html 

https://blog.csdn.net/weixin_44907813/article/details/107380330

原文地址:https://www.cnblogs.com/liuzhiyun/p/13495383.html