KVM 虚拟化学习笔记-1

KVM 虚拟化学习笔记


什么是KVM?

Kernel-based Virtual Machine的简称,是一个 Linux Kernel 的模块。它是一种全虚拟化的解决方案,目前在x86,AMD和ARM都已经支持。使用KVM虚拟机,你可以在其上运行没有修改过代码的Linux 和 Windows 操作系统。

KVM 开发环境

本学习笔记主要是针对 kernel + kvmtool 的环境来学习KVM虚拟化。

kernel 下载地址

git://git.kernel.org/pub/scm/linux/kernel/git/bonzini/linux.git
https://git.kernel.org/pub/scm/linux/kernel/git/bonzini/linux.git
https://kernel.googlesource.com/pub/scm/linux/kernel/git/bonzini/linux.git

kvmtool 的下载地址

git://git.kernel.org/pub/scm/linux/kernel/git/will/kvmtool.git
https://git.kernel.org/pub/scm/linux/kernel/git/will/kvmtool.git
https://kernel.googlesource.com/pub/scm/linux/kernel/git/will/kvmtool.git

开发环境:ubuntu (linux-like system)+ kvmtool + guest kernel,共享本地的rootfs

kvmtool

可能有的小伙伴要问了,什么是kvmtool,不是都用qemu吗?

kvmtool 是一个轻量级的虚拟化工具,用来虚拟化与本地相同架构的虚拟机。

同时因为qemu太过于庞大,其中包含很多kvm不需要的内容,针对我们这种虚拟化的新人,还是越简单越好。

当然如果你有足够的信心,你也可以直接去看qemu的代码。

好了,进入正题让我们先用kvmtool 来运行一个 Linux 的虚拟机。

  • 编译 kvmtool - 直接make就能搞定,会生成一个binary,lkvm
  • 编译 kernel - make x86_64_defconfig, make kvmconfig,make -j4。会生成 bzImage
  • 运行虚拟机,./lkvm run --kernel your kernel img path bzImage

运行结果
KVM 虚拟化学习笔记-1_第1张图片

是不是很简单,我们的虚拟机已经跑起来了。Ctrl+D 就可以退出。

KVM 虚拟化架构

虚拟机我们已经run起来了,再进行下一步的分析之前,我们来先了解一下KVM的基本架构,这样可以帮助我们理解。

KVM 虚拟化学习笔记-1_第2张图片

其基本的原理是KVM Module 提供 KVM的interface 给 kvmtool, kvmtool 通过ioctl去调用这些API来进行创建,设置,监控虚拟机的操作。当设置好了以后通知KVM Module,通过VM Entries 事件来运行虚拟机,或者resume 虚拟机。 当虚拟遇到一些它无法独立完成的事件,比如IO 操作 / memory的操作 会触发VM exits 事件,返回到vmx root 模式进行处理,如果在kvm module 就可以完成,就直接返回,这也被成为 lightweight exit。如果还需要kvmtool 来进行处理,则再返回到kvmtool中执行完毕以后,再返回kernel 去resume vm。这个也被称为heavy exit。

通过上图你一点有个疑问,什么是VM Entries 和 VM Exits ?

Intel 虚拟化的扩展提供了2个额外的模式,一个是VMX root,另外一个是VMX non-root。其分别对应于 host端 和 guest 端。 当我们从VMX root 切换到 non-root的行为称为 VM Entries,当从non-root 返回 root,则称为VM exits。

vmx operation
okay,你说通过VM Entries 和 VM Exits 能进行 non-root 和 root 的切换,那他们切换之前的环境保存在哪呢?

Intel 也考虑到这个问题,所以提供了一个叫VMCS的结构用来保存之前的环境。

当Guest os 执行一些敏感操作且自己无法处理的时候,就会导致VM exits,那么就会把当前的环境到VMCS中。同理当 kvmtool 或者 kernel kvm module 处理完这些Guest os的这些敏感操作以后就会从VMCS中读取之前的保存状态,再调用VM Entries 返回到Guest OS 继续运行。

你可能感兴趣的:(virtualization)