上回我们是从硬件下手了。经历了一个从纯模拟,到半虚拟化,到全虚拟化,最终又半虚拟化的过程。但是,它们都是在同一个地方插了一脚:

现在,我们把目光往上移,从应用程序到硬件之间,还有一层,那就是操作系统。虚拟机的第二个流派就是OS-Level Virtualization(操作系统级别的虚拟化),Application Virtualization(应用程序虚拟化)。

说到硬件,作为应用程序开发人员的我们,都不怎么熟悉。实际上硬件也是提供了类似API一样的东西的,硬件流派的虚拟机实际上,就是通过模拟常见硬件的API来达到虚拟化的目的的。同样,在操作系统和应用程序之间也有一个API层。那么我们为什么不能虚拟化这个API呢?让应用程序调用我们的API,然后我们再调用真实操作系统的API。比如它访问c:\temp,我就把路径重定向到c:\virtualized\temp。

这方面,数Chroot历史最悠久。Chroot就是在某个文件夹下比如/home/wtao/root模拟出一个新的root来。在chroot之后执行的程序,它去访问root,实际上是/home/wtao/root不再是真正的root(/)了。由于Unix的Posix API是以文件路径为约定的,而且啥都是基于文件的(比如/proc就是所有的进程所在的目录)。虚拟的根目录,相当于虚拟的操作系统API。所以,从这个意义上来说,Chroot就是启动了一个虚拟机。基于Chroot的原理,有BSD的jail和Solaris的Zone等等。

Windows方面的OS Level虚拟机只有一个真正能用的实现,那就是Virtuozzo。它的原理我也不是很清楚。不过根据观察每个虚拟机都有一个自己的smss.exe。而这个是Windows的Session Manager,是第一个被启动的用户态进程。而每个虚拟机也有自己的驱动程序。在主机上也有一个特殊的文件系统(不启动就看不到里面的文件)。所以我推测Virtuozzo并不是一个纯粹的OS Level虚拟化,它应该是硬件流和软件流混血的产物。

大厂都是主要玩硬件流的,比如Vmware,微软。Linux社区由于内核开放,所以操作系统虚拟化比较成熟。一些小厂没法直接加入到那么高层次的竞争,最容易进入的就是Application Virtualization(应用程序虚拟化)这个领域了,相比前两者门槛最低。我个人理解应用程序虚拟化就是不完整版的操作系统虚拟化。很多Windows下的应用程序虚拟化的产品只虚拟化文件系统和注册表。实现起来相对容易,只需要应用我之前提到过的API Hooking技术修改几个ntdll导出的API就行了。

我得承认,在操作系统级别的实现上,我没有深入的研究,可能是错误的。不过对于应用程序虚拟化(Application Virtualization)我非常确信它是如何实现的。今天的软件流派就讲到这里。明天从速度,可管理性,安全等方面给这些实现方案给一个我个人的主观评价(没有数据支持的),并推荐一些产品,以及它们适用的场合。

posted on 2008-11-06 10:54  taowen  阅读(2732)  评论(6编辑  收藏  举报