定義
簡單的來說,虛擬桌面是指:支持企業級實現桌面系統的遠程動態訪問與數據中心統一託管的技術。一個形象的類比,就是現在,我們可以通過任何設備、在任何地點,任何時間訪問在網路上的我們的郵件系統,或者網盤;而未來我們可以通過任何設備,在任何地點、任何時間訪問在網路上的屬於我們個人的桌面系統。
行業現狀
思科在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元左右的雲終端作為客戶機,大大減少客戶機的硬體投入,拉平在伺服器上的硬體投入,使得總投資更加合理。
VDI虛擬桌面基礎架構
虛擬桌面基礎架構(Virtual Desktop Infrastructure,簡稱VDI)是許多機構目前正在評估的全新模式,它是基於早期的RDP協定和瘦客戶機逐步演變而來的,也是目前國外VMware等國外虛擬化廠家長期鼓吹的模式。VDI旨在為智慧型分散式計算帶來出色的回響能力和定製化的用戶體驗,並通過基於伺服器的模式提供管理和安全優勢。它能夠為整個桌面映像提供集中化的管理,但這一模式目前也存在著其固有的問題。主要表現為:因其利用硬體仿真及瘦協定,使得視頻、Adobe Flash、IP 語音(VoIP)以及其它計算或圖形密集型套用不適用於該模式,而且VDI 需要持久的網路連線,因此不適於要求離線移動性的場合。此外,其基於伺服器的模式對伺服器的配置有極高的要求,這些問題的存在不能不讓眾多的用戶重新考慮部署VDI的實際意義及成本。 從實際套用方面來分析,VDI模式還存在諸多需要解決的問題,而與之相關的虛擬化桌面,如遠程託管桌面、遠程虛擬應用程式、遠程託管專用虛擬桌面、本地虛擬應用程式及本地虛擬作業系統等虛擬化桌面也都存在著各種問題;另外還有對終端硬體的支持問題、對網路及伺服器硬體過度依賴的問題、以及數據安全性問題等。
VOI虛擬作業系統基礎架構
虛擬作業系統基礎架構(Virtual OS Infrastructure,簡稱VOI)成為一個新的桌面虛擬化發展方向。而在國內,和信最早推出了基於VOI桌面虛擬化架構的虛擬終端管理系統。VOI桌面虛擬化技術不僅可實現基於服務端的遠程虛擬OS、APPS、UserProfiles的按需交付,也可實現基於客戶端的本地快取OS、APP及UserProfiles,這樣不僅僅可利用終端本地資源處理計算及圖形密集型套用,比如:如音視頻、大型設計及工業軟體等,也可支持各種計算機外設以適應複雜的套用環境及未來的套用擴展。同時,對網路和伺服器的依賴性將大大降低,即使網路中斷或伺服器宕機終端也可繼續使用,數據可實現雲端集中存儲,也可實現終端本地加密存儲,且終端套用數據不會因網路或服務端故障而丟失。
虛擬桌面架構
虛擬桌面整體架構分為以下四層:
l 終端接入層
用戶的終端處於這個層面,虛擬桌面可以接受各種終端的接入。
l 接入網路層
接入網路層負責保證用戶安全接入,並且為桌面雲資源提供負載均衡。
l 桌面管理層
桌面管理層負責整個虛擬桌面系統的調度,如新虛擬桌面的註冊及將虛擬桌面的請求指向可用的系統,認證用戶身份並為其授權可以使用的桌面,除此之外桌面管理層本身也承擔負載均衡的作用。
l 資源池層
資源池層負責對計算資源池、存儲資源池、網路資源池的統一管理,按需分配部署、資源動態調度等。
CreateDesktop
在 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());
HDESK hNew = CreateDesktopA("Test", NULL, NULL, NULL, GENERIC_ALL, NULL);
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