共计 1557 个字符,预计需要花费 4 分钟才能阅读完成。
1. KVM 架构
kvm 基本结构有 2 个部分构成:
kvm 驱动,现在已经是 linux kernel 的一个模块了。其主要负责虚拟机的创建,虚拟内存的分配,VCPU 寄存器的读写以及 VCPU 的运行。
另个组成是 Qemu,用于模拟虚拟机的用户空间组件,提供 I / O 设备模型,访问外设的途径。
图 1 kvm 基本结构
kvm 基本结构如上图。kvm 已经是内核模块,被看作是一个标准的 linux 字符集设备(/dev/kvm)。Qemu 通过 libkvm 应用程序接口,用 fd 通过 ioctl 向设备驱动来发送创建,运行虚拟机命令。设备驱动 kvm 就会来解析命令(kvm_dev_ioctl 函数在 kvm_main.c 文件中), 如下图:
图 2 kvm_dev_ioctl 函数
kvm 模块让 Linux 主机成为一个虚拟机监视器(VMM),并且在原有的 Linux 两种执行模式基础上,新增加了客户模式,客户模式拥有自己的内核模式和用户模式。在虚拟机运行时,三种模式的工作各为:
客户模式:执行非 I / O 的客户代码,虚拟机运行在这个模式下。
用户模式:代表用户执行 I / O 指令,qemu 运行在这个模式下。
内核模式:实现客户模式的切换,处理因为 I / O 或者其他指令引起的从客户模式退出(VM_EXIT)。kvm 模块工作在这个模式下。
在 kvm 的模型中,每一个 Gust OS 都是作为一个标准的 linux 进程,都可以使用 linux 进程管理命令管理。
这里假如 qemu 通过 ioctl 发出 KVM_CREATE_VM 指令,创建了一个 VM 后,qemu 需要需要发送一些命令给 VM,如 KVM_CREATE_VCPU。这些命令当然也是通过 ioctl 发送的,用户程序中用 ioctl 发送 KVM_CREATE_VM 得到的返回值就是新创建的 VM 对应的 fd(kvm_vm),fd 是创建的指向特定虚拟机实例的文件描述符,之后利用这个 fd 发送命令给 VM 进行访问控制。kvm 解析这些命令的函数是 kvm_vm_ioctl。
2. KVM 工作原理
kvm 基本工作原理概述:
用户模式的 qemu 利用 libkvm 通过 ioctl 进入内核模式,kvm 模块未虚拟机创建虚拟内存,虚拟 CPU 后执行 VMLAUCH 指令进入客户模式。加载 Guest OS 并执行。如果 Guest OS 发生外部中断或者影子页表缺页之类的情况,会暂停 Guest OS 的执行,退出客户模式出行异常处理,之后重新进入客户模式,执行客户代码。如果发生 I / O 事件或者信号队列中有信号到达,就会进入用户模式处理。(如下图)
图 3 KVM 工作原理流程图
————————————– 分割线 ————————————–
RHEL6 KVM 虚拟化创建桥接网卡 - 网桥 http://www.linuxidc.com/Linux/2013-08/88517.htm
RedHat Linux KVM 虚拟机桥接 http://www.linuxidc.com/Linux/2013-02/79934.htm
CentOS 5.6 下 KVM 的安装 / 桥接设置 / 虚拟机创建及运行 http://www.linuxidc.com/Linux/2012-12/76883.htm
Ubuntu 下用 libvirt 安装 KVM 虚拟机时找不到 /bin/qemu-kvm 问题解决 http://www.linuxidc.com/Linux/2013-08/88985.htm
RedHat6.5 下安装配置 KVM 虚拟机 http://www.linuxidc.com/Linux/2014-10/107972.htm
————————————– 分割线 ————————————–