KVM 理解

KVM 虚拟机的管理工具

准确来说,KVM 仅仅是 Linux 内核的一个模块。管理和创建完整的 KVM 虚拟机,需要更多的辅助工具。
https://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm2/index.html
QEMU-KVM:

在 Linux 系统中,首先我们可以用 modprobe 系统工具去加载 KVM 模块,如果用 RPM 安装 KVM 软件包,系统会在启动时自动加载模块。加载了模块后,才能进一步通过其他工具创建虚拟机。但仅有 KVM 模块是远远不够的,因为用户无法直接控制内核模块去做事情,还必须有一个用户空间的工具。关于用户空间的工具,KVM 的开发者选择了已经成型的开源虚拟化软件 QEMU。QEMU 是一个强大的虚拟化软件,它可以虚拟不同的 CPU 构架。比如说在 x86 的 CPU 上虚拟一个 Power 的 CPU,并利用它编译出可运行在 Power 上的程序。KVM 使用了 QEMU 的基于 x86 的部分,并稍加改造,形成可控制 KVM 内核模块的用户空间工具 QEMU-KVM。所以 Linux 发行版中分为 kernel 部分的 KVM 内核模块和 QEMU-KVM 工具。这就是 KVM 和 QEMU 的关系。

kvm架构

  1. KVM架构
    https://www.linuxidc.com/Linux/2015-01/112328.htm
    KVM 理解_第1张图片

    图1 kvm基本结构
    kvm基本结构有2个部分构成:

1)kvm 驱动,现在已经是linux kernel的一个模块了。**其主要负责虚拟机的创建,虚拟内存的分配,**VCPU寄存器的读写以及VCPU的运行。kvm已经是内核模块,被看作是一个标准的linux 字符集设备(/dev/kvm)。

2)另个组成是Qemu,用于模拟虚拟机的用户空间组件,提供I/O设备模型,访问外设的途径。Qemu通过libkvm应用程序接口,用fd通过ioctl向设备驱动来发送创建,运行虚拟机命令。设备驱动kvm就会来解析命令(kvm_dev_ioctl函数在kvm_main.c文件中),如下图:

Libvirt、virsh、virt-manager:

尽管 QEMU-KVM 工具可以创建和管理 KVM 虚拟机,RedHat 为 KVM 开发了更多的辅助工具,比如 libvirt、libguestfs 等。原因是 QEMU 工具效率不高,不易于使用。Libvirt 是一套提供了多种语言接口的 API,为各种虚拟化工具提供一套方便、可靠的编程接口,不仅支持 KVM,而且支持 Xen 等其他虚拟机。使用 libvirt,你只需要通过 libvirt 提供的函数连接到 KVM 或 Xen 宿主机,便可以用同样的命令控制不同的虚拟机了。Libvirt 不仅提供了 API,还自带一套基于文本的管理虚拟机的命令—— virsh,你可以通过使用 virsh 命令来使用 libvirt 的全部功能。但最终用户更渴望的是图形用户界面,这就是 virt-manager。他是一套用 python 编写的虚拟机管理图形界面,用户可以通过它直观地操作不同的虚拟机。Virt-manager 就是利用 libvirt 的 API 实现的

KVM 理解_第2张图片

1) 标准的Linux内核中加入KVM的模块kvm.ko变身成为一个VMM(VMM Virtual MachineMonitor)
2) 在原有的用户模式(工作在ring3)和内核模式(工作在ring0)两种模式的基础上增加了新的客户模式。客户模式存在的特权级别与ring0-3正交。(也就是说客户模式也存在4个特权级别)客户模式拥有自己的内核模式和用户模式。在虚拟机运行时,三种模式的工作各为:

客户模式: 执行非I/O的客户代码,虚拟机运行在这个模式下。
用户模式:代表用户执行I/O指令,qemu运行在这个模式下。
内核模式:实现客户模式的切换,处理因为I/O或者其他指令引起的从客户模式退出(VM_EXIT)。kvm 模块工作在这个模式下。

在kvm的模型中,每一个Gust OS都是作为一个标准的linux进程,都可以使用linux进程管理命令管理。
3) 用户创建虚拟机,通过调用用户模式的qemu程序,qemu与kvm提供的libkvm库为接口,传递创建指令。
4) 打开/dev/kvm文件并获得文件描述符fd后,通过ioctl指令写入KVM_CREATE_VM,即可创建一个虚拟机,并返回此虚拟机文件描述符fd_vm(kvm_vm)。之后利用这个fd发送命令给VM进行访问控制。kvm解析这些命令的函数是kvm_vm_ioctl。
5) 获得fd_vm后,通过ioctl调用KVM_CREATE_VCPU指令,可以对fd_vm所对应的虚拟机创建vCPU,并对vCPU做初始化操作。
KVM 理解_第3张图片

图2 kvm_dev_ioctl函数

6) 然后通过KVM_RUN指令对fd_vcpus操作,启动运行虚拟机。

注: 其实在整个过程中所谓的初始化操作基本上就是一个工作——定义初始化结构体。整个虚拟机在Linux上只是User
Mode的一个qemu的进程,而内部则是一堆结构体。 下边是Copy的一段话,觉得挺靠谱的……

KVM 工作原理

kvm基本工作原理概述:

用户模式的qemu利用libkvm通过ioctl进入内核模式,kvm模块给虚拟机创建虚拟内存,虚拟CPU后执行VMLAUCH指令进入客户模式。加载Guest OS并执行。如果Guest OS 发生外部中断或者影子页表缺页之类的情况,会暂停Guest OS的执行,退出客户模式出行异常处理,之后重新进入客户模式,执行客户代码。如果发生I/O事件或者信号队列中有信号到达,就会进入用户模式处理。(如下图)

KVM 理解_第4张图片

图3 KVM工作原理流程图

3.模块间关系
https://blog.csdn.net/wanglei_storage/article/details/51100506https://blog.csdn.net/wanglei_storage/article/details/51100506
KVM 理解_第5张图片
kvm模块:该模块实现虚拟化核心基础架构,与硬件平台无关
kvm_intel:该模块主要涉及到硬件虚拟化

lsmod (list modules)
语  法:lsmod

功 能:
lsmod 命令:是一个小程序,用来显示文件、proc/modules的信息,也就是显示当前内核模块装载的模块。
KVM 理解_第6张图片
补充说明:

执行lsmod指令,会列出所有已载入系统的模块。Linux操作系统的核心具有模块化的特性,应此在编译核心时,务须把全部的功能都放入核心。您可以将这些功能编译成一个个单独的模块,待需要时再分别载入。
如下图所示 说明KVM_INTEL 依赖于KVM

这里写图片描述
如果执行指令后有类似返回,说明KVM模块加载正常/

影子页表

KVM 理解_第7张图片

攻击ASLR 可实现吗? 会影响BTB吗?

你可能感兴趣的:(虚拟化kvm)