我應該用哪種虛擬機?(二)
系列文章導航:
上回我們是從硬件下手了。經歷了一個從純模擬,到半虛擬化,到全虛擬化,最終又半虛擬化的過程。但是,它們都是在同一個地方插了一腳:
現在,我們把目光往上移,從應用程序到硬件之間,還有一層,那就是操作系統。虛擬機的第二個流派就是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)我非常確信它是如何實現的。今天的軟件流派就講到這里。明天從速度,可管理性,安全等方面給這些實現方案給一個我個人的主觀評價(沒有數據支持的),并推薦一些產品,以及它們適用的場合。