最近做题时经常遇到docker、qemu运行的程序,docker、qemu的背后有一项十分重要的技术–虚拟化技术
,虽然我不一定要研究虚拟化技术的实现细节,但是我想我必须知道虚拟化技术的作用。
虚拟化技术
虚拟化技术是一种资源管理技术,将计算机的硬件资源
进行抽象、转换,构造出一个或多个电脑配置环境。
1974年,两位计算机科学家Gerald Popek 和 Robert Goldberg发表了一篇重要的论文 《虚拟化第三代体系结构的正式要求》,明确了虚拟化技术必须满足的条件:
- 等价性: 在虚拟机运行的效果必须和宿主机里运行效果相同(不考虑时间)
- 安全性: 虚拟机、宿主机必须隔离
- 性能: 在保障以上两个条件的同时,尽可能降低功能损耗。(最好的方式是大部分指令直接在物理机上运行,少量敏感指令需要VMM(virtual machine monitor,或者说是HyperVisor)处理。
我们知道,传统的计算机结构为硬件-OS-应用程序
,从这个架构出发,历史上出现了2种虚拟化方案—— I型虚拟化和II型虚拟化。
I型虚拟化之间在硬件上构建出多个隔离的虚拟机环境,代表作有VMware ESXi
II型虚拟化是在OS上构建出多个隔离的虚拟机环境,代表作有VMware Workstation
现在的实现虚拟化的思路是:正常情况下直接把虚拟机中的代码指令放到物理的CPU上去执行,一旦执行到一些敏感指令,就触发异常,控制流程交给VMM,由VMM来进行对应的处理,以此来营造出一个虚拟的计算机环境。
全虚拟化技术
能够完全模拟出整个计算机的技术被称为全虚拟化
但是模拟x86架构时,出现了些大问题!x86作为复杂指令集的经典架构,存在一些不敏感的指令,但是它对虚拟机敏感!那么上面刚刚提到的虚拟化思路就出现问题了。
VMware使用二进制翻译技术
,将虚拟机中运行的指令交由VMM(HyperVisor)翻译成宿主机上能运行的合适的指令。(当然,为了性能,有些可以直接运行在宿主机的安全指令是不会翻译的)
qemu使用了纯软件模拟的方式,模拟出了个CPU,将虚拟机的指令模拟执行,需要特定的系统调用时,会跟宿主机进行交互
半虚拟化技术——Xen
全虚拟化技术要实现的捕获指令并由VMM处理成合适的形式(无论是VMware还是qemu),说起来简单,做起来很困难,需要大量的底层技术支持.
此时有人就提出了别样的思路,就是将虚拟机上执行敏感指令的地方全都改成统一的接口调用(比如HyperCall),由接口提供方VMM进行相应的处理,省略了捕获和模拟硬件流程的一大段工作。
Xen项目是电典型的半虚拟化技术的代表,这项技术最大的问题:你需要改操作系统的源码(懂得都懂,难度也不用我多说了)。
硬件辅助虚拟化: VT/AMD-v
硬件厂商直接提供硬件的虚拟化支持,典型有 Intel的VT和AMD的AMD-v技术。
硬件辅助虚拟化在原有的Ring0-Ring3特权模式下额外增加了VMX root operation
和VMX non-root operation
,VMM运行在root operation上,虚拟机运行在non-root operation上,两种工作模式都提供完整的ring0-ring3的支持。
CPU提供编程接口,告诉CPU什么样的异常需要转交给VMM进行处理。这样的话,不仅简化了虚拟化程序的开发,还提高了虚拟化速度。
VMware、Xen都已经支持了硬件辅助虚拟化。
KVM-QEMU
KVM(The Kernel-based Virtual Machine),即基于内核的虚拟机。
KVM和VMware都支持硬件辅助虚拟化,不同的是,VMware以应用程序的形式安装在各个操作系统中,但是KVM直接集成到了linux内核中,即linux本身就可以成为HyperVisor!
KVM出现后就和qemu搭配使用,之前提到,qemu使用纯软件模拟来实现虚拟化,这样做效率很低,但是配合上kvm后,情况有了改变
KVM基于硬件辅助虚拟化,提供CPU和内存的虚拟,qemu负责各种IO设备的虚拟,两者互补,大大提高了效率。
容器技术-LXC和docker
前面的技术动不动就要对整个计算机虚拟,实在是太占资源了,容器技术只虚拟应用程序所需的运行环境,大大降低了虚拟的成本,也提供了更高的运行效率
LXC(linux Xcontainer)和现在爆火的docker,都是容器技术的产物。
但是容器技术相比于传统的虚拟化,提供的隔离性不强(不安全),容易被逃逸。
超轻虚拟化-firecracker
既想要虚拟化技术的安全性,又想要容器技术的轻量和效率,两者折中体——超轻虚拟化技术诞生了
代表作是亚马逊提出的firecracker
。
其提出了microVM的概念,用KVM对各个轻量的microVM进行强隔离,每个microVM是精简版的OS(剔除了很多无用功能,保留程序运行时环境)
references
https://www.cnblogs.com/xuanyuan/p/13211893.html
https://www.redhat.com/zh/topics/virtualization/what-is-KVM
https://www.zhihu.com/question/24123210
https://zhuanlan.zhihu.com/p/107003192?utm_source=com.oneplus.note