我正在研究 QEMU/KVM 和 Firecracker/KVM。据我了解,Firecracker 和 QEMU 都与 KVM 通信,通过将 CPU 模式更改为来宾到主机(反之亦然),最终使硬件辅助虚拟化受益。
在CPU的guest模式下,guest甚至可以直接执行其特权指令,那么为什么我们还需要半虚拟化呢?
在 Firecracker 中,仅模拟了 5 个设备,例如
- virtio网,
- virtio 块,
- virtio-vsock 等。
即使在这种极简设计中,我们也必须放置半虚拟化驱动程序。难道我们不能仅仅依靠硬件辅助虚拟化吗?
仅考虑网络的情况。
为了在大多数情况下真正有用,虚拟机需要能够通过网络进行通信。为此,访客显然必须看到某种网络接口。但是 VT-x、AMD-V 和 ARM VHE 以及几乎所有其他硬件虚拟化实现都不提供 NIC,它们只是为您提供了一种安全隔离和分区 CPU 资源的方法。因此,硬件虚拟化不会为您提供网络接口。
现在,您可以从主机系统通过物理网络接口,但这存在许多问题:
因此,您显然需要以某种方式模拟网络接口。显而易见的选择是选择一个常用的物理网卡并对其进行模拟。但这有其自身的一系列问题:
virtio-net 解决了这些问题,它只涵盖了在来宾操作系统和主机网络层之间移动网络数据包实际需要的内容,仅此而已。解决这些问题可以带来巨大的性能提升。我最近没有测试过,但上次我使用 QEMU 进行比较时,virtio-net 提供了模拟 e1000 卡两倍以上的有效带宽,以及大约 1/10 的延迟,所有这些都在主机端具有较低的 CPU 使用率。
同样的逻辑适用于大多数其他设备。有些东西可以相对便宜地模拟,或者不是性能关键的,因此不需要高效(这就是为什么没有 VirtIO 看门狗定时器,例如,它不是性能关键的,并且在大多数情况下模拟很简单),但是对于大多数不符合这些标准的事情,有一个 paravirt 选项,因为性能差异巨大,并且复杂性的降低往往会使事情变得更加可靠。
有时,半虚拟化可以让您完成使用“常规”硬件无法真正完成的事情。VirtIOFS 和 9P2000 的 VirtIO 传输就是最好的例子,它们没有类似的硬件,但提供了一种相当有效的方式来在主机和来宾之间共享文件,而无需模拟网络或块设备。
简短的回答:当使用来宾端驱动程序进行增强时,现代硬件虚拟化使用某种形式的半虚拟化来执行性能最密集的操作。因此,现代虚拟机管理程序汇集了专用硬件支持和半虚拟化。
长版本:原始的 X86 架构很难正确虚拟化并与未经修改的操作系统一起使用。一种解决方案是动态翻译有问题的代码片段,即时重新编译它们。这使得未经修改的来宾能够运行,但缺点是转换器本身的开销高且复杂。此外,每种客户内核类型都需要特殊处理。
因此,项目开始修改 Linux 内核以避免困难的情况 - 即:当指令/调用不容易虚拟化时,让我们从底层虚拟机管理程序调用超级调用。超级调用是半虚拟化的基础,您可以将其视为用户空间系统调用的等价物。换句话说,底层 Linux 内核是主机操作系统,另一个 Linux 内核将作为来宾“用户空间”应用程序运行。
这种方法最大限度地减少了虚拟化开销,但它需要修改后的来宾内核才能工作。您的标准 Windows 安装将无法运行。因此引入了完整的硬件虚拟化,其中向微处理器添加了额外的特权环。这允许主机操作系统在特定特权级别(即:-1,虚拟机管理程序空间)中运行,而来宾操作系统在环0(即:0,内核空间)中运行不变。然而,虚拟设备模拟仍然存在问题和/或开销较高,因此需要创建自定义来宾驱动器。这些驱动器为对性能最敏感的设备(特别是磁盘和网络)重新引入了有针对性的半虚拟化。这给我们带来了当前的情况,硬件辅助的虚拟机管理程序通过有针对性的半虚拟化驱动器得到增强。
我也做了一些研究,我认为这可能会帮助你理解这个问题,但它可能不会直接解决它(也许)。除了 shodanshok 答案之外,我可能会炸毁他的“扩展”答案,也许会有点巨大的足迹
半虚拟化(可能)仍然具有相关性,原因如下:
维基百科说一下:
我认为,尽管我们可以参考维基百科文章,但您可能有一些原因不想将硬件直接暴露给来宾,特别是如果您出售租用的虚拟机。
此外,通常情况下,我们还需要标准和标准化驱动程序以及接口。
在尝试安装 Windows 9x/nt/VIST/XP 时,我们不想像以前那样处理驱动程序。但或多或少也在标准硬件上 7/10/11(他们大多已经有了,有时已经包括了 VirtIO 支持)。(特别是在 Windows 7 时期之前)。
这就是为什么我们需要更多地了解历史:
维基百科文章的历史部分说:
这提醒我,它的内核中的支持也已在 2011 年左右被放弃,而从 08 年开始引入了 VirtIO(可能作为继任者)
恕我直言:
参考):
另一个答案包含:
作为反驳,单根 IO 虚拟化 (SR-IOV)可用于允许物理 PCIe 设备通过 PCIe 总线多次呈现自身。从上面链接的 NVIDIA(前 Mellanox)页面:
作为 VM 托管提供商的一个示例,Amazon Web Services Linux 上的增强网络页面包含: