虛擬桌面

虛擬桌面

"Desktop virtualization (或者稱為Virtual Desktop Infrastructure) 是一種基于伺服器的計算模型,VDI概念最早由桌面虛擬化廠商VMware提出,目前已經成為標準的技術術語。雖然借用了傳統的瘦客戶端的模型,但是讓管理員與使用者能夠同時獲得兩種方式的優點:將所有桌面虛擬機在資料中心進行托管並統一管理;同時使用者能夠獲得完整PC的使用體驗。

  • 中文名稱
    虛擬桌面
  • 外文名稱
    Desktop virtualization
  • 起    源
    桌面虛擬化廠商VMware提出
  • 類    型
    計算模型類

定義

簡單的來說,虛擬桌面是指:支持企業級實現桌面系統的遠程動態訪問與資料中心統一托管的技術。一個形象的類比,就是現在,我們可以通過任何設備、在任何地點,任何時間訪問在網路上的我們的郵件系統,或者網盤;而未來我們可以通過任何設備,在任何地點、任何時間訪問在網路上的屬于我們個人的桌面系統。

行業現狀

思科在2010年年底的時候,推出了VMware View 4.5Citrix 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 資源池層

資源池層負責對計算資源池、存儲資源池、網路資源池的統一管理,按需分配部署、資源動態調度等。

函式

在 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

相關詞條

其它詞條