目录
QKO-2MB 项目介绍
QKO-2MB 项目全称 “QEMU-KVM on BiscuitOS”, 该项目用于在 BiscuitOS 快速为开发者直接创建一套 QEMU-KVM 2M HugePage 开发调试环境。开发者只需专注与 QEMU-KVM 和 KVM 代码的开发与调试,其余部署相关的任务 BiscuitOS 会一站式解决。
KVM 全称 “Kernel-Based Virtual Machine”, 是基于内核的虚拟机,它由一个 Linux 内核模块组成,该模块可以将 Linux 变成一个 Hypervisor。KVM 由 Quramnet 公司开发,于 2008 年被 Read Hat 收购。KVM 支持 x86 (32bit and 64bit), s390, PowerPC 等 CPU。KVM 从 Linux 2.6.20 起作为一个模块包含到 Linux 内核中。KVM 支持 CPU 和 内存的虚拟化。
QEMU 是一个主机上的 VMM (Virtual machine monitor), 通过动态二进制模拟 CPU,并提供一系列的硬件模型,使 Guest OS 能够与 Host 硬件交互。在 QEMU-KVM 中,QEMU 负责模拟 IO 设备 (网卡,磁盘等)。KVM 运行在内核空间,QEMU-KVM 则运行在用户空间,并创建、管理各种虚拟硬件。QEMU-KVM 通过 ioctl 调用 /dev/kvm 与 KVM 进行交互,从而将 CPU 指令的部分交给内核模块来做,KVM 则实现了 CPU 和内存虚拟化,但 KVM 不能虚拟其他硬件设备。
本文重点介绍如何在 BiscuitOS 快速部署 QEM-KVM 开发环境。BiscuitOS 提供的开发环境包括了一个静态的 qemu-kvm 可执行文件,并通过 qemu-kvm 工具在 BiscuitOS 上启动一个新的 BiscuitOS, 并且新的 BiscuitOS 的内存采用 2M 的 HugePage。具体请参见:
QKO-2MB 项目实践
实践准备
QKO-2MB 项目目前只支持 x86_64,本文以 x86_64 架构进行讲解,并推荐使用该架构来构建 QKO-2MB 项目。首先开发者基于 BiscuitOS 搭建一个 x86_64 架构的开发环境,请开发者参考如下文档:
实践部署
首先确认 Ubuntu 已经安装 KVM 模块,如果没有安装请在 Ubuntu 上安装相应的模块,使用如下命令:
在部署完毕开发环境之后, 由于需要在内核中支持 KVM 模块,因此开发者需要在内核配置中打开以下宏:
重新编译内核,内核编译完毕并重新运行 BiscuitOS,可以在 “/dev/” 目录下看到 kvm 节点:
接下来是安装 QEMU-KVM 源码,开发者可以参考如下命令进行部署:
配置保存并执行 make,执行完毕之后会在指定目录下部署开发所需的文件,并在该目录下执行如下命令进行源码的部署,请参考如下命令:
执行完上面的命令之后,BiscuitOS 会自动部署所需的源码文件,如下图:
“BiscuitOS-qemu-kvm-2M-4.0.0” 目录为 qemu-kvm 的源代码,目前采用 4.0.0 版本; Makefile 为编译源码相关的脚本; RunBiscuitOS.sh 是在 BiscuitOS.sh 上运行 qemu-kvm 相关配置.
如果是刚解压的源码,需要对 qemu-kvm 项目进行配置,使用如下命令:
BiscuitOS 在配置 qemu-kvm 时默认使用的配置如下:
实践执行
部署完毕之后,接下来进行源码的编译和安装,并在 BiscuitOS 中运行. 参考如下代码:
如上图在 BiscuitOS 运行之后,可以查看 qemu-kvm 的版本,以此确认软件已经可以使用.确认完毕之后,开发者可以使用两种办法启动一台虚拟机,默认使用 BiscuitOS 提供的脚本,也就是源码目录下的 RunBiscuitOS.sh, 其在 BiscuitOS 中使用如下:
脚本运行完毕之后,BiscuitOS 根据 RunBiscuitOS.sh 的工作流启动一个虚拟机,虚拟机运行如上。当想退出虚拟机的话,使用 Ctrl-C 即可. 开发者也可以采用第二种方式启动虚拟机,第二种方式也就是命令行方式,但有一个需要开发者注意的是,命令行必须在 BiscuitOS 的 “/mnt/Freeze/BiscuitOS” 目录下执行,具体命令参考如下:
当想退出虚拟机的话,使用 Ctrl-C 即可.
QKO-2MB 项目调试
QEMU-KVM 的调试有很多种方法,这里主要介绍通过 LOG 日志的办法。QEMU-KVM 的源码位于:
开发者可以在源码中使用 “qemu_log()” 函数将 log 信息输出到 BiscuitOS 的 “/var/log/BiscuitOS_qemu.log” 里,或者可以直接在 QEMU-KVM 源码中直接使用 “printf()” 函数将 log 信息输出到控制台.