今天在微信公众号看到了一篇很好的文章【炸裂的云计算-01】虚拟化原理和分类。其中虚拟化的理解很有价值。再次算是记录一下读后感,或者说二次整理。

##容器和虚拟机

每一个学习容器技术,比如Docker的人大概在入门的第一个小时就会接触到虚拟机和容器的差别。然后列举出容器的一系列优势:占用资源少,部署快,启动快。这里首先需要说句公道话,容器技术(以Docker为例)在获得了这些好处的同时,也丧失一些东西,比如容器的封闭性和安全性不如虚拟机,现在已经逐渐出现容器中可能遭到黑客入侵的讨论了。

无论容器还是虚拟机,其实都是在不同的层面进行虚拟化。虚拟化是一个抽象又内涵丰富的概念,在不同的领域或层面有着不同的含义。

##计算机层次与虚拟化

要理解虚拟化的不同内涵,需要从首先回顾计算机的层次结构。几乎所有的计算机遵守着相同的层级结构。分别是:

应用程序层
函数库层
	API抽象层
操作系统层
	硬件抽象层
硬件层

自底向上,形成依赖关系,这种分层的做法带来如下好处:
1)每一层都向上提供了接口,降低系统的复杂性和软件的可移植性。
2)每一层只需要知道下一层的抽象接口即可,不需要知道其内部运作机制
3)降低系统设计的复杂性
4)提高软件可移植性

虚拟化就是在上下两层之间,通过向上层的提供与下层一致的接口方法,抽象出一个新的软件或硬件接口,使得上层软件可以直接运行在新的虚拟环境上。

虚拟化用一个通熟易懂的词语解释,就是“欺骗”,通过模访下层原有的功能模块,来欺骗上层。可以联想“中间人攻击”还有现实中的皮包公司来理解。

因此,就明白,我们有着四个层次,每个层与层之间都有做虚拟化的机会,也确实产生了这样的技术。

##虚拟化技术

有了上面的理念,就可以重新认识我们熟知的虚拟化技术:

虚拟机:存在于硬件层和操作系统层间的虚拟化技术。

虚拟机通过“伪造”一个硬件抽象接口,将一个操作系统以及操作系统层以上的层嫁接到硬件上,实现和真实物理机几乎一样的功能。

容器:存在于操作系统层和函数库层之间的虚拟化技术。

容器通过“伪造”操作系统的接口,将API抽象层,函数库层以上的功能置于操作系统上,以Docker为例,就是基于Linux操作系统的Namespace和CGroup功能实现的隔离容器,模拟操作系统的功能,因为它比虚拟机高了一层,也就需要少一层东西,所以容器占用资源少。

JVM:存在于函数库层和应用程序之间的虚拟化技术。

Java虚拟机具有跨平台特性,所谓跨平台特性实际上就是虚拟化的功劳,我们Java语言是调用操作系统函数库的,然而不同操作系统的函数库互不相同,JVM就是建立一个虚拟化层,对下通过不同的版本适应不同的操作系统,对上提供统一的运行环境交给程序和开发者。通过虚拟化实现了如今蔚为壮观的Java生态圈以及建立在JVM基础上的其他语言,如Scala,Clojure,Kotlin等。

##总结

由此可知,虚拟机和容器都是依赖计算机层次划分而生的,提出各个层次的虚拟化技术的人真的对计算机原理有很深的理解。从大的角度看,都是·是利用分层思想来解决复杂问题的应用。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐