KVM入门

虚拟化简介

CPU虚拟化

在没有VMX(vritualization extesion)之前,通过权限解除(de-privileged),使Guest OS运行在ring1之上,而Guest OS的应用程序运行在ring3,遇到可以trap的敏感指令(即是特权指令的敏感指令)则下陷,不能trap的边界指令,则编译前通过半虚拟化转换为可以trap ring0的系统调用或是运行时通过模拟仿真、二进制编译,强行翻译成别的东西进行系统调用。
在VMX出现之后,通过VT-x、AMD-V或TrustZone(secure world/non-secure world)的硬件虚拟化技术,将VM的Guest OS和应用程序分别运行在non-root的ring0和ring3下(或non-secure world的EL1和EL0下)省去了de-privileged的过程,只有遇到non-root下的异常、IO访问、指令和特定寄存器的访问,才会触发VMExit事件。

这里再总结整理下,根据原理不同,虚拟化技术可以分为三种:

  • 全虚拟化
    • 也就是VM完全感受不到是在实际物理机还是VMM上运行,就如上述提到的在没有VMX辅助的情况下,使用模拟仿真或二进制翻译实现的系统调用(trap捕获-handle翻译-emulate模拟的过程)。当然随之带来的也是性能的极大损耗
    • 二进制翻译可以分为解释执行(每条指令实时解释执行)、SBT静态翻译、DBT动态翻译
    • 工业界:Vmware Workstation、VirtualBox、Qemu
  • 半虚拟化
    • 半虚拟化,VM可以实实在在感觉到是在VMM上运行,因为修改了Guest OS的原生内核,不能虚拟化的指令都发给VMM的hypercall,通过hypercall直接和hypervisor层通信。省去了捕获和模拟,一定程度上提升了效率
    • 要修改内核,那显然是无法虚拟化windows了
    • 工业界:Xen
  • 硬件辅助的虚拟化
    • 就是上述引入的VMX,运行某些指令或遇到某些事件时,就发生VM exit,给VMM处理
    • 硬件虚拟化工业界:Intel的VT-x和AMD的AMD-V引入non-root模式,ARM的VHE引入EL2(TrustZone又引入EL3作为TrustZone Monitor)
    • :VMware ESXi、Microsoft Hyper-V、Xen 3.0、KVM

内存虚拟化

Host OS需要通过CPU的MMU,完成VA-MA(PA)的转换,而Guest OS需要两级转换:GVA-GPA-[VMM维护]-MA(HPA)
而没有内存虚拟化支持的情况下,VMM一般需要给Guest OS进程维护一个GVA到HPA的影子页表来完成地址转换

IO虚拟化

VM中所有的IO都会触发异常,然后陷入VMM,VMM则利用host OS上运行的一个应用级进程模拟调用Host OS的系统调用,完成操作
以VM Workstation为例,这个过程通过VMdriver、VMM和VMApp来协同完成:

KVM入门KVM入门

KVM介绍

基于内核的虚拟机

没有重新写一个VMM,而是选择了Linux Kernel,通过加载新的模块,将Linux Kernel变成一个VMM

基于虚拟化扩展(Intel VT或AMD-V)的x86硬件的开源的Linux原生全虚拟化解决方案。

KVM中虚拟机被实现成常规的Linux进程,由标准的Linux调度程序进行调度;虚拟机的每个vCPU都被实现为一个常规的Linux线程

KVM入门

KVM不执行硬件模拟,用户空间程序通过/dev/kvm接口设置一个客户机虚拟服务器的地址空间,向他提供模拟IO

  • Guest:客户机系统,包括CPU(vCPU)、内存、驱动(console、网卡、IO设备驱动等),被KVM置于一种受限制的CPU模式下运行
  • KVM:运行于内核空间,成为内核模块,提供CPU和内存的虚拟化,以及客户机的IO拦截,拦截Guest的IO交给Qemu处理。同时给用户空间的QEMU提供/dev/kvm字符设备
  • QEMU:修改过的为KVM虚机使用的QEMU 代码(所以也叫QEMU-KVM),运行在用户空间,提供硬件IO虚拟化,通过IOCTL /dev/kvm设备和KVM交互执行创建VM、vCPU等对Guest的控制操作

对比VM workstation,KVM内核模块功能实现了VM driver和VMM,QEMU实现了VMApp

流程

KVM被加载时:

  • 初始化内部的数据结构
  • KVM模块检测当前的CPU,然后打开 CPU 控制及存取 CR4 的虚拟化模式开关,并通过执行 VMXON 指令将宿主操作系统置于虚拟化模式的根模式
  • KVM 模块创建特殊设备文件 /dev/kvm 并等待来自用户空间的指令

IO虚拟化

支持虚拟化的CPU,带有特别优化过的指令集来控制虚拟化过程。当Guest尝试访问物理资源,就会将控制权交给VMM

VMM也可以利用硬件的虚拟化增强机制,将客户机在受限模式下对特定资源的访问完全由硬件重定向到VMM指定的虚拟资源

QEMU-KVM:

QEMU是纯软件实现的虚拟化系统,其中包含整套的虚拟机实现,包括处理器虚拟化、内存虚拟化、以及虚拟设备模拟

KVM对其进行了修改,VM运行时,QEMU会通过KVM提供的系统调用进入内核,由KVM负责将虚拟机置于处理的特殊模式运行

VM进行IO操作时,KVM会从上次系统调用出口处返回QEMU,由QEMU负责解析模拟设备。

QEMU使用了KVM模块的虚拟化功能,为自己的VM提供了硬件虚拟化加速。VM的配置创建、VM运行所依赖的虚拟设备、VM运行时的用户环境和交互、以及一些VM的特定技术:动态迁移,都是QEMU自己实现的

CPU虚拟化

虚拟机创建和运行时QEMU和KVM相互配合的过程,两者通信时通过/dev/kvm的IOCTL调用。创建VM可以理解为KVM为了某个特定的虚拟机创建对应的内核数据接口,KVM返回一个文件句柄来代表所创建的VM,伪代码:

open(“/dev/kvm”) 
ioctl(KVM_CREATE_VM) 
ioctl(KVM_CREATE_VCPU) 
… 
for (;;) { 
exit _reason = ioctl(KVM_RUN) 	//返回意味着VMExit
switch (exit_reason) { 
case KVM_EXIT_IO: /* … */ 
case KVM_EXIT_HLT: /* … */ 
} 
}

内存虚拟化

在虚拟机模式下,MMU 的页表则必须在一次查询的时候完成两次地址转换。因为除了将客户机程序的虚拟地址转换了客户机的物理地址外,还要将客户机物理地址转化成真实物理地址。

实践

//Ubuntu18.04下搭建kvm    
    1  apt-get install qemu-kvm qemu-system libvirt-bin bridge-utils virt-manager
	//直接克隆的ubuntu虚拟机,所以存在lock问题
    2  rm /var/cache/apt/archives/lock 
    3  rm /var/lib/dpkg/lock

	4  apt-get install qemu-kvm qemu-system libvirt-bin bridge-utils virt-manager
    5  wget http://tinycorelinux.net/7.x/x86/release/TinyCore-current.iso
    6  ls
    7  qemu-system-x86_64 -smp 2 -enable-kvm -cdrom ./TinyCore-current.iso 
    8  virsh list --all
   10  virsh destroy test
    4  virt-manager	//打开kvm软件

qemu窗口下,按下ctrl+alt+2,运行info kvm

KVM入门

KVM入门

KVM入门

KVM功能列表&工具

功能:

  • 支持 CPU 和 memory 超分(Overcommit)
  • 支持半虚拟化 I/O (virtio)
  • 支持热插拔 (cpu,块设备、网络设备等)
  • 支持对称多处理(Symmetric Multi-Processing,缩写为 SMP )
  • 支持实时迁移(Live Migration)
  • 支持 PCI 设备直接分配和 单根 I/O 虚拟化 (SR-IOV)
  • 支持 内核同页合并 (KSM )
  • 支持 NUMA (Non-Uniform Memory Access,非一致存储访问结构 )

工具集合:

  • libvirt:操作和管理KVM虚机的虚拟化 API,使用 C 语言编写,可以由 Python,Ruby, Perl, PHP, Java 等语言调用。可以操作包括 KVM,vmware,XEN,Hyper-v, LXC 等在内的多种 Hypervisor。可以认为是管理工具和具体虚拟机之间的一个纽带

    • libvirtd是一个daemon进程,virsh、virt-manager等工具呼叫libvirtd,而libvirtd调用qemu-kvm操作虚拟机

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jaElWZBC-1637383530114)(docker_go.assets/image-20211120103850265.png)]

  • Virsh:基于 libvirt 的 命令行工具 (CLI)

  • Virt-Manager:基于 libvirt 的 GUI 工具

  • virt-v2v:虚机格式迁移工具

  • virt-* 工具:包括 Virt-install (创建KVM虚机的命令行工具), Virt-viewer (连接到虚机屏幕的工具),Virt-clone(虚机克隆工具),virt-top 等

  • sVirt:安全工具

上一篇:qemu对ARM程序gdb调试


下一篇:6.QEMU的安装