题 KVM和QEMU之间的区别


我一直在读书 KVM 和 Qemu 有一段时间截至目前,我已清楚地了解他们的所作所为。

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

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

  1. 谁管理RAM和/或内存的共享?
  2. 谁安排了I / O操作?

111
2017-12-03 08:42






答案:


QEMU

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

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

KQEMU

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

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

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

KVM

KVM有两个方面:首先它是一个Linux内核模块 - 现在包含在主线中 - 将处理器切换到新的“访客”状态。 guest状态有自己的一组响铃状态,但特权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调度程序管理,保持代码小和惊喜有限。


153
2017-12-03 14:40



对于那些像我一样没有CPU支持VT的人,坏消息 (好吧,如果可以称之为“新闻”)  - Ubuntu不再支持KQEMU。没有该支持,KVM不能与CPU一起使用。 - Hi-Angel


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


76
2017-12-03 08:46



@Javier的答案很详细,当然应该是公认的答案,但你的答案设法用几句话给我一些我需要知道的内容,所以+1和谢谢。 - Bill The Ape


QEMU速度较慢,KVM可以帮助QEMU实现非常快的硬件速度,从而为系统提供最佳性能。 QEMU是虚拟机管理程序/模拟器。


-1
2017-11-14 10:58