基于内核的虚拟机,Kernel-Based Virtual Machine。以色列公司 Qumranet 开发,于 2007 年 2 月被正式合并到 Linux2.6.20 核心中。
KVM 基于虚拟化扩展(Intel VT-x 或 Amd-V)的 x86 硬件,是 Linux 完全原生的全虚拟化解决方案。
在 KVM 架构中,虚拟机实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度。实际上,每个虚拟 CPU 显示为一个常规的 Linux 进程。这使得 KVM 能够享受 Linux 内核的所有功能。
KVM 本身不执行任何模拟,需要用户空间成程序通过 dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟 IO,并将它的视频显示映射回宿主的显示屏。目前,这个程序就是 Qemu 。
KVM 模块是 “KVM 虚拟机” 的核心部分。其主要功能是初始化 CPU 硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。
为了软件的简洁性并保证其性能,KVM 仅支持硬件虚拟化。“CPU 虚拟化” 和 “Memory 虚拟化” 都是由 KVM 模块完成。
QEMU 全称是 "Quick Emulator"。它是一个开源的机器模拟器和虚拟化环境,能够模拟多种处理器架构,广泛用于开发、测试、虚拟化和其他应用场景。
它是一个完整的可以运行的软件,非常灵活且可移植,能够模拟一台能够独立运行操作系统的虚拟机。
虚拟机认为自己在和硬件打交道,但其实是和 Qemu 模拟出来的硬件打交道,Qemu 再将这些指令转译给真正的硬件。
QEMU 对虚拟机的模拟是通过纯软实现的,所有指令都要经过 Qemu 处理,导致性能很低。
实际上,大多数的做法都是配合 KVM 来完成虚拟化工作,KVM 是硬件辅助的虚拟化技术,主要负责比较繁琐的 CPU 和 Memory 虚拟化,而 Qemu 负责 IO 虚拟化,两者合作各自发挥自身的优势,相得益彰。
在支持 Qemu 本身编译运行的平台上就可以实现虚拟机的功能,虚拟机甚至可以和宿主机并不是同一个架构。
作为一个存在已久的虚拟机,Qemu 代码中有整套的虚拟机实现,包括 CPU 虚拟化、Memory 虚拟化以及 KVM 使用到的虚拟设备模拟(如网卡、显卡、存储控制器和硬盘等)。
左侧部分是一个标准的 Linux 操作系统,KVM 内核模块在运行时按需加载进入内核空间运行。
KVM 本身不执行任何设备模拟,需要用户空间程序 Qemu 通过 /dev/kvm 接口设置一个虚拟客户机地址空间,向它提供模拟的 IO 设备,并将它的视频显示映射回宿主机的显示屏。
为了简化开发和进行代码重用,KVM 在 Qemu 基础上进行了修改。虚拟机运行期间,Qemu 会通过 KVM 模块提供的系统调用进入内核,由 KVM 模块负责将虚拟机置于处理器的特殊模式运行。遇到虚拟机进行输入输出操作,KVM 模块会从上次的系统调用出口处返回 Qemu,由 Qemu 负责解析和模拟这些设备。
从 Qemu 角度来看,Qemu 使用了 KVM 模块的虚拟化功能,为自己的虚拟机提供硬件虚拟化的加速,从而极大提高了虚拟机的性能。除此之外,虚拟机的配置和创建、虚拟机运行依赖的虚拟设备、虚拟机运行时的用户操作环境和交互,以及一些针对虚拟机的特殊技术(诸如动态迁移),都是由 Qemu 自己实现的。
Qemu 是一个独立的虚拟化解决方案,通过 Intel-VT 或 AMD SVM 实现全虚拟化,安装 Qemu 的系统,可以直接模拟出另一个完全不同的系统环境,虚拟化的创建通过 Qemu-image 即可完成。
Qemu 本身可以不依赖于 KVM,但是如果有 KVM 的存在并且硬件(处理器)支持如 Intel VT 的功能,那么 Qemu 在对处理器虚拟化这一块可以利用 KVM 提供的功能来提升性能。
简单来说:
CPU 和 Memory 的虚拟化是由 HostOS Linux 内核中的 KVM 模块完成。
虚拟机的 IO 和视频映射由用户空间中的 Qemu 模拟器完成。
Qemu 可以通纯软的方式来模拟虚拟机,但是这样性能太低了。为了提高性能,Qemu 将对 CPU 和 Memory 的虚拟化借助 KVM 实现,因此 KVM 位于 Linux 内核中,可以直接对 CPU 和 Memory 实现虚拟化功能。这样,虚拟化的性能就大大提升了。
虚拟机以及镜像文件的操作管理主要还是 Qemu 负责,所以平时在 console 使用的还是 qemu 命令。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。