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。
在 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