背景
虚拟化主要是分为半虚拟化、全虚拟化、硬件辅助虚拟化等等,目前用得比较多的是硬件辅助虚拟化。
关于硬件辅助全虚拟化的硬件技术,Intel 推出了基于 x86 架构的硬件辅助虚拟化技术 Intel VT-x(Intel Virtualization Technology),同年 AMD 也推出了自己的 AMD-V 硬件辅助虚拟化技术。
硬件辅助全虚拟化比较常见的内核技术有 Linux 的 KVM、Windows 的 Hyper-V 等。
本文主要介绍虚拟化应用如何实现虚拟化的过程。
架构
如上图所示,这个就是常见的虚拟化流程架构,一共有五个层级。
HardWare
硬件层,就是上面所说的 Intel VT-x (Virtualization Technology) 和 AMD-V (AMD Virtualization),这是由 Intel 和 AMD 提供的硬件辅助虚拟化功能。
它们提供了一些虚拟化特定的指令集扩展,以提高虚拟化性能和安全性。
KVM
KVM(Kernel-based Virtual Machine)是一个 Linux 内核模块,它将虚拟化的功能集成到 Linux 内核中。KVM 利用处理器的虚拟化扩展(如 Intel 的 VT-x)来提供硬件级别的虚拟化支持。
KVM 位于虚拟化软件栈的内核层。
KVM 并不是一个完整的模拟器,而只是一个提供了虚拟化功能的内核插件,具体的模拟器工作需要借助 Qemu-KVM 来完成。
Qemu-KVM
Qemu(Quick Emulator)是一个硬件虚拟化和仿真工具,它底层实现了模拟不同硬件平台和设备的功能,可以在其上运行虚拟机。Qemu-KVM 可以理解是一个专门对接 KVM 的 Qemu 版本。
Qemu-KVM 属于虚拟化软件栈的最底层,负责提供虚拟化层的硬件模拟和仿真。
简单来说就是上层不能直接调用处于内核层的 KVM,需要一个中间层转换,如 Qemu-KVM。
Libvirt
Libvirt 是一个开源的虚拟化管理工具和 API,它提供了统一的接口和管理框架,用于管理和控制不同虚拟化技术的虚拟机。
Libvirt 位于虚拟化软件栈的更高层,提供了对底层虚拟化技术的抽象和管理功能。
问题来了,既然有了 Qemu 作为中间层,为什么还需要 Libvirt?
其实就是上面说的 “ 统一 ”。因为并不只有 Qemu 一个对接组件,还有其他的比如 Xen、VMware。
因为 Libvirt 需要提供了跨 VM 平台的功能,它可以控制除了 Qemu 之外的模拟器,还有其他组件包括 VMware、Virtual box、Xen 等等。
为了避免底层的修改对上层造成太大的影响,所以以后有类似 Qemu 的组件,只需要上层的 Libvirt 完成对接即可,在 Libvirt 之上的应用层则可无感。
例如 Openstack,为了实现跨 VM 性,Openstack 只会用 Libvirt 而不直接用 Qemu-KVM。
应用层 | 比如 virt-manager
virt-manager 是一个用于管理虚拟机的图形用户界面工具,可以理解为我们常用的虚拟化程序 Virtual Box 或 WMware。它建立在 Libvirt 之上,为用户提供了一个直观的界面,以创建、配置、启动、停止和监视虚拟机。
如 1 图所示,当用户在页面发起操作虚拟机请求,virt-manager 通过 Libvirt 来实现这些操作,而 Libvirt 则负责与底层虚拟化技术(如 QEMU 和 KVM)进行交互。
除了 virt-manager 以外,还有 virsh、virt-install、Openstack 等,它们都是经常和 Libvirt 配套使用的应用层组件。
总结
结合前面章节所讲,英特尔和 AMD 实现了硬件辅助虚拟化后,继而出现了 KVM 这种虚拟化扩展内核模块,并通过 Qemu 和 Libvirt 暴露出去从而
提供给上层使用,这个过程就是目前应用使用 KVM 虚拟化最常见的方案的过程。