KVM 虚拟化技术
- CPU虚拟化技术
- 内存虚拟化技术
- IO虚拟化技术
- 网络IO虚拟化技术
- 磁盘IO虚拟化技术
虚拟化技术分类
- 全虚拟化
- Full virtualization/ Software-based virtualization
- Hypervisor/VMM完全通过软件模拟硬件接口功能,Guest OS无需改动就能直接访问虚拟硬件。
- 举例:VMware
- 半虚拟化
- Paravirtualization/OS-assistant virtualization
- Hypervisor/VMM提供便利的接口,Guest OS调用接口访问虚拟硬件,GUEST OS需要修改
- 举例:Xen(2004)
- 硬件辅助虚拟化
- Native virtualization/Hardware-assistant virtualization
- Hypervisor/VMM利用宿主机硬件的支持提供虚拟硬件接口,Guest OS无需修改
- 举例:KVM(2007)
QEMU/KVM虚拟化软件
KVM是基于linux内核的虚拟化基础架构, 通过KVM模块将linux系统内核转化为VMM (virtual machine monitor) , 并在linux操作系统的用户模式和内核模式外, 添加了第三种运行模式即客户模式 (guest mode) , VMM即运行在该运行模式下, 其被视为一个常规的linux进程, 接收linux本身调度程序的统一调度, 从而KVM拥有linux内核所拥有的所所有功能。因此, KVM模块负责虚拟机的创建、虚拟内存的分配, v CPU寄存器的读写和运行等, 这只是虚拟化解决方案的第一步。第二步是利用QEMU模拟虚拟机的用户空间组件, 提供I/O设备模型以及访问外设的软件。
KVM作为linux内核的一个模块, 能够实现CPU和内存的虚拟化, 而QEMU则实现了用户空间组件和IO设备的虚拟化, 因此qemu-kvm也能创建和管理虚拟机, 但由于QEMU工具系统复杂, 使用效率低下, 因此, Red Hat使用libvirt来创建和管理虚拟机。
libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和应用程序接口 (API) 。它是一套开源的支持linux下虚拟化工具的函数库, 由三个部分组成:应用程序接口 (API) , 用于为其他虚拟机管理工具提供程序库支持;一个守护进程libvirtd, 用于管理所有域, 在使用工具对虚拟机进行管理时, 该守护进程需要打开;一个默认的命令行管理工具virsh, 它是libvirt项目中项目中默认的命令行管理工具, 具有定义、启动、停止等管理功能。
- 内核模块
- kvm.ko
- Kvm.intel.ko or kvm_amd.ko
- 应用程序
- CentOS/Fedora: yum install qemu-kvm
- Ubuntu/Debian: apt-get install qemu-kvm
- 获取OS镜像
- 运行
Qemu-system-x86_64 -m 1024 -hdc root_disk.img -vnc 0.0.0.0:0
CPU虚拟化技术
- Binary translation
- 将虚拟机内核指令在运行时替换为一系列指令,模拟虚拟机内核态指令的执行
- VMWare,Microsoft Virtual PC
- Intel VT-X
- 确认宿主机支持CPU硬件虚拟化
- Intel: cat /proc/cpuinfo | grep vmx
- Amd: cat /proc/cpuinfo | grep svm
- 启用kvm内核模块
- Kvm.ko & kvm_intel.ko
- Qemu/kvm启动参数
- Qemu-system-x86_64 -enable-kvm
内存虚拟化
如何高效实现虚拟机的虚拟地址到宿主机的物理地址的映射转换?
-
内存虚拟化的软件方案:
- 影子页表(Shadow Page Table): VMM(KVM)在宿主机内核中为虚拟机进程维护了一个虚拟机的虚拟地址到宿主机物理机制的页表,这个页表和虚拟机内核的页表同步更新。
基于SPT的虚拟机缺页中断
内存硬件辅助虚拟化方案
-
Second Level Address Translation
- Extended Page Tables(Intel)
- Nested Page Tables(AMD)
-
确认宿主机支持内存硬件虚拟化
- Intel: cat /proc/cpuinfo | grep ept
- Amd: cat /proc/cpuinfo | grep npt
-
启用kvm内核模块
- Kvm.ko & kvm_intel.ko
-
Qemu/kvm启动参数
- Qemu-system-x86_64 -enable-kvm