KVM 和 QEMU 的区别

Abh*_*pta 173 virtualization qemu kvm-virtualization

我一直在阅读关于KVMQemu一段时间。到目前为止,我已经清楚地了解他们的工作。

KVM 支持硬件虚拟化,为客户操作系统提供接近本机的性能。另一方面,QEmu 模拟目标操作系统。

我感到困惑的是这两个协调到什么水平。喜欢

  1. 谁来管理 RAM 和/或内存的共享?
  2. 谁来调度 I/O 操作?

Jav*_*ier 235

奇木

QEmu 是一个完整的独立软件。你用它来模拟机器,它非常灵活和便携。它主要由一个特殊的“重新编译器”工作,它将为给定处理器编写的二进制代码转换为另一个代码(例如,在 PPC mac 上运行 MIPS 代码,或在 x86 PC 中运行 ARM)。

为了模拟的不仅仅是处理器,Qemu 包括一长串外围模拟器:磁盘、网络、VGA、PCI、USB、串行/并行端口等。

KQem :

在源和目标都是相同架构的特定情况下(例如 x86 上 x86 的常见情况),它仍然需要解析代码以删除任何“特权指令”并用上下文切换替换它们。为了使其在 x86 Linux 上尽可能高效,有一个名为 KQemu 的内核模块可以处理此问题。

作为内核模块,KQemu 能够执行大部分代码不变,只替换最低级别的 ring0-only 指令。在这种情况下,用户空间 Qemu 仍然为模拟机分配所有 RAM,并加载代码。不同之处在于它不是重新编译代码,而是调用 KQemu 来扫描/修补/执行它。所有的外围硬件仿真都是在 Qemu 中完成的。

这比普通的 Qemu 快很多,因为大多数代码没有改变,但仍然需要转换 ring0 代码(VM 内核中的大部分代码),因此性能仍然受到影响。

KVM :

KVM 有两个作用:首先它是一个 Linux 内核模块——现在包含在主线中——它将处理器切换到一个新的“访客”状态。来宾状态有自己的一组环状态,但特权 ring0 指令回退到管理程序代码。由于它是一种新的处理器执行模式,因此无需以任何方式修改代码。

除了处理器状态切换,内核模块还处理模拟的一些低级部分,如 MMU 寄存器(用于处理 VM)和 PCI 模拟硬件的某些部分。

其次,KVM 是 Qemu 可执行文件的一个分支。两个团队都积极努力将差异保持在最低限度,并且在减少差异方面取得了进展。最终,目标是 Qemu 应该可以在任何地方工作,并且如果 KVM 内核模块可用,它可以被自动使用。但在可预见的未来,Qemu 团队专注于硬件仿真和可移植性,而 KVM 人员则专注于内核模块(有时会将仿真的一小部分移到那里,如果能提高性能),以及与其余用户空间代码的接口。

kvm-qemu 可执行文件像普通 Qemu 一样工作:分配 RAM,加载代码,而不是重新编译它或调用 KQemu,它会产生一个线程(这很重要)。线程调用 KVM 内核模块切换到访客模式并继续执行 VM 代码。在特权指令上,它切换回 KVM 内核模块,如有必要,它会向 Qemu 线程发出信号以处理大部分硬件仿真。

这种架构的优点之一是来宾代码是在 posix 线程中模拟的,您可以使用普通的 Linux 工具进行管理。如果你想要一个 2 核或 4 核的 VM,kvm-qemu 会创建 2 或 4 个线程,每个线程调用 KVM 内核模块开始执行。并发性——如果你有足够的真实内核——或者调度——如果没有——由普通的 Linux 调度程序管理,保持代码小,惊喜有限。

  • 对于像我这样没有支持 VT 的 CPU 的人来说,坏消息 *(好吧,如果这可以称为“新闻”)* — [Ubuntu 不再支持 KQEMU](https://help.ubuntu。 com/社区/Kqemu)。如果没有这种支持,KVM 就不能与 CPU 一起工作。 (5认同)

Ign*_*ams 141

协同工作时,KVM 仲裁对 CPU 和内存的访问,QEMU 模拟硬件资源(硬盘、视频、USB 等)。单独工作时,QEMU 模拟 CPU 和硬件。

  • @Javier 的回答很详细,当然应该是公认的回答,但是您的回答设法用几句话给了我我需要知道的内容,所以 +1 和谢谢。 (19认同)

Ged*_*RSU 11

Qemu是一个处理器模拟虚拟化软件,支持多种虚拟设备(如 HDD、RAM、声音、以太网、USB、VGA 等)

KVM是一个内核模块,它允许通过主机直通通过 CPU 内核,而无需对其进行虚拟化。它还允许通过vfio-pci内核模块通过 PCI 设备。

所有这些直通功能都可以通过IOMMU(输入输出内存映射单元)实现,它将真实 DMA 地址映射到虚拟化地址,因此直接访问成为可能,并带来裸机(本机)性能。IOMMU 是一种在内核中部分软件和芯片组中部分硬件的机制,其特点是VT-D (vmx) AMD-VI (svm)。SR-IOV是一种芯片组功能,它允许通过并行直接 IO 访问将一个 PCI 设备拆分为多个虚拟设备而不会降低性能。

Libvirt是一个库,允许您使用 python 和其他编程语言来配置虚拟机。Virsh是一个在终端中运行的工具包,用于监控和配置虚拟机设置。Virt-manager是一种类似于 GUI 的 VMware 播放器,可替代 virsh,它使用 libvirt。

Qemu-img是一个 cli 工具,用于创建、转换、快照磁盘映像。Qemu-nbd也是一个 CLI 工具,它允许通过 nbd 通过网络对虚拟磁盘进行原始 I/O 访问。 Virtio是磁盘、网卡(以太网)和视频的 iommu 访问驱动程序和方法名称。Virgil是支持 virtio VGA 的 OpenGL。Redhat 和 Fedora 的网站上有适用于 Windows 和 Linux 的 virtio 驱动程序 ISO CD ROM 映像。

OVMF是开放的虚拟机固件,它为 qemu 虚拟机提供 UEFI 引导映像。Spice是用于 qemu 虚拟机的非常快速的 VNC 客户端。

您可以通过在 Ubuntu 或任何 Debian 的终端中输入这些来开始摆弄:

sudo apt-get update
sudo apt-get install qemu-kvm libvirt-bin virt-manager ovmf
virt-manager 
Run Code Online (Sandbox Code Playgroud)

经验通过引入对“没有X什么不可能?”这个问题的答案的实现,使这些半概念术语的功能变得清晰起来。