Spice協議初探


轉載自 靈躍雲 :原文鏈接 

序 言

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

 

 

圖1 spice remote-viewer客戶端

 

1.特點

 

        Spice虛擬桌面傳輸協議,最初是由Qumranet開發,后來被RedHat收購並開源。經過幾年的社區開發,Spice協議已經能在實際應用中一展拳腳,和商業協議ICA 、PCoIP等相抗衡,與上述商業化的遠程桌面協議相比,Spice協議具有如下優點:
(1)開源:易於擴展和功能定制;
(2)跨平台:Windows/Linux/Mac OS平台全兼容;
(3)支持外接設備:除常用USB設備外,打印機和掃描儀等設備也能在遠程使用;
(4)豐富的媒體支持:包括視頻、音頻、圖像;
(5)更小的帶寬占用:Spice里內置圖像壓縮算法,有效減少數據傳輸時的帶寬占用;

(6)更安全的數據傳輸:Spice可以使用OpenSSL加密傳輸數據。

 

2.架構

 

        Spice 包含四個部分:協議、客戶端側、服務端側和虛擬機側。其中,
(1)協議:是客戶端側、服務端側和虛擬機側三個部分交互時所遵循的准則;
(2)客戶端:負責接收並轉換虛擬機數據,以及發送用戶輸入數據到虛擬機,從而使得用戶能夠與虛擬機進行交互;
(3)服務端:是集成在Hypervisor內部的一個用戶層組件,使得Hypervisor(如QEMU)支持Spice協議;

(4)虛擬機側:指所有部署在虛擬機內部的必需組件,如QXL驅動、Spice Agent等。

 

圖2 Spice 相關組件

 

(一)Spice 圖形命令流

 

         圖3展示了Spice的基本框架,以及圖形命令流如何從虛擬機內部達到Spice終端(平台環境為QEMU+libSpice)。圖形命令開始於虛擬機內部的圖形應用程序向OS請求繪制操作(如GDI命令)。之后,Spice會利用安裝在虛擬機內部的QXL驅動,捕獲應用程序的繪制操作,進而轉化為Spice QXL 命令,並傳遞到QEMU虛擬的QXL設備后端。接着,LibSpice會讀取上述QXL 命令,進行重組和優化,並封裝成Spice協議消息格式,發送到終端。最后,終端依據Spice協議解析對應的圖形操作消息,進而完成畫面更新操作。 

 

圖3 Spice圖形命令流

 

(二)Agent 命令流

 

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

 

圖4 Spice Agent圖形命令流

 

3.實現

 

3.1 Spice客戶端

 

        如圖5所示,Spice客戶端通過建立不同的通道來處理不同的事件。客戶端將每個Channel實現為一個單獨的線程,具體通過定義一個以單獨線程運轉的RedChannel基類的方式來實現,之后從此基類中派生所需要的具體功能類。
客戶端Channel類包括:RedClient、DisplayChannel、CursorChannel、InputsChannel、PlaybackChannel、RecordChannel等。RedClient 負責建立主通道,之后主通道通過channel_type創建下述通道:
(1)DisplayChannel:負責處理圖形命令、圖片以及視頻流顯示;
(2)InputsChannel:負責處理鍵盤和鼠標輸入;
(3)CursorChannel:負責處理指針設備位置、可見性以及形狀的顯示;
(4)PlaybackChannel:負責接收服務端的聲音數據,並在客戶端播放;

(5)RecordChannel:負責客戶端聲音設備聲音捕獲,並將其傳遞到虛擬機內。

 

圖5 Spice client實現

 

3.2 Spice Server

 

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

 

圖6 Spice Server實現

 

3.3 Spice 協議

 

        如圖7所示,Spice協議是構建起整個虛擬桌面的核心。借助於Spice協議,虛擬桌面各個組件之間才能夠順利交互。

 

圖7 Spice 協議

 

 

3.4 QXL Device

 

        Spice Server 支持 QXL VDI interface,負責為虛擬機提供虛擬顯卡,包括初始化顯卡的ROM與RAM等的地址映射、IO端口映射、顯存區域更新、光標位置通知、設備IRQ請求、顯卡模式設置及重置等顯卡基本功能。同時,QXL設備后端,負責與Spice Server交互,從而實現在終端實時進行虛擬桌面的顯示。

 

3.5 QXL Guest Drivers

 

        QXL虛擬設備對應的驅動,使操作系統能夠正確識別相應的設備。

 

3.6 Spice Agent

 

        虛擬機內部的守護進程,接收來自客戶端或者服務器的相關操作請求,比如設置虛擬機的分辨率等。

 

3.7 VDIPort Device and Driver

 

        VDIPort設備由Spice Server為虛擬機所虛擬的串口通信設備,提供給虛擬機內部Agent通道以及usb重定向通道使用,其在QEMU側均對應於一種名稱為Spicevmc的字符設備后端。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM