欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

KVM 虚拟化学习笔记-1

程序员文章站 2022-05-10 16:20:36
...

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

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

KVM 虚拟化架构

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

KVM 虚拟化学习笔记-1

其基本的原理是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。

KVM 虚拟化学习笔记-1
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 继续运行。

相关标签: kvm

上一篇: KVM

下一篇: linux系统虚拟机克隆