<p style="text-align:left;">KVM(Kernel-based Virtual Machine)最初是由以色列的公司Qumranet开发的。KVM在2007年2月被正式合并到Linux 2.6.20核心中,成为内核源代码的一部分。2008年9月4日,RedHat公司收购了Qumranet,开始在RHEL中用KVM替换Xen,第一个包含KVM的版本是RHEL 5.4。从RHEL 6开始,KVM成为默认的虚拟化引擎。KVM必须在具备Intel VT或AMD-V功能的X86平台上运行。在Linux内核3.9版中,加入了对ARM架构的支持。具体kvm虚拟化支持的处理器可以通过官网进行查询。</p>
讯享网
KVM包含一个为处理器提供底层虚拟化、可加载的核心模块kvm.ko(kvm-intel.ko或kvm-amd.ko),使用QEMU(QEMU-KVM)作为虚拟机上层控制工具。KVM不需要改变Linux或Windows系统就能运行。
实际上,在Linux中,kvm就是内核中的一个模块,用户空间通过QEMU模拟硬件提供给虚拟机使用,而一台使用kvm创建的虚拟机就是一个Linux中的进程,管理这个对应的进程就是相当于管理整个对应的虚拟机。
根据 文档的描述,类似于qemu的作用,kvmtool是一个支持运行KVM Guest OS的 host os端用户态虚拟机工具,它是一个纯虚拟化工具,guest os不需要修改即可运行其上, 不过,由于KVM是基于CPU的硬件虚拟化支持的,所以类似于qemu-kvm,它只支持基于相同架构的Guest OS.
kvmtool代码量只有5KLOC,是一个干净的、从头开始写的、轻量级虚拟化工具, 由于轻量,对于想要学习虚拟化的人来说非常友好。kvmtool 作为KVM主机工具实现,可以引导Linux映像,无需BIOS和其他相关依赖. 下面我们尝试基于ubuntu22环境下搭建一个kvmtool运行环境,在虚拟机上运行另一个linux guest os。
主机环境
本实验使用的主机系统是ubuntu22.04,具体信息参考下图:
下载代码
下载kvmtool:
讯享网
下载busybox:
下载Linux内核:

讯享网
选择版本的时候,刻意选择工具和源码版本大体同一段时间的即可,无需太多关注。
编译kvmtool
本次实验使用的kvmtool版本为:e17d182ad3f797f01947fc234d95c96c050c534b,编译方式简单直接,进入 kvmtool目录下直接make 即可:
编译后的可执行程序为lkvm,同时建立了一个lkvm的硬连接vm.两者完全一致,如果需要调试kvmtool,可以手动修改Makefile中的CFLAGS:
编译Linux内核
内核的编译方法很简单,参考博客
这里需要注意三点:
- 修掉.pem文件缺失相关的编译错误,有两个
- 只需要编译bzImage目标,不需要编译模块
- 默认menuconfig可能配置为CONFIG_VIRTIO_NET=m,需要设置为CONFIG_VIRTIO_NET=y,已经打开了KVM,VIRTIO(CONFIG_VIRTIO_NET=y)相关选项
最后生成bzImage文件:
编译busybox
基于busybox制作根文件系统,构建目录结构,参考博客:

需要注意的是,执行完博客中的操作后,需要将顶层目录的linuxrc文件重命名为init(这步必须做,否则无法进入控制台)。原因很简单,1号进程的启动优先级如下图所示:

所以,linuxrc无法启动的原因很简单,就是默认的ramdisk_execute_command为init, 如果将ramdisk_execute_command修改为linuxrc,则不修改文件名也可以正常启动。
之后将rootfs目录压缩为cpio文件。
完成后目录结构如下:
以上三步操作完成后,就可以开始运行了。
运行虚拟机
执行前,确认主机存在/dev/kvm设备节点
运行虚拟机执行如下命令
讯享网
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/179363.html