在我看来,Type2 是纯粹的软件虚拟化
不要将“类型 1 与类型 2”和“硬件与软件”虚拟化混为一谈。事实上,硬件和软件之间实际上存在一个中间地带:有完整硬件(HVM)、“部分”硬件(PVM)和纯软件(SW)。
我将尝试通过扩展所有 6 种组合来澄清:
类型 1 + 全硬件 (HVM) - 这允许像 Xen HVM 这样的管理程序启动未修改的客户操作系统。这实际上很慢,因为管理程序必须解码客户操作系统试图发送到硬件的“电报消息”。(即写入磁盘驱动器涉及在位置 0xblahblah 重复存储字节。)
类型 1 + 半虚拟化 (PVM) - 这是当您稍微修改来宾操作系统以直接调用 Hypervisor 执行某些任务时,例如磁盘 I/O。这更快,因为客人只是说“在这里,写这个字节页”并且不必对每个字节进行(虚拟化)I/O。当您安装特殊驱动程序时,您知道您正在执行 PVM。当然,有时操作系统已经内置了虚拟驱动程序。例如,任何现代 Linux 内核都会在启动时自动切换到 PVM 模式,当它检测到它在 Xen、KVM、UML 等下运行时。
Type 1 + Pure Software (SW) - 我不确定这是否存在,但构建起来并不难。由于软件仿真很慢,因此启动真实操作系统和运行 Type 2 的开销并不是什么大问题。
类型 2 + 全硬件 (HVM) - 这允许您在 VirtualBox 或 KVM 下启动未修改的 Windows。当您可以重新启动所有客人并仍然在后台播放 MP3 时,您知道它是类型 2 :)
类型 2 + 半虚拟化 (PVM) - 每当您安装客户驱动程序或在 VirtualBox/KVM 下启动现代 Linux 内核时都会发生这种情况。
Type 2 + Pure Software (SW) - Bochs 和 Qemu 的早期版本。(后来的版本实际上也有硬件辅助模式。)您可以说它们是“纯软件”,因为它们允许您运行通常没有它就无法运行的软件。(即,我在 ARM 处理器上的 Bochs 下运行 Windows '95,并且在 Qemu 下的 x86 上启动了 ARM 发行版。)
还有一个与上述不同的主题:
容器技术。Docker/Rkt/LXD 等容器不适合上表。容器中的应用程序是以普通方式调用内核的普通程序,不涉及 Hypervisor。
只是容器使用 cgroups 和命名空间的内核特性来让应用“感觉”就像在虚拟机中一样。每个容器都有一个系统的“分区”视图:它是自己的文件系统、它自己的用户 ID、它自己的进程 ID、它自己的主机名 + IP 地址等。但是从外部,你可以看到所有容器中的所有进程都带有 ' ps'。