ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

KVM入门

2021-11-20 13:02:14  阅读:231  来源: 互联网

标签:VMM 入门 虚拟化 KVM VM kvm QEMU


虚拟化简介

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介绍

基于内核的虚拟机

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

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

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

在这里插入图片描述

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功能列表&工具

功能:

  • 支持 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:安全工具

标签:VMM,入门,虚拟化,KVM,VM,kvm,QEMU
来源: https://blog.csdn.net/qq_41667409/article/details/121437748

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有