问题:容器、虚机两种虚拟化技术的本质区别是什么?
虚拟化的概念最早在1959年,由牛津大学的计算机Christopher Strachey教授提出
1960 年IBM进行 M44/44X 计算机研究项目,实现世界第一个支持虚拟机的系统
该研究项目首次提出了两个概念:VM(Virtual Machine )和VMM(Virtual Machine Monitor,虚拟机监控器,也称为Hypervisor)
VMM向下掌控实际的物理资源,向上呈现给虚拟机N份虚拟的逻辑资源
全虚拟化(Full-Vritralization)
- VMM模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等
- GuestOS完全不做任何修改就可以在虚拟机中运行,甚至无法区分自身是否运行在虚拟机中
基于二进制翻译实现的全虚拟化
- 纯软件模拟来实现VMM层,VMM将GuestOS的指令翻译成HostOS的指令
- 实现非常复杂
- 所有指令都需要翻译,性能较差
- 支持跨平台
半虚拟化(Para-Vritralization)
- 需要针对性修改GuestOS内核源码,对闭源的GuestOS不友好
- 修改过的GuestOS内核遇到敏感指令,会自动替换为Hypercall向VMM发起调用
- 效率接近原生系统
硬件辅助的全虚拟化
- 硬件本身提供能力,区分不同的运行环境(譬如x86架构CPU,提供了root/non-root两种模式)
- 效率接近原生系统
- 跨平台能力较差
直通(passthrough)
- 将GuestOS上虚拟设备的访问地址映射到HostOS的相同地址
- 需要芯片组和CPU支持
- 性能与原生系统几乎一致
CPU虚拟化
以Intel的x86架构CPU为例,提供了ring0-ring3共4个特权级别
常见的操作系统只用到ring0(内核态)和ring3(用户态)
Intel和AMD分别提供了硬件虚拟化技术VT-x和AMD-V,提供了root mode和non-root mode两种运行模式
内存虚拟化
Linux系统下,进程操作内存需要进行地址转换VA(虚拟地址)→PA(物理地址),转换过程依赖MMU(Memory Management Unit)和页表来完成
而在GuestOS中,则需要多一次转换GVA(Guest VA)→GPA(Guest PA)→HPA(Host PA)
软件实现的全虚拟化很复杂,转换过程也是通过VMM提供的来影子页表(Shadow Page Table)完成
容易出现高频率的VM Exit,还需要考虑影子页表的同步,缓存影子页表的内存开销大
因此厂商也推出了各自的硬件辅助技术,比如Intel的EPT(Extended Page Table)和AMD的NPT(Nested Page Table)
够从硬件上同时支持GVA→GPA→HPA的转换,大幅减少了因为页表更新带来的VM Exit
IO虚拟化
QEMU(Quick Emulator)
- 纯软件实现的虚拟化系统,功能强大
- 可以模拟整套的虚拟机包括处理器虚拟化,内存虚拟化,以及各种IO设备
- 限制于软件模拟,性能较为低下
KVM(Kernel-based Virtual Machine)
- 基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的全虚拟化解决方案
- 从Linux 2.6.20开始整合到Linux内核版本中
- 在原有的用户模式和内核模式中新增了客户模式,客户模式也拥有自己的内核模式和用户模式,虚拟机就是运行在客户模式中
QEMU-KVM(软件模拟的IO全虚拟化方案)
- KVM可以实现高性能的CPU、内存虚拟化,补全了QEMU的性能短板
- KVM提供了虚拟化内核运行环境,用户无法直接控制内核去做任何事情,需要类似QEMU这种运行在用户态工具来管理虚拟机
- KVM只负责CPU和内存的虚拟化工作,其他IO设备的模拟化交给QEMU来负责
- QEMU 1.3之后的主干代码中已经包含了KVM相关功能
virtio(半虚拟化方案)
- 前端驱动:Frontend Driver,是位于客户机内核中的驱动程序模块,如virtio_blk、virtio_net等
- 后端驱动:Backend Driver,在宿主机用户空间的 QEMU 中实现
- virtio内部将所有设备都抽象为PCI设备,统一了transport层的传输方式
- virtio提高效率的方式主要是减少了核心态/用户态的切换次数
PCIe设备直通
常见技术:Intel VT-d(Virtualization Technology for Directed I/O)或 AMD IOMMU(Input/Output Memory Management Unit)
- 允许将某些PCI设备的管辖权直接移交给GuestOS,GuestOS会以独占的方式直接操作设备
- 硬件上引入重定向单元,用于对I/O子系统的DMA操作和中断传递进行重定向
- 需要芯片组支持此特性
- 性能基本与原生系统一致
SR-IOV(Single Root Input/Output Virtualization)
- 在PCIe直通技术上实现的网卡虚拟化技术,在保证高性能的同时允许网卡设备共享
- Physical Functions:物理网卡所支持的一项PCI功能,一个PF可以扩展出若干个VF
- Virtual Functions:支持SR-IOV的物理网卡虚拟出来的实例,以一个独立网卡的形式呈现
- Host主机需要支持PCIe设备直通,网卡也需要支持SRIOV特性,并且VMM上安装好相应驱动