零成本 VDI 方案:用開源技術釋放 RTX 顯示卡的遠端 3D 戰鬥力
在當今企業數位轉型的藍圖中,虛擬桌面基礎架構(Virtual Desktop Infrastructure, VDI)早已不是新鮮事。透過將運算資源集中於伺服器端,企業得以實現極高的維運彈性與資安防護,讓員工能隨時隨地透過輕量化裝置接入工作環境。然而,當我們試圖將這套架構推向更高階的專業領域——如運作 NVIDIA Isaac Sim 進行複雜的機器人數位孿生模擬時,傳統 VDI 卻往往顯得力不從心。
核心的挑戰在於「延遲」與「渲染保真度」之間的矛盾。傳統的遠端桌面協定主要針對靜態畫面或文書處理優化,一旦進入高負載的 3D 場景,畫面的更新率(FPS)便會急遽下降,導致操作感產生嚴重的滯後,這對於需要精確物理反應的 3D 開發環境來說是致命傷。此外,商業級的 GPU 虛擬化解決方案通常伴隨著高昂的軟體授權成本,這不僅提高了進入門檻,也讓預算有限的技術團隊在追求效能與成本效益之間陷入兩難。如何在不依賴封閉式昂貴軟體的前提下,完整釋放 RTX GPU 的硬體實力,已成為開發者在建構高效能 VDI 環境時最亟待突破的技術瓶頸。
面對高昂授權與效能損耗的雙重枷鎖,技術社群給出了一個令人振奮的答案:將原先為極致遊戲體驗而生的串流技術,轉化為生產力強大的 VDI 解決方案。Sunshine 作為一款開源的 Gamestream 伺服器主機,其核心價值在於它能跨越硬體廠牌的限制,直接讀取 GPU 的幀緩衝(Frame Buffer)並進行極低延遲的編碼編譯;而與其對應的 Moonlight 則是輕量化的接收端客戶端,兩者結合後,能將伺服器端強大的 RTX GPU 運算力,透過幾乎無損的畫質即時傳輸到使用者的螢幕上。
這套方案的導入利基點,首要在於它徹底擺脫了商業 VDI 軟體對特定驅動程式或訂閱制的依賴,讓技術團隊能將寶貴的預算直接投入在更高效能的硬體採購上。更重要的是,由於其底層採用了高效能的視訊串流協定,在處理如 Isaac Sim 這類高頻率更新的 3D 環境時,其反應速度與畫面流暢度往往超越了傳統的遠端協作工具。這不僅讓遠端操作 3D 模擬環境變得如同本機運作般順滑,也為企業在建構高彈性的技術開發平台時,提供了一條兼具效能與經濟效益的全新路徑。
為了深耕 NVIDIA Omniverse 旗下的 Isaac Sim 機器人模擬平台,實作環境的穩定性與硬體吞吐量是首要考量。在硬體選擇上,搭載 16GB 視訊記憶體的 RTX 4070 Ti 成為了理想的核心,其 Ada Lovelace 架構不僅能支撐複雜的即時光線追蹤運算,足夠的記憶體容量更是運行大規模數位孿生場景的門票。然而,為了發揮硬體的最大價值並兼顧開發環境的靈活性,我們並未採取傳統的單機佈署,而是選擇在基礎底層安裝了最新的 Proxmox VE (PVE) v9.1.1 虛擬化系統。
技術實作的核心在於「GPU 直通」(PCI Passthrough)技術。透過修改 PVE 的內核參數與 IOMMU 設定,我們成功將這塊 RTX 4070 Ti 繞過宿主機,以物理層級的性能無損地分配給一台運行 Ubuntu Desktop 22.04 的虛擬機器(VM)。這種做法的優勢在於:在維持 VM 輕量化與快照備份彈性的同時,讓 Linux 開發環境能夠直接調用顯卡的 CUDA 核心與視訊編碼引擎。這不僅為隨後安裝的 Sunshine 串流服務提供了硬體加速的肥沃土壤,也確保了 Isaac Sim 在模擬高物理精確度的機器人任務時,能擁有與原生系統無異的運算效能。
在理論架構轉化為實際環境的過程中,挑戰接踵而至。首先面臨的是底層環境的細膩調校,這包含了主機端 BIOS 的深度配置,必須確保 CPU 的虛擬化技術(VT-x/AMD-V)與中斷重導向(Interrupt Remapping)功能被正確啟動。此外,在 PVE 宿主機層級,為了徹底釋放 GPU 資源,我們必須處理核心參數與驅動黑名單(Blacklisting)的複雜設定,這如同在數位地基上進行精準的微調,稍有偏差便無法完成 PCIe 設備的乾淨分配。
然而,真正的瓶頸出現在虛擬機器(VM)內部的圖形驅動表現。我們在 Ubuntu 22.04 環境下遇到了令人困惑的現象:透過 VNC 或 Spice 接入桌面時,基本的 NVIDIA 運算雖然顯示正常,但一旦進入高強度的 Isaac Sim 模擬場景,系統穩定性便開始瓦解。
最棘手的狀況發生在執行 Omniverse Explorer 範本時,系統會無預警崩潰並退回登入畫面。在嘗試切換不同版本的驅動程式(從開源的 nvidia-driver-open 到非 open 的專有版本)後,問題甚至更趨複雜——有時導致 nvidia-smi 完全偵測不到硬體,有時則是雖然能偵測到顯卡,但啟動 Isaac Sim 後畫面卻陷入無限的「RTX Loading 0%」或是毫無反應的灰色視窗。更詭異的是,這些崩潰現象似乎與解析度設定有著莫名的關聯:
在極低解析度下(1024x768)尚能勉強運作,但只要切換回主流的 1080p 規格,系統平衡便會瞬間瓦解。這顯示了在 VDI 架構中,傳統遠端協定與高階繪圖驅動之間存在著深層的通訊矛盾,迫使我們必須尋找更底層的解決方案。
在經歷多次環境重建與測試後,我們鎖定了最穩定的軟體組合:選用 nvidia-driver-550-open 作為核心驅動(註:目前主流穩定版本為 550,580 則多為開發測試版)。這項決定的背後,是為了確保 GPU 直通後的內核溝通能保持透明且高效。
然而,單純安裝驅動並不足以解決問題,真正的關鍵在於「排除干擾源」。我們必須在 PVE 的虛擬硬體配置中,將原本的顯示卡類型從預設值調整為「無(None)」,並在 Ubuntu 系統層級徹底停用 Wayland 協定。這些動作雖然會導致傳統的網頁控制台(Console)或 Spice 視窗失效,但卻能強迫作業系統將繪圖資源百分之百傾注於物理 GPU 設備上。
以下是我們的具體調整操作:
主要修改顯示卡直通 (PCI Device)
另外是顯示器設定 (Display)
首先要核心系統環境 (GDM 與 Wayland),主要任務是確保 NVIDIA 驅動能順利接管顯示輸出。編輯 /etc/gdm3/custom.conf 設定檔,關閉 Wayland (取消註解),並開啟自動登入(避開登入畫面黑屏)。
再來是編輯設定檔:sudo nano /etc/X11/xorg.conf,設定 Xorg 虛擬螢幕配置 (1080p),此目的是確保 NVIDIA 顯卡在沒有實體螢幕時,依然能「生出」一個 1080p 的畫布。
為了模擬真實的顯示輸出,我們前面配置了虛擬螢幕描述檔(Virtual Display configuration),讓系統即便在未連接實體螢幕的情況下,也能識別出正確的 EDID 資訊。完成這些底層變更後,我們轉而透過 SSH 遠端連線進行最後的軟體佈署。重新開機後將無法使用 console 或 spice 登入 GUI,只能透過 sunshine 搭配 moonlight 登入 GUI。
重新啟動 VM 後用 ssh 登入,下載 sunshine-ubuntu-22.04-amd64.deb 安裝包並完成安裝。執行 setcap 與 loginctl 賦予使用者啟用 user systemctl 的權限,並以 user mode 啟用 sunshine 服務:
|
|
接下來,在操作端用瀏覽器連線 VM ( HTTPS port 47990) 並完成網頁介面設定 :
|
提示: |
先到如下網址下載與安裝 moonlight:
https://github.com/moonlight-stream/moonlight-qt/releases
為了避免滑鼠更為流暢,修改 Moonlight 設定:
然後再嘗試連線 VM IP,若需要重設 PIN 請在瀏覽器完成:
硬體層面(BIOS/PVE Host)已經過關。崩潰極大機率是 Ubuntu 桌面環境 (GNOME/X11) 無法處理從虛擬螢幕切換到物理 GPU 渲染時的像素緩存溢出。主要壓力在於 VRAM (顯存) 和 Xorg 的 Framebuffer 緩存:
安裝 Sunshine 這種專門為高效能 GPU 設計的串流工具通常能解決 90% 在 VM 跑 Omniverse 遇到的桌面崩潰問題。
問題高度集中在:當解析度提高到 1920x1080 時,Ubuntu 的 Xorg 桌面環境無法正確處理 RTX 5070 Ti 拋出的渲染數據。透過 PVE 網頁介面的 noVNC 或 SPICE 視窗來操作 Ubuntu 桌面,這極大機率就是崩潰的原因。虛擬顯卡驅動在處理「高解析度 + 硬體加速 3D」時非常脆弱。
安裝 Sunshine (Host) 與 Moonlight (Client):這是目前 NVIDIA GPU 串流最穩定的方案:
在 VM 內安裝 Sunshine,然後從你的實體機(Windows 或 Mac)用 Moonlight 連進去。
它會繞過 PVE 簡陋的虛擬顯示協議,直接擷取 RTX 5070 Ti 的 Framebuffer,通常能完美支援 1080p 甚至 4K 運作 Omniverse。
如下影片是我們透過 moonlight 遠端連線到 sunshine 執行 issacm-smi 的實際效果:
https://drive.google.com/file/d/1yz7TJH29xmGhMtXoPmrzmv2DGOZWCGdO/view?usp=sharing
從畫面中,我們可以看到一個非常流暢的 3D Play 效果,但這是運行在遠端的 GPU 上面的。
--- END ---