序 言
SPICE,即Simple Protocol for Independent Computing Environment(獨立計算環(huán)境簡單協(xié)議)是紅帽企業(yè)虛擬化桌面版的主要技術組件之一,具有自適應能力的遠程提交協(xié)議,能夠提供與物理桌面完全相同的最終用戶體驗。靈躍桌面云借助支持SPICE協(xié)議的客戶端(如remote-viewer)或者通過瀏覽器,用戶可以訪問自己的虛擬桌面,如下圖1所示

1.特點
Spice虛擬桌面?zhèn)鬏攨f(xié)議,最初是由Qumranet開發(fā),后來被RedHat收購并開源。經(jīng)過幾年的社區(qū)開發(fā),Spice協(xié)議已經(jīng)能在實際應用中一展拳腳,和商業(yè)協(xié)議ICA 、PCoIP等相抗衡,與上述商業(yè)化的遠程桌面協(xié)議相比,Spice協(xié)議具有如下優(yōu)點:
(1)開源:易于擴展和功能定制;
(2)跨平臺:Windows/Linux/Mac OS平臺全兼容;
(3)支持外接設備:除常用USB設備外,打印機和掃描儀等設備也能在遠程使用;
(4)豐富的媒體支持:包括視頻、音頻、圖像;
(5)更小的帶寬占用:Spice里內(nèi)置圖像壓縮算法,有效減少數(shù)據(jù)傳輸時的帶寬占用;
(6)更安全的數(shù)據(jù)傳輸:Spice可以使用OpenSSL加密傳輸數(shù)據(jù)。
2.架構(gòu)
Spice 包含四個部分:協(xié)議、客戶端側(cè)、服務端側(cè)和虛擬機側(cè)。其中,
(1)協(xié)議:是客戶端側(cè)、服務端側(cè)和虛擬機側(cè)三個部分交互時所遵循的準則;
(2)客戶端:負責接收并轉(zhuǎn)換虛擬機數(shù)據(jù),以及發(fā)送用戶輸入數(shù)據(jù)到虛擬機,從而使得用戶能夠與虛擬機進行交互;
(3)服務端:是集成在Hypervisor內(nèi)部的一個用戶層組件,使得Hypervisor(如QEMU)支持Spice協(xié)議;
(4)虛擬機側(cè):指所有部署在虛擬機內(nèi)部的必需組件,如QXL驅(qū)動、Spice Agent等。

(一)Spice 圖形命令流
圖3展示了Spice的基本框架,以及圖形命令流如何從虛擬機內(nèi)部達到Spice終端(平臺環(huán)境為QEMU+libSpice)。圖形命令開始于虛擬機內(nèi)部的圖形應用程序向OS請求繪制操作(如GDI命令)。之后,Spice會利用安裝在虛擬機內(nèi)部的QXL驅(qū)動,捕獲應用程序的繪制操作,進而轉(zhuǎn)化為Spice QXL 命令,并傳遞到QEMU虛擬的QXL設備后端。接著,LibSpice會讀取上述QXL 命令,進行重組和優(yōu)化,并封裝成Spice協(xié)議消息格式,發(fā)送到終端。最后,終端依據(jù)Spice協(xié)議解析對應的圖形操作消息,進而完成畫面更新操作。

(二)Agent 命令流
如圖4所示,為Spice Agent對應的命令交互流程,Spice Agent位于虛擬機內(nèi)部。Spice Server 和 client 借助Agent在虛擬機內(nèi)部執(zhí)行一系列動作,如設置虛擬機顯示配置等。Spice Agent通過位于虛擬機內(nèi)部的VDIPort設備驅(qū)動與VDIPort設備(由QEMU 虛擬的設備)進行交互,VDIPort虛擬設備與Spice Server通過QEMU 的VDI Interface 進行交互,從而最終實現(xiàn)Spice Agent與Spice Server以及Spice Client三者之間的交互,其中消息格式均遵從Spice協(xié)議。

3.實現(xiàn)
3.1 Spice客戶端
如圖5所示,Spice客戶端通過建立不同的通道來處理不同的事件??蛻舳藢⒚總€Channel實現(xiàn)為一個單獨的線程,具體通過定義一個以單獨線程運轉(zhuǎn)的RedChannel基類的方式來實現(xiàn),之后從此基類中派生所需要的具體功能類。
客戶端Channel類包括:RedClient、DisplayChannel、CursorChannel、InputsChannel、PlaybackChannel、RecordChannel等。RedClient 負責建立主通道,之后主通道通過channel_type創(chuàng)建下述通道:
(1)DisplayChannel:負責處理圖形命令、圖片以及視頻流顯示;
(2)InputsChannel:負責處理鍵盤和鼠標輸入;
(3)CursorChannel:負責處理指針設備位置、可見性以及形狀的顯示;
(4)PlaybackChannel:負責接收服務端的聲音數(shù)據(jù),并在客戶端播放;
(5)RecordChannel:負責客戶端聲音設備聲音捕獲,并將其傳遞到虛擬機內(nèi)。

3.2 Spice Server
如圖6所示,Spice Server內(nèi)部對應于client,也存在若干個通道。這些通道主要負責向虛擬機的虛擬設備(如鍵盤鼠標等)傳遞客戶端側(cè)用戶的輸入,以及接收并顯示虛擬機虛擬顯卡對應的畫面(QXL)。為了使得Spice Server能夠相對獨立,其借助QEMU提供的各種虛擬設備后端接口來與虛擬機所見的虛擬設備進行交互,如Playback Interface等。

3.3 Spice 協(xié)議
如圖7所示,Spice協(xié)議是構(gòu)建起整個虛擬桌面的核心。借助于Spice協(xié)議,虛擬桌面各個組件之間才能夠順利交互。

3.4 QXL Device
Spice Server 支持 QXL VDI interface,負責為虛擬機提供虛擬顯卡,包括初始化顯卡的ROM與RAM等的地址映射、IO端口映射、顯存區(qū)域更新、光標位置通知、設備IRQ請求、顯卡模式設置及重置等顯卡基本功能。同時,QXL設備后端,負責與Spice Server交互,從而實現(xiàn)在終端實時進行虛擬桌面的顯示。
3.5 QXL Guest Drivers
QXL虛擬設備對應的驅(qū)動,使操作系統(tǒng)能夠正確識別相應的設備。
3.6 Spice Agent
虛擬機內(nèi)部的守護進程,接收來自客戶端或者服務器的相關操作請求,比如設置虛擬機的分辨率等。
3.7 VDIPort Device and Driver
VDIPort設備由Spice Server為虛擬機所虛擬的串口通信設備,提供給虛擬機內(nèi)部Agent通道以及usb重定向通道使用,其在QEMU側(cè)均對應于一種名稱為Spicevmc的字符設備后端。
本文轉(zhuǎn)載于 靈躍云 : 原文鏈接