VMware Workstation:http://www.vmware.com/
VMware ThinApp:http://download3.vmware.com/software/northstar/ThinApp.msi
Citrix:http://www.citrix.com/lang/English/home.asp
最近時機壞壞,新台幣縮水不少,好不容易存錢組裝多核心跟大硬碟的電腦,卻不知道怎麼發揮最大效益,錢花的真冤枉啊。一定有很多玩家說,要榨乾多核心CPU,可以跑虛擬作業系統或是多執行緒的程式;買了便宜的硬碟,可以組成RAID,也可以開多一點空間給虛擬作業系統用……,好像只能玩到這樣了。其實,虛擬作業系統也不是萬能的,假設老闆問你:「公司新買了一百台電腦,可以麻煩你全部裝上作業系統嗎?」,你一定會想到用映像檔的方式,批次灌在每個系統上面,但是灌完以後,公司又買了新的軟體,老闆又要叫你佈署到每一台電腦,要怎麼辦?製做新的映像檔,然後每台又都根據新的映像檔重新覆蓋磁碟機嗎?但是舊有的資料又要備分,很麻煩吧。
圖說:利用ThinApp掃描好系統組態後,可以建立快照,方便下次製作虛擬化軟體。
雖然Windows 2008 Server推出了「RemoteApp」的功能,可以透過網路串流的方式執行程式,但如果公司沒買Server 2008也沒輒。這時候,透過軟體層級的虛擬技術就很方便了,可以把程式封裝成單一檔案,就像Mac OS X 的「.app」檔,要安裝、移除,只要複製或刪除該檔案就行,非常方便,甚至可以將軟體中不必要的功能拔掉再壓縮編譯,這樣就能做出綠色、可攜、跨Windows平台且小巧的軟體。這也是接下來的主角ThinApp所能做到的特異功能。
| ThinApp與虛擬PC的比較 |
|---|
| | 正常安裝 | Thinapp | VMware Workstation |
| 應用程式 | 獨立 | 獨立 | 獨立 |
| 資源 | 共享 | 獨立 | 獨立 |
| 作業系統 | 共享 | 共享 | 獨立 |
| 硬體 | 共享 | 共享 | 共享 |
| 虛擬化程度 | 低 | 中 | 高 |
軟體虛擬化的做法
製作虛擬PC的VMware公司併購Thinstall以後,將ThinInstall專案改名為ThinApp,以和目前市佔率很高的Citrix競爭。從比較表當中可以看出ThinApp和VMware Workstation 虛擬化做法的差別:
ThinApp包出來的程式不會和其他程式共享資源,也就是說,連登錄機碼都虛擬化了!要知道,很多軟體會相衝,可能是因為調用了相同的資源,如果各自用各自的資源,也就沒有相衝的問題了,每個軟體就像一個自洽的小系統,遺世而獨立。
目前ThinApp正在Beta中,提供免費試用40天的優惠,加上很多人都用過VMware Workstation,電腦王也介紹過VMware Workstation的用法,所以我們決定用ThinApp搭配VMware Workstation示範,製作虛擬化的MSN 8.5版。
圖說:在VMware Workstation 裡點選「VM」>「Snapshot」>「Snapshot Manager」,就可以看所有的快照,然後在某個快照上按「Go To」,就可以回復到先前的狀態。
建立虛擬軟體執行環境
建議使用VMware Workstation建立虛擬機器,並安裝一個乾淨的作業系統環境,在安裝好以後,利用Windows Update執行安全更新,這樣的好處有:
1.因為乾淨,所以ThinApp掃描的時候比較快。
2.避免其他程式干擾:因為其他程式也可能會在背景寫入檔案或登錄機碼。
3.做好一個虛擬化程式,利用VMware Workstation的快照(snapshot)與仿製(clone)功能,又能馬上回復到最乾淨的狀態,再製作其它虛擬化軟體,不必反安裝應用程式。
4.本機的主系統,在製作虛擬化軟體時,仍然可以執行其它工作,不怕影響到ThinApp,讓VMware Workstation在背景作業就好。
根據經驗,分配給虛擬作業系統的硬碟空間不要太小,因為ThinApp要記錄系統裡所有被變更的檔案,還要複製一份出來,如果是Vista SP1的話,建議預留24GB的空間,也不用太多,反正可以利用快照功能回復,硬碟空間也可以取回。
Tips:該選什麼虛擬作業系統?
ThinApp建議使用需要向下相容的最低版本,並且考慮虛擬化軟體尚未虛擬前可以執行的環境,什麼意思呢?假使要製作在Win2008/Vista/XP SP3/ XP SP2執行的讓虛擬化MSN,而MSN原本可以執行的環境是Vista/XP,最好就在XP的環境下執行ThinApp來製作,這是因為作業系統通常可以向下相容,也就是說新作業系統會認識舊作業系統的元件。筆者平常只用Vista SP1和2008,所以在Vista SP1製作虛擬化MSN,在Vista跟2008測試都可以用,但是在朋友的XP SP2電腦上卻出現「服務 'Messenger Sharing Folders USN Journal Reader service' (usnjsvc) 無法安裝……」的錯誤訊息。按取消還是可以用,只是感覺不太舒服。後來更新成SP3就沒有問題,畢竟XP SP3是Vista推出後才釋出的,跟Vista的相容性較高。
實戰WLM 8.5綠色虛擬軟體
Meebo:http://www.meebo.com
作業系統的軟體相容性問題經常會讓人詬病,雖然會隨著時間慢慢更新解決,還是很多人擔心無法執行舊的軟體。為什麼有些軟體只能裝在特定的作業系統上呢?有很多原因,例如作業系統元件的版本、商業策略(間接逼你付錢升級新版,或是server版要付更多錢)、作業系統的安全防護(例如UAC)等等,這些通通都可以靠軟體虛擬化來解決,因為虛擬化是讓軟體以為自己在某個相容的作業系統環境執行,連相關的元件也通通包進來,不怕沒安裝或找不到。
為了證明筆者不是嘴砲,我們實際來虛擬化Windows Live Meesenger 8.5(以下簡稱WLM或MSN)看看。為什麼選WLM呢?因為它不能安裝在Windows Server 2008!有人會說,用網路版或是非微軟出的IM軟體就好啦,為什麼堅持要用Windows Live Messenger?雖然Meebo或Pidgin等軟體也支援MSN協定,但是卻無法傳送和接收離線訊息!(這功能很重要,你怎麼知道哪天心儀的對象不會用離線訊息跟你告白呢?萬一漏接了不就糗大)。在還沒有軟體虛擬化之前,筆者的解決方法是利用VMware Workstation跑Vista,然後灌WLM。後來覺得很不方便,只為了MSN而跑VMware未免太浪費了,操作上也不方便,畫面還要切來切去,即使有安裝VMware Tool也是一樣。
圖說:網路型的MSN:Meebo,只要有瀏覽器,就可以使用MSN,已經很方便了,但是有無法接收和發送離線訊息和傳送檔案的功能,仍然不夠好用。圖說:啥,自家的軟體都不給裝,只能裝在XP跟Vista,只好自己想辦法。圖說:在2008上運作的WLM 8.5,可以常駐在工作列,也可以接發離線訊息,該有的功能一樣都不少。接收的檔案也一樣會放在「我已接收的檔案」資料夾裡。
第一次編譯測試
實際的MSN虛擬化步驟如下:
1. 安裝 VMware Workstation
2. 虛擬出Vista SP1中文版作業系統
3. 安裝Windows Update安全更新。
4. 仿製一份,以防不小心執行到一半斷電,造成虛擬作業系統損毀,結果還要再重灌。
5. 利用VMware Workstation建立系統快照(snapshot)
6. 安裝並執行ThinApp
7. 執行ThinApp之後掃描系統組態,再建立快照。
8. 安裝WLM 8.5
9. 用ThinApp分析安裝WLM以後,作業系統有什麼改變。
10. 設定虛擬化軟體的進入點(entry point),也就是一開始要執行什麼程式(本例是WLM的主程式)
11. 修改package.ini檔
12. 執行build.bat檔編譯出虛擬化軟體
13 測試能不能在Windows Server 2008運行
ThinApp所有的專案都會放在「C:\Program Files\VMware\VMware ThinApp\Captures」底下,分析好系統組態的改變以後,要到上述的路徑去修改package.ini或執行build.bat來編譯虛擬化軟體。我們先不考慮修改package.ini檔的情況,試著編譯看看能不能用再說。點選build.bat(如果是在Vista下,要有系統管理員權限),然後ThinApp就會將WLM 8.5有關的檔案和登錄機碼通通包進去,編譯出來的結果會放在「Bin」的子資料夾裡。將編譯出的執行檔複製到Windows Server 2008執行,果然可以成功運作。等一下,這個虛擬化MSN竟然有一百多MB耶,是不是太大了點?其實這是為了要加速測試期間的編譯速度,所以故意先不壓縮,等到測試成功後,再利用壓縮功能減少檔案大小(但是會編譯比較久)。有關這部份的操作我們接下來會說明。
圖說:設定虛擬化軟體執行檔一開始執行時的進入點。
去除廣告、啟用壓縮
MSN Pure Patch:http://pank.org
MSN Plus:http://www.msgpluslive.com.tw/
剛剛只是初步測試,現在我們想要讓虛擬化軟體更好,也就是去掉廣告和安裝MSN Plus,並且壓縮檔案大小。去廣告的程式我們用Pank版的MSN Pure Patch,由於Patch牽涉到的檔案只有兩個,一個是msnmsgr.exe(MSN主程式)另一個是msgsres.dll(資源檔),所以將Patch過的這兩個檔案放到C:\Program Files\VMware\VMware ThinApp\Captures\Windows Live Messenger\%ProgramFilesDir%\Windows Live Messenger裡,再重新編譯,就可以產生無廣告的虛擬化MSN。
如果要壓縮,則必需打開package.ini,然後修改:[Compression];None for faster builds, Fast for smaller packagesCompressionType=Fast
比較有壓縮跟沒壓縮的檔案大小差異,壓縮後的檔案只有56MB,整整縮小50%。
圖說:執行Pure Patch後,可以發現只有兩個檔案被更動過,把更動過的檔案放到ThinApp專案資料夾的「Captures\Windows Live Messenger\%ProgramFilesDir%\Windows Live Messenger」裡,再重新編譯,就可以產生無廣告版本的虛擬化MSN。圖說:ThinApp可以產生MSI安裝檔,在安裝後產生反安裝程式和開始功能表捷徑,就像真的安裝過一樣。壓縮功能預設是「No compression」,編譯速度比較快,進入package.ini裡修改成「Fast compression」可以縮小檔案。
加裝MSN Plus
如果要安裝MSN Plus有兩種辦法:一種是裝完WLM 8.5,緊接著裝Pure Patch和MSN Plus,然後再用ThinApp掃描,這很直觀,另一種安裝外掛的方法是利用ThinApp的Application Link功能,也就是另外為MSN Plus製作虛擬化的執行檔,假設取名為msnplus.exe,把檔案複製到MSN主程式專案的plugins子資料夾下,再開啟package.ini,修改:;Enable this option if you want the application to check for addition add-on modulesOptionalAppLinks=plugins\msnplus.exe
再次重新編譯,就會將MSN Plus連結起來。但要特別注意,很多軟體都是靠讀取登錄機碼來偵測要載入那些外掛,所以要注意「Isolation Mode」是否設為Full([圖x]),也就是完全隔絕的狀態,不會去讀取系統或Link的登錄機碼。不過通常只需要我們不是很相信軟體,或是該軟體會亂修改系統設定時,才會把Isolation Mode設為Full。
圖說:將Isolation Mode設成Full,有可能會讀取不到外掛的登錄機碼設定,所以ThinApp預設只能選Merge或WriteCopy兩種模式,Full的模式要自行到package.ini裡修改。
以系統服務執行虛擬化軟體
FireDaemon:http://www.firedaemon.com/
MSN虛擬化以後,還可以玩什麼呢?有一套很有名的軟體叫「FireDaemon」,可以讓一般的應用程式以系統服務的方式執行。假設要離開電腦一陣子,但是又想要讓MSN一直保持在執行的狀態,以便讓不能傳送離線訊息的程式(例如之前提到的Meebo或是Mac OS X的Adium)也能傳送訊息到我們的MSN,或是一直開著MSN且自動接受別人傳送的檔案,要達成這樣的目的,可用MSN Plus搭配FireDaemon。首先設定好自動輸入帳號密碼登入,以及在MSN Plus裡設定自動接受檔案,然後利用FireDaemon 讓MSN變成系統服務,並設定成一旦意外終止執行時,也會自動重新啟動。如果不以系統服務的方式執行,雖然MSN中斷連線後可以設定成自動重新登入,但如果是MSN主程式意外結束或被不小心關掉,就沒辦法自動重新啟動,所以要靠FireDaemon「還魂」。
不過,想要在 Windows Vista或2008執行FireDaemon的話,會遇到一些麻煩,因為Vista / 2008考慮到安全性,有些設計跟XP/2003不一樣。以Vista來說,會區分Session 0和Session 1,將系統服務和驅動程式放在Session 0,而一般的應用程式則放在Session 1,這兩個Session裡的程式不能直接互動,所以如果用FireDaemon將MSN以系統服務方式執行,「互動式服務對話方塊偵測」就會跳出來,要按下「顯示訊息」才可以看到畫面,這是為了防止病毒或植入的木馬等惡意軟體攻擊的機制。解決辦法是將Explorer.exe和虛擬化的MSN都以系統服務的方式執行,這樣Session 0也就可以同時操作檔案總管和MSN。
圖說:在「Program」的分頁裡,要設定虛擬化MSN的路徑。圖說:在「Advanced」分頁裡,可以指定當MSN被關閉時,自動重新啟動(Restart the service)。圖說:利用FireDaemon讓MSN和檔案總管都以系統服務執行。
Windows Server 2008的做法
另外,在Windows Server 2008裡有「資料執行防止(DEP)」機制,是一組硬體與軟體技術,會對記憶體執行額外的檢查,以協助防止惡意程式碼在系統上執行,為了正常執行FireDaemon,可以將FireDaemon加入例外,這樣在一開始執行FireDaemon的時候,就不會跳出DEP的對話方塊了。
圖說:當出現「互動式服務對話方塊偵測」時,要按下「顯示訊息」,才會跳到Session 0的畫面。圖說:注意,在Session 0的畫面看不到Session 1的程式。圖說:在安裝FireDaemon 的時候,建議勾選「Enable the Interactive Service Detection Service」和「Disable User Access Control」。
結語
Wine:http://www.winehq.org/
軟體虛擬化除了可以執行不相容的軟體,還有其他安全性考量,像是「100% User Mode」,因為所有執行檔、DLL檔、登入機碼、資料和第三方協力廠商的元件庫都包起來了,不會動用到系統裡的元件,所以不必進入kernel mode,也就可以確保系統的安全,也因此可以建構出不必重灌也不容易中毒的虛擬環境。而虛擬化的過程記錄,也讓程式開發者不敢亂塞東西進去。很多公共場合像是網咖或機場的電腦會禁止安裝軟體,實在很不方便,有了軟體虛擬化技術就不用怕了,而且因為程式會用到的資源和設定檔也一起打包了,使用者習慣的設定也會保留,不必重新設定。如果遇到需要以系統服務方式執行的軟體,則可以透過FireDaemon來達成,日後要更動或移除也很方便。
不過,ThinApp目前只能做到「跨Windows平台」,如果要跨到Linux平台,還是得用JAVA或是利用跨平台Framework的方式重新編譯執行檔,或是靠虛擬作業系統來執行軟體,雖然目前有Wine HQ可以模擬Windows API,但這是靠逆向工程的方式重寫的,可能無法達成100%模擬。
希望熱心的讀者或網友們,能將相容性不高或不好安裝的軟體(例如著名的統計軟體SAS,安裝程式分散在好幾片光碟裡,每次都要裝好久)虛擬化後丟到論壇分享,或是幫忙把不必要的元件拔除,這樣我們就有更多更好用的綠色軟體囉。
關鍵字:user mode、kernel mode
軟體虛擬化的好處是,可以讓虛擬化軟體在純粹user mode下執行(也就是所謂在sandbox裡執行,中文翻成「沙盒」)。大部分的CPU架構都支援kernel mode與user mode兩種執行模式,因為某些指令可以做壞事,比較危險,所以要經由呼叫system call來執行,作業系統檢查應用程式的權限和操作內容後,才會放行,然後通知CPU進入kernel Mode。