虛擬桌面
基於伺服器的計算模型
“Desktop virtualization (或者稱為Virtual Desktop Infrastructure) 是一種基於伺服器的計算模型,VDI概念最早由桌面虛擬化 廠商VMware提出,目前已經成為標準的技術術語。雖然借用了傳統的瘦客戶端的模型,但是讓管理員與用戶能夠同時獲得兩種方式的優點:將所有桌面虛擬機在數據中心進行託管並統一管理;同時用戶能夠獲得完整PC的使用體驗。
簡單的來說,虛擬桌面是指:支持企業級實現桌面系統的遠程動態訪問與數據中心統一託管的技術。一個形象的類比,就是現在,我們可以通過任何設備、在任何地點,任何時間訪問在網路上的我們的郵件系統,或者網盤;而未來我們可以通過任何設備,在任何地點、任何時間訪問在網路上的屬於我們個人的桌面系統。
思科在2010年年底的時候,推出了 VMware View 4.5 和 Citrix XenDesktop兩款產品,該兩款產品已經在2011年3月上市。這兩款產品的價格都低於500美元,包括 一個USB鍵盤、滑鼠和客戶端授權。除此之外,思科表示該公司此前發布的Cius平板電腦將支持VMware View、Citrix Receiver 和Wyse Pocket 雲計算虛擬軟體;並且將會和微軟的Windows在一個數據中心進行互聯。Cius同樣也在2011年3月上市。
桌面虛擬化和瘦客戶端計算機已經推出了很多年,通過數據中心伺服器中心化電腦的功能、數據和應用程序給予數據和安全更多的控制。
VDI桌面虛擬化的優勢在於運算集中在伺服器端,因此在以下兩種環境中特別合適:1、在極小的廣域網帶寬環境下,例如低於500Kbs的線路下,可以採用VMware等VDI產品進行部署,用戶可以使用平板電腦或者手機接入,訪問自己的桌面環境,實現隨時隨地辦公;2、在新建的全千兆網路環境下,同時業務應用比較簡單的環境中,用戶部署VDI桌面虛擬化后可以購買100元左右的雲終端作為客戶機,大大減少客戶機的硬體投入,拉平在伺服器上的硬體投入,使得總投資更加合理。
虛擬桌面基礎架構(Virtual Desktop Infrastructure,簡稱VDI)是許多機構目前正在評估的全新模式,它是基於早期的RDP協議和瘦客戶機逐步演變而來的,也是目前國外VMware等國外虛擬化廠家長期鼓吹的模式。VDI旨在為智能分散式計算帶來出色的響應能力和定製化的用戶體驗,並通過基於伺服器的模式提供管理和安全優勢。它能夠為整個桌面映像提供集中化的管理,但這一模式目前也存在著其固有的問題。主要表現為:因其利用硬體模擬及瘦協議,使得視頻、Adobe Flash、IP 語音(VoIP)以及其它計算或圖形密集型應用不適用於該模式,而且VDI 需要持久的網路連接,因此不適於要求離線移動性的場合。此外,其基於伺服器的模式對伺服器的配置有極高的要求,這些問題的存在不能不讓眾多的用戶重新考慮部署VDI的實際意義及成本。從實際應用方面來分析,VDI模式還存在諸多需要解決的問題,而與之相關的虛擬化桌面,如遠程託管桌面、遠程虛擬應用程序、遠程託管專用虛擬桌面、本地虛擬應用程序及本地虛擬操作系統等虛擬化桌面也都存在著各種問題;另外還有對終端硬體的支持問題、對網路及伺服器硬體過度依賴的問題、以及數據安全性問題等。
虛擬操作系統基礎架構(Virtual OS Infrastructure,簡稱VOI)成為一個新的桌面虛擬化發展方向。而在國內,和信最早推出了基於VOI桌面虛擬化架構的虛擬終端管理系統。VOI桌面虛擬化技術不僅可實現基於服務端的遠程虛擬OS、APPS、UserProfiles的按需交付,也可實現基於客戶端的本地緩存OS、APP及UserProfiles,這樣不僅僅可利用終端本地資源處理計算及圖形密集型應用,比如:如音視頻、大型設計及工業軟體等,也可支持各種計算機外設以適應複雜的應用環境及未來的應用擴展。同時,對網路和伺服器的依賴性將大大降低,即使網路中斷或伺服器宕機終端也可繼續使用,數據可實現雲端集中存儲,也可實現終端本地加密存儲,且終端應用數據不會因網路或服務端故障而丟失。
虛擬桌面整體架構分為以下四層:
l 終端接入層
用戶的終端處於這個層面,虛擬桌面可以接受各種終端的接入。
l 接入網路層
接入網路層負責保證用戶安全接入,並且為桌面雲資源提供負載均衡。
l 桌面管理層
桌面管理層負責整個虛擬桌面系統的調度,如新虛擬桌面的註冊及將虛擬桌面的請求指向可用的系統,認證用戶身份並為其授權可以使用的桌面,除此之外桌面管理層本身也承擔負載均衡的作用。
l 資源池層
在 Windows Api 中提供了 CreateDesktop 函數來創建新的虛擬桌面,通過 SwitchDesktop 函數可以轉入到指定的桌面,在新創建的桌面中可以打開進程explorer.exe,CreateProcess 有個TStartupInfo結構的參數,該結構中有個叫lpDesktop的成員,它指定了在哪個桌面創建進程;該函數實現的虛擬桌面為Windows視圖系統創建多桌面擴展,使用戶或程序可以多個桌面上相互切換可視化的應用,與Linux 圖形界面中四方格切換相似,但是該技術與現行“桌面虛擬化技術”是兩種完全不同的概念,不可以混淆。
引用MSDN:
Creates a new desktop, associates it with the current window station of the calling process, and assigns it to the calling thread. The calling process must have an associated window station, either assigned by the system at process creation time or set by the SetProcessWindowStation function.
To specify the size of the heap for the desktop, use the CreateDesktopEx function.
函數原型
HDESK WINAPI CreateDesktop(
_In_ LPCTSTR lpszDesktop,
_Reserved_ LPCTSTR lpszDevice,
_Reserved_ DEVMODE *pDevmode,
_In_ DWORD dwFlags,
_In_ ACCESS_MASK dwDesiredAccess,
_In_opt_ LPSECURITY_ATTRIBUTES lpsa
);
Parameters
lpszDesktop [in]
The name of the desktop to be created. Desktop names are case-insensitive and may not contain backslash characters (\).
lpszDevice
Reserved; must be NULL.
pDevmode
Reserved; must be NULL.
dwFlags [in]
This parameter can be zero or the following value.
在C語言中的實現
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
HDESK hOld = GetThreadDesktop(GetCurrentThreadId());
if ((NULL == hOld) || (NULL == hNew))
{
MessageBox(NULL, "失敗!", "測試", MB_OK | MB_ICONERROR);
return 1;
}
SetThreadDesktop(hNew);
SwitchDesktop(hNew);
MessageBox(NULL, "成功!", "測試", MB_OK);
SwitchDesktop(hOld);
CloseDesktop(hNew);
return 0;
}
在VB中的實現
Private Sub Form_Load()
g_hDesktopThreadOld = GetThreadDesktop(App.ThreadID) '得到正常的桌面句柄
RegisterHotKey Me.hWnd, 1, MOD_CONTROL, Asc("Q") '註冊熱鍵
RegisterHotKey Me.hWnd, 2, MOD_CONTROL, Asc("W") '註冊熱鍵
g_hDesktopNameNew = "MyNewDesktop"
g_hDesktopNew = OpenDesktop(g_hDesktopNameNew, 0, False, DESKTOP_ALL) '如果新桌面已經存在,就打開它
If g_hDesktopNew = 0 Then
g_hDesktopNew = CreateDesktop(g_hDesktopNameNew, vbNullString, ByVal 0&, 0, MAXIMUM_ALLOWED, ByVal 0&) '如果不存在,就新建一個
End If
Call SetThreadDesktop(g_hDesktopNew)
lpOldWinProc = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf myWindowProc) '子類化主窗口,接收熱鍵消息
End Sub
Private Sub Form_Unload(Cancel As Integer)
If g_hDesktopNew <> 0 Then
CloseDesktop g_hDesktopNew '關閉新建的桌面句柄
End If
SetWindowLong Me.hWnd, GWL_WNDPROC, lpOldWinProc
End Sub