参考链接:
https://developer.aliyun.com/article/724394
传统软件运行在单个机器设备上的交付形式已经不能满足当下现代应用的交付的需求。现代应用轻量、动态、密集,为了更充分的利用单个机器上的计算、存储和网络,虚拟化技术应运而生。
在虚拟化技术的加持下,平台资源被当成一种服务能力动态的按需分配。这种服务能力根据交付形态不同,被分为
- IaaS
- PaaS
- SaaS
虚拟化的分类
关于VMM
全虚拟化 vs. 半虚拟化 | 全虚拟化中,不需要对虚拟主机做任何改动。在半虚拟化中需要对虚拟主机做少许调整(比如安装virtio驱动) | 半虚拟化:Xen ; 全虚拟化:KVM |
硬件虚拟化技术 vs. 软件模拟 | 采用硬件技术实现虚拟化 | 硬件虚拟化技术:KVM; 软件模拟:QEMU |
Type1型虚拟化 vs. Type2型虚拟化 | 是否基于操作系统实现虚拟化,type2 是基于OS | Type1: Xen ESXi;Type2: KVM QEMU VMWare Station |
KVM的基础
Intel VT-x AMD-V 硬件虚拟化技术 + linux内核虚拟化模块(内存管理和CPU资源隔离) + QEMU虚拟化环境
2006年10月,Qumranet对外宣布。
同月被纳入Linux Kernel,以Xen为代表的Type1型虚拟化技术是半虚拟化策略,Linux社区急需一种Type2型的全虚拟化技术。
KVM需要硬件虚拟化技术支持(VT-x / AMD-V)
KVM运行机制
CPU
KVM客户机对应一个Linux进程,每个vCPU是进程中的线程,IO处理由单独一个线程处理。
这样宿主机对虚拟主机的调度就可以按照进程的方式实现调度。
早期在没有硬件虚拟化技术之前,是通过指令的二进制翻译的方式在物理CPU上执行虚拟机的CPU指令。
Intel在处理器级别提供了对虚拟化技术的支持,VMX,个人理解,这里的硬件虚拟化技术是CPU指令层面的丰富,添加了VMEntry和VMExit 及 VMLAUNCH VMRESUME等等相关指令。这里边还需要更多的研究。
关于QEMU
QEMU用来软件模拟KVM虚拟化中的需要的外设。模拟BIOS、PCI/PCIE总线、磁盘、网卡、显卡、声卡、键盘、鼠标等.
QEMU本来和KVM是没有关系的,QEMU是采用传软件的方式模拟虚拟主机的所有行为,通过截获虚拟主机中的调用,然后用软件方式模拟。 在OpenStack实验环境中我们经常用QEMU作为虚拟化后端。
客户机所看到的硬件设备是QEMU模拟出来的,当客户机对模拟设备进行操作时,由QEMU截获并转换为对实际的物理设备(可能设置都不实际物理地存在)的驱动操作来完成。
但这里在KVM实现的虚拟化环境中,我们用QEMU来模拟部分外设,实现了KVM和QEMU的集成。
内存管理
KVM虚拟主机就是linux的进程,所以,虚拟主机的内存空间,就是Linux进程的虚拟地址空间。Linux内存管理的分页 mmap NUMA 都可以使用到客户端内存管理上。
只是在页面映射的时候,从虚机内到最终物理内存的页面映射很负责,中间出现了多次映射,效率可能会比较低。后来通过硬件EPT的方式替换。
存储
KVM是Linux内核的一部分,能够使用Linux支持的任何存储基础架构。
KVM支持的原生磁盘格式为QCOW2
设备驱动程序
KVM支持4种方式的外设虚拟化:
设备模拟 | QEMU | 纯软件模拟 |
前后端接口标准 | Virtio | 在虚拟主机中安装virtio半虚拟化驱动 |
设备直接分配 | VT-d | 硬件设备直通 |
设备共享分配 | SR-IOV | 硬件设备复用 VMDc |
硬件虚拟化技术的发展路径
- VT-x
- VT-d
- VT-c
- VMDq
- VMDc
KVM 内核模块
kvm内核模块分两部分
- 跟处理器无关的部分kvm.ko
- 分处理器有关的部分kvm_intel.ko
/dev/kvm
虚拟机的创建和运行将是一个用户空间的应用程序(QEMU)和KVM模块相互配合的过程。
/dev/kvm 这个设备可以被当作一个标准的字符设备,KVM模块与用户空间QEMU的通信接口主要是一系列针对这个特殊设备文件的loctl调用。
与EUMU/KVM结合的软件
1. Vhost-net
2. Open-vSwitch
3. DPDK
4. SPDK
5. Ceph
6. libguestfs
前三个是对网络,后三个是对存储
KVM管理端
1. Libvirt
2. Virsh
3. Virt-manager
4. openStack
KVM的展望4个方面:
稳定性
实时性
安全性
性能