玩轉 Linux VDA 之服務架構解析

2022 October 31

Citrix Virtual Desktops 技術不僅支援 Windows 虛擬桌面發佈,也同樣支援 Linux 虛擬桌面發佈。由於 Linux 系統在研發設計領域的優勢,現在越來越多的用戶將 Linux工作站遷移到雲端開始使用 Linux 虛擬桌面。

Citrix Linux VDA 產品經過不斷更新完善,用戶可以通過多樣化的發佈方式滿足 Linux 桌面的快速製備以及高效的維運管理。Citrix 支援 Linux 單機發佈Remote PC 實體機發佈通過 PVS 或 MCS 技術批次發佈,以及 Linux 虛擬應用發佈

本文的目的是説明大家理解 Linux VDA 產品的服務架構以及各子服務之間是如何協同運作的。
我們可以借助如下 Linux VDA 邏輯架構圖,更加深入的理解Linux VDA產品:


1.   ConfDB

我們需要知道,Linux 本身並沒有註冊表的概念,但是為了與 Windows VDA 保持管理上的一致性,Linux VDA 引入了註冊表的容器以保存 VDA 設定資訊。
Linux VDA 在安裝設定過程中創建基於 Postgresql 資料庫的 ConfDB 來存放註冊表資訊。
使用者可以通過我們提供的命令列介面 ctxreg 查看修改註冊表資訊,而無需通過 PSQL 命令操作Postgresql 資料庫:

/opt/Citrix/VDA/bin/ctxreg  
•        Usage: create -k<Key> -v<value>  -t<type> -d[data] /*創建鍵值*/
•        Usage: delete -k<Key> -v<value> /*刪除鍵值*/
•        Usage: dump -k[Key] /*查詢鍵值*/

比如通過 Ctxreg 命令查詢 VDA 上設定的 DDC 清單

Linux VDA 上所獲取的 Citrix 策略設定結果也會通過註冊表的形式保存在 ConfDB 中,我們可以通過上述註冊表查詢命令來驗證或者排查 Citrix 策略的應用情況。這裡需要說明的是並非所有的 DDC 策略都對Linux VDA 適用,所以遇到策略下發異常的問題,我們要先確認該策略是否支持 Linux,然後再檢查相關設定資訊是否成功寫入 VDA 的註冊表鍵值。
當然也會有一些策略只支持 Linux 而無法應用在 Windows 端。例如,如下策略僅適用於 Linux VDA 來控制剪貼板的策略。

Citrix 管理員在部署策略時需要仔細閱讀 Citrix 相關 Edoc 檔案以及 Studio 中策略設定的詳細描述資訊以確保策略與 VDA 類型匹配。

Linux VDA 策略支援清單請參考如下連結:https://docs.citrix.com/en-us/linux-virtual-delivery-agent/current-release/configure/policy-support-list.html


2.   CtxjproxyCtxvda服務

Windows VDA 通過 Citrix Desktop Service (Brokeragent.exe) 來與 DDC 通訊完成 VDA 到 DDC 上的註冊工作,承接 DDC 的會話分發,同時與 DDC 交互 Citrix HDX 會話狀態、會話參數(連接時長、用戶端資訊等)。
在 Linux VDA 中 BrokerAgent 的角色由一對服務 Ctxjproxy 和 Ctxvda 共同來承載。Ctxvda 服務基於 DotNet 開發,其依賴于 Linux VDA 設定時安裝的 DotNet Runtime 庫。
Ctxjproxy 服務基於 Java 開發,其作為 Proxy 與 DDC 交互並完成 Broker 消息的安全傳遞,消息路徑變成 Ctxvda ->  Ctxjproxy ->  DDC Broker Service


3.   HDX

Ctxhdx 是 Linux VDA 最核心的服務,HDX 服務負責 ICA 會話整個生命週期的管理:
•會話的連接監聽
•與 Ctxvda 服務交互 ICA 會話狀態資訊
•提供會話狀態查詢介面
•提供會話狀態控制介面,包括會話強制斷連、註銷
•會話連接的 ACL 准入控制
•為每個會話初始化一個 Ctxgfx 進程以創建會話


4.   Xorg 和 Ctxgfx

Linux 系統本身是沒有圖形介面的,它不像 Windows 系統的圖形介面在系統內核中就實現了。Linux 系統需要額外安裝桌面系統軟體來顯示圖形介面,如 X Window
X Window 提供視窗系統服務(採用 Client/Server 服務架構):其中 Xorg 提供了X服務端 (X Server) 來接收鍵盤滑鼠輸入並負責螢幕視窗的輸出回應;而顯示管理器 Display Manager、視窗管理器 Window Manager 以及圖形應用程式集合起來構成一個完整的 Linux 桌面環境,即 X Window的用戶端(X Client)。Linux VDA 支援的桌面環境有 MATE、GNOME、GNOME Classic、KDE (僅RHEL)
關於Linux VDA支持的 Linux 版本與 Xorg 版本的對應關係,可以參考Citrix官方資料https://docs.citrix.com/zh-cn/linux-virtual-delivery-agent/current-release/system-requirements.html

Ctxgfx 服務託管 ICA 的圖像虛擬通道,負責 ICA 會話中 VDA 到用戶端的圖像畫面傳輸。Ctxhdx 服務會在會話建立時基於每個會話創建 Ctxgfx 進程。
Ctxgfx 會從 X Server 中獲取系統正在渲染畫面並通過 Thinwire 協定編碼後發送給 Citrix Workspace App。同時 Ctxgfx 會鍵盤滑鼠資料以及終端會話的顯示大小和顯示器的 layout 資訊發送給 X Server。在會話建立過程中,Ctxgfx 會創建 Ctxlogin 進程,用於使用者登錄認證以及準備桌面環境(如Gnome或者KDE)。


5.   Ctxlogin

Ctxlogin 進程由 Ctxgfx 進程創建,其主要負責
•用戶在 ICA 會話的登錄認證(PAM認證)
•創建 X session (X Session 中會啟動音訊、剪切板等重定向服務)
•為每個 X Session 初始化 Gnome 桌面環境
•會話斷開後的自動重連功能。如果自動重連無法完成,Ctxlogin 會給用戶展示會話重連對話方塊
•在用戶登出時結束所有使用者進程並銷毀使用者桌面環境(如 Gnome 或者 KDE


6.   Ctxusbsd 和 Ctxvhcid 服務

開源的 VHCI 可以在 IP 網路上形成一個通用的 USB 設備共用系統以控制 USB 設備的識別、資料傳輸等。它由 Linux 內核驅動程式和一些 User Mode 的函式程式庫組成,這些庫可以與系統內核驅動程式通信以獲取所有 USB 資料。Citrix USB 服務作為一個 Citrix 模組,承載 USB 虛擬通道,管理 USB 設備上的所有虛擬化和資料傳輸工作。Citrix VHCI 服務是 Citrix 提供的與 VHCI 內核模組通信的開源服務,充當 VHCI 和 Citrix USB 服務之間的閘道。另外,USB 設備重定向依賴於 VHCI 內核模組 (usb-vhci-hcd.ko 和usb-vhci-iocif.ko),當 VDA 安裝包中自帶的這兩個模組版本和 Linux 系統版本不一致時,我們需要重新編譯,具體方法可以參考官方資料:https://docs.citrix.com/en-us/linux-virtual-delivery-agent/1912-ltsr/configuration/configure-usb-redirection.html#build-the-vhci-kernel-module

總結:ICA會話創建流程

在理解了上述的概念之後,我們可以來梳理用戶登錄 Linux 桌面並創建 ICA 會話的過程。
1、Linux VDA 首先要通過 Ctxvda 和 Ctxjproxy 服務與 DDC 完成註冊。
2、當使用者申請會話時,Ctxvda 服務會回應 DDC 的會話準備請求,Ctxhdx 服務監聽 ICA 連接請求。
3、當用戶會話接入,Ctxhdx 創建 Ctxgfx 進程來傳輸使用者會話的圖像,此時使用者端已經可以看到Linux 機器的運行畫面。
4、Ctxgfx 創建 Ctxlogin 進程完成使用者認證。在使用者登錄過程中,VDA 通過 Ctxpolicyd 服務獲取 DDC 下發的策略並將策略設定以註冊表的形式貯存於 ConfDB。同時,Ctxlogin 服務創建 X Session 並載入相應的 ICA 虛擬通道並在 Linux 系統上創建使用者桌面環境。
5、之後,每一個會話中的音訊、剪切板等功能所對應的 Ctxaudio 和 Ctxclipoard 服務進程也會運行起來以提供良好的用戶交互體驗。
6、使用者 ICA 會話建立完成 Ctxhdx 服務會將會話狀況、連接資訊、用戶端資訊等內容傳遞給 Ctxvda,並通過 Ctxjproxy 發送到 DDC 端寫入資料庫。

返回